From 3a341dbe0b24fad568ac41a388f7920240d93970 Mon Sep 17 00:00:00 2001 From: treeform Date: Sun, 22 Nov 2020 12:12:53 -0800 Subject: [PATCH] Fixed green. --- src/pixie/images.nim | 52 ++++++++++++++------ tests/images/centerRotation.master.png | Bin 0 -> 900 bytes tests/images/centerRotation.png | Bin 0 -> 1495 bytes tests/images/centerRotationWhite.master.png | Bin 0 -> 932 bytes tests/images/centerRotationWhite.png | Bin 0 -> 1678 bytes tests/images/drawFast1Rot.png | Bin 346 -> 343 bytes tests/images/drawFast3.png | Bin 358 -> 352 bytes tests/images/transCompose.c.png | Bin 0 -> 1495 bytes tests/images/transCompose.png | Bin 0 -> 1679 bytes tests/test_images.nim | 41 +++++++++++++++ 10 files changed, 77 insertions(+), 16 deletions(-) create mode 100644 tests/images/centerRotation.master.png create mode 100644 tests/images/centerRotation.png create mode 100644 tests/images/centerRotationWhite.master.png create mode 100644 tests/images/centerRotationWhite.png create mode 100644 tests/images/transCompose.c.png create mode 100644 tests/images/transCompose.png diff --git a/src/pixie/images.nim b/src/pixie/images.nim index 1eb81a7..54b3543 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -22,6 +22,12 @@ proc `$`*(image: Image): string = ## Display the image size and channels. "" +proc fraction(v: float32): float32 = + ## Returns unsigned fraction part of the float. + ## -13.7868723 -> 0.7868723 + result = abs(v) + result = result - floor(result) + proc inside*(image: Image, x, y: int): bool {.inline.} = ## Returns true if (x, y) is inside the image. x >= 0 and x < image.width and @@ -29,8 +35,9 @@ proc inside*(image: Image, x, y: int): bool {.inline.} = proc inside1px*(image: Image, x, y: float): bool {.inline.} = ## Returns true if (x, y) is inside the image. - x >= -1 and x < (image.width.float32 + 1) and - y >= -1 and y < (image.height.float32 + 1) + const px = 1 + x >= -px and x < (image.width.float32 + px) and + y >= -px and y < (image.height.float32 + px) proc getRgbaUnsafe*(image: Image, x, y: int): ColorRGBA {.inline.} = ## Gets a color from (x, y) coordinates. @@ -116,22 +123,39 @@ func lerp(a, b: Color, v: float): Color {.inline.} = proc getRgbaSmooth*(image: Image, x, y: float64): ColorRGBA {.inline.} = ## Gets a pixel as (x, y) floats. - let - minX = floor(x).int - difX = (x - minX.float32) - minY = floor(y).int - difY = (y - minY.float32) - vX0Y0 = image[minX, minY].color() - vX1Y0 = image[minX + 1, minY].color() - vX0Y1 = image[minX, minY + 1].color() - vX1Y1 = image[minX + 1, minY + 1].color() + proc toAlphy(c: Color): Color = + result.r = c.r * c.a + result.g = c.g * c.a + result.b = c.b * c.a + result.a = c.a + + proc fromAlphy(c: Color): Color = + if c.a == 0: + return + result.r = c.r / c.a + result.g = c.g / c.a + result.b = c.b / c.a + result.a = c.a + + var + x = x # TODO: look at maybe +0.5 + y = y # TODO: look at maybe +0.5 + minX = x.floor.int + difX = x - x.floor + minY = y.floor.int + difY = y - y.floor + + vX0Y0 = image[minX, minY].color().toAlphy() + vX1Y0 = image[minX + 1, minY].color().toAlphy() + vX0Y1 = image[minX, minY + 1].color().toAlphy() + vX1Y1 = image[minX + 1, minY + 1].color().toAlphy() bottomMix = lerp(vX0Y0, vX1Y0, difX) topMix = lerp(vX0Y1, vX1Y1, difX) finalMix = lerp(bottomMix, topMix, difY) - return finalMix.rgba() + return finalMix.fromAlphy().rgba() proc hasEffect*(blendMode: BlendMode, rgba: ColorRGBA): bool = ## Returns true if applying rgba with current blend mode has effect. @@ -143,10 +167,6 @@ proc hasEffect*(blendMode: BlendMode, rgba: ColorRGBA): bool = else: rgba.a > 0 -proc fraction(v: float32): float32 = - result = abs(v) - result = result - floor(result) - proc drawFast1*(a: Image, b: Image, mat: Mat3): Image = ## Draws one image onto another using integer x,y offset with COPY. result = newImage(a.width, a.height) diff --git a/tests/images/centerRotation.master.png b/tests/images/centerRotation.master.png new file mode 100644 index 0000000000000000000000000000000000000000..70cf7756e85fff7d5afe698734776a71c5d3e7de GIT binary patch literal 900 zcmeAS@N?(olHy`uVBq!ia0vp^DIm``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49t?AE{-7;jBoD*<_QIgusx`s@Z*fo3%(nS zZye-$FSe-e5V_lU?1k|SXi}EbH zAL*`ppz_nf>K*IfH-=wV?LVm-Iq_Rlom*Y5cBexKkadTtFmjU*i1BLu%@!34R$m|^ zO2P9DYpuoA`zySsc`ILf6jJ|~?GsPD&>j9=#VhtJAKB{W_v%;np9zLjEBg2F*i10o z)^LAn5bNeub0oT?PAuG>Ke7MzuWYq%azanG_FwsW-RFF^Gt^7uyCErzU1MTxS0x?ZqgY8R@_ptkF?(;iJ&%|wR#r)~6{NG=_58L;y z_m9N-Zu1`;ta0q@Evc_9FO~0pzV@T=`tGfDiXS*PFqJ^+)4*F~vJi zg*{g6zkbzx)h~YL^k3GjLM`8CcIPc;oa+D4F;DEn0~=Of8~*v6zfUlkO`6rDRwo=J zzxN|=l+e5;wRP+>PHy_@nU@r6D0@c4Ir`F-#Ahh1YbB}KH=L}^KQ+IM|IB@ z=|m^W@7(_{4H&0?`hTpRzIJzg_=!5MSwGl?*73G(-l~_u)qw&s1nQWN32Te+7`<5o P%rp$1u6{1-oD!Mt+H@Hywxxz8DNl`~F&3#EtM-wC5uu?0x z$z>2n8yAdlJ5EM&Dswo^j?FiPRl3=)4#geP|Q z=!R7T6qmGAs%^84Kb0VYgcyOI04D>Yr}K9?6wx8mx=AGGc$sS$dJS<$U2Y992-Nkv zKz~w}|MFQpnUrt@-iL%c=qI6dt%`WqF z(ik&MC7j;eU)@+=uq>bpl196OfF>h_lR@4k6z90-Iq?KFiC0%}UqHsy>g-yw^Qp9_ z1-~8lSK2h&xb)O(lfSBp^S9r#l3D{LU9`+ePLqtxpyb3v#PUuG-A|4&t0RWa%!8xd z89uY%2i4nt14ut7evP%crSkmf_;; zcN0v~#w*_t#?HK-kkhCaYupEQt?SSESVEkXc~g{QS+U))m&O5d)3b!gY;R%8U3miU4FJx{r_AXjBVWRwn6_gZb0jWIU|m6gvhU?;zi zN|3I7iot}4J0Ec_VFQLCnZD*!iJ{05GA#@P^LxDg*3^#q;QooQ7&8hbpV*GK7uU37>Fnx zH>9$?#QBqdGmjF~iys~uL^ah?YGZjtcj*pdWqx3`SryAaJ=-q?xg#$EH68afnM;>Y zyWDjvpS=fhc-mBxQ8n>s0QRaVe^cBkS-yau`Q@BR9^19!d~^*!aqBgvp{KQ8EOQ^! zFq>K$*mY&bjVO*h!NJ1g#6p5Fvm@BD=*POX&MTJRxi>t2tm41qT=ogYw{1B-l*FdF zWs5tXXclq!n$@{^Tv^9Qnfcs^_VT82UK2VtN^P%xG~WsiuV?t(!j4s`_@#X`hxguH+;0EV0!&`u(%rsSxwT4{E!$B)sSpu9LPBioT%bODnEI|{A;??zK zm70FLmF;e9dj850_%) zN3a@2c7%4U=yDeXn%b12y4Evp4XHl6DRssbA+>?2D|+$gXuI%AQUo}4(1JaiaeJ3d zgQ7t@j3N!ca8MIzC;R51{`R<5bvRo_a)XzzH59OB-6F=gtOP{qfRTySigo4`B-~HP z!Ja)6^vua-F>gV!SLP$Lmc48&_ZsY^>ehho{_!sLq$_>Zb-Ev10+mc)@^kLt8NKG+ zi`N=OjTKHBJ@+(1(;gf6%EA3#Eit4LJ99!eYj7CcZuV_Jo=_3Y!(D9Ha?w0&7|8=7 J-T}i3{sY_Vzfb@G literal 0 HcmV?d00001 diff --git a/tests/images/centerRotationWhite.master.png b/tests/images/centerRotationWhite.master.png new file mode 100644 index 0000000000000000000000000000000000000000..2723c5543f95eb9e5540de5e175379573796704e GIT binary patch literal 932 zcmeAS@N?(olHy`uVBq!ia0vp^DIm``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&di49u3EE{-7;jBn=}`iD4*wCW!_-C}| z;`FVXC;c~UUb^l2wI9Mhe;6a8IyaW~hFsFTA`-T3m-%eY=mR#-48Pwq{(NqF4x^&? zy}CIw58s}7v$x*6y{{H=%pWZkq-JEemiQTu+D}XWn{`!6Udfx6lvHHA_=YGzM51-$D=ymAk z$E!lu0yBRVm%sB8`O6XM-)MKvf9Z@bGP9;A+!8ZVV|9K}%*vIS&9`!5lVV9y{crC@ z2mCu+x!UUH+lBZrR5;lL8MORkWVssOqj=hy)tTkm{TVF^OBCD_{(cp1n${%K`1QIU zM-^8a$Ey9M&nHX^GH?m_yLR@3>z}_(DiC%2y8YeT?{{loa{2By7Mb+;xBJIs>n7av zdolOYt0li)d&DYgJ$~3%;+)mhccq@Y{QJ(5qle1n3|L6^_#J{@7>JIb0&KKl!im3PAAb#jqbjx`;=WF+~ofVS}*6g=)s#?8& zSK^fw|9)}2T>DQ;>nOwi+E;t8-v8EGV%GoSTNd-5mM>xTz5lYm+eR(kK1G5jTBJyr z=hgc40@v<4)&MQ%dsJ^D{5pRcgW}vX%CpM$PK&&Ic_Ei$pF* z@6F}w#J{|pdtk9<0B8TS!*3>w>$R#pQ(>1azi%VzQ8Ib?x#CQVqP$i^PEYZ!4Y^ge zto`2)^Ud`kbhUq8*8!8ixV;q*LwEpn;# zGTx;M?r#{=ZdaQNU&`PrIwF@47FBQU>Dc!}_-TpU$*cGIf+r~dJL4+5?OHgqp8~7p zqt=|W)AL*9{Iysumlb}icK+~K>%am50}U1)F2-gjqL}}fpW6B+h-Gho0L)Yjp00i_ I>zopr0LgruxBvhE literal 0 HcmV?d00001 diff --git a/tests/images/centerRotationWhite.png b/tests/images/centerRotationWhite.png new file mode 100644 index 0000000000000000000000000000000000000000..1e1144e139d863cdf6240f0fc07c87bae6ef16e7 GIT binary patch literal 1678 zcmb7F{a4b58plkN7m-xNT|>oO30gM4KOS*;PwWc?>pGq)QNK_#M)zBhVbR z>sM}q;Q&$l6}2nv6ndo+oOLg7M2rBQhtqvc`y&s3$ zuT*THarck4-BWox6IWnYuklUIi7WAIQLnVTfu~LPPvvr;>Qz z7m2>dqVDzY$K8H54UhCsOL`*DStY!P6SaHib2Jl(#8Cz&#+9i>gW4OjwC*f`@*G94!eqq&*2{$Ip?;i6z!#?~HO~WWe zZ@j8oQA1&yxf3ph$#Q>O0_NED2j;Hd+t$~Jd5<)K{>x`m@kaVZzBJRg>DNHBJXh~7 zYKQM8Xul4&Qq^wNubse+>|11SuB=q66H8xD{Ev2L@;%aGtnZ@Q%gMV6XaW`htVkuQ%3|Xp_+JY3IJTb_91udlu%nQ{7mPj{Aoi9UFg1taa z>($IvNbZ78?2SQ7&tp%Ei`PPVEgk;Wh0VJ9vxgsu)!~`~GTArlAZ!!1~ReLg!{Wzj&rrDfT4z5k&jI7W?%1qz^mN7i!tp1fyH=sv2Ak>CO0;sYQM#~ksa$Y(3!!1;=XMM;vMY+Jn)6?V&il;Ht8u4ilV*Ox_Gds8GL`fl;ZV*00ZO9}U;qFB literal 0 HcmV?d00001 diff --git a/tests/images/drawFast1Rot.png b/tests/images/drawFast1Rot.png index d67e4bdec66e8610458149dfd0ceb1babc7da391..35cedb322b5aeee7ad616dbbdf51f191c527d243 100644 GIT binary patch delta 128 zcmcb`be(B}ikY0Ji(^Oys4y{?cw9~U(iQjJ@SEkanxflw z%XXK)mPzhw&+V`O!9Q7%QF*cgqmba`eLaTT-+%X-u=@Dc&^xH literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^DImG3mr(x0VX->rS(pY;>|i8+cB gtA#L;gxiD}`UUg8SXCyTN@f58Pgg&ebxsLQ0IZBX=l}o! delta 140 zcmaFB^o(hOikYsbi(^OyTrc`(G4h+Xv$S0k?O4Ua#L1M9{jT8L`Pu&q zrhh+EJ^SXGjj6M5w((5-Xsq;Xio*2cHs62m`F308TlI35o9{o*D!sOISADtPgxfOr n%m1iOOwgK`FO7t_#Xd7W>;EDY@l)js0}yz+`njxgN@xNAz@t+H@Hywxxz8DNl`~F&3#EtM-wC5uu?0x z$z>2n8yAdlJ5EM&Dswo^j?FiPRl3=)4#geP|Q z=!R7T6qmGAs%^84Kb0VYgcyOI04D>Yr}K9?6wx8mx=AGGc$sS$dJS<$U2Y992-Nkv zKz~w}|MFQpnUrt@-iL%c=qI6dt%`WqF z(ik&MC7j;eU)@+=uq>bpl196OfF>h_lR@4k6z90-Iq?KFiC0%}UqHsy>g-yw^Qp9_ z1-~8lSK2h&xb)O(lfSBp^S9r#l3D{LU9`+ePLqtxpyb3v#PUuG-A|4&t0RWa%!8xd z89uY%2i4nt14ut7evP%crSkmf_;; zcN0v~#w*_t#?HK-kkhCaYupEQt?SSESVEkXc~g{QS+U))m&O5d)3b!gY;R%8U3miU4FJx{r_AXjBVWRwn6_gZb0jWIU|m6gvhU?;zi zN|3I7iot}4J0Ec_VFQLCnZD*!iJ{05GA#@P^LxDg*3^#q;QooQ7&8hbpV*GK7uU37>Fnx zH>9$?#QBqdGmjF~iys~uL^ah?YGZjtcj*pdWqx3`SryAaJ=-q?xg#$EH68afnM;>Y zyWDjvpS=fhc-mBxQ8n>s0QRaVe^cBkS-yau`Q@BR9^19!d~^*!aqBgvp{KQ8EOQ^! zFq>K$*mY&bjVO*h!NJ1g#6p5Fvm@BD=*POX&MTJRxi>t2tm41qT=ogYw{1B-l*FdF zWs5tXXclq!n$@{^Tv^9Qnfcs^_VT82UK2VtN^P%xG~WsiuV?t(!j4s`_@#X`hxguH+;0EV0!&`u(%rsSxwT4{E!$B)sSpu9LPBioT%bODnEI|{A;??zK zm70FLmF;e9dj850_%) zN3a@2c7%4U=yDeXn%b12y4Evp4XHl6DRssbA+>?2D|+$gXuI%AQUo}4(1JaiaeJ3d zgQ7t@j3N!ca8MIzC;R51{`R<5bvRo_a)XzzH59OB-6F=gtOP{qfRTySigo4`B-~HP z!Ja)6^vua-F>gV!SLP$Lmc48&_ZsY^>ehho{_!sLq$_>Zb-Ev10+mc)@^kLt8NKG+ zi`N=OjTKHBJ@+(1(;gf6%EA3#Eit4LJ99!eYj7CcZuV_Jo=_3Y!(D9Ha?w0&7|8=7 J-T}i3{sY_Vzfb@G literal 0 HcmV?d00001 diff --git a/tests/images/transCompose.png b/tests/images/transCompose.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd4195b1fc269be1bffed121364445b34ab2153 GIT binary patch literal 1679 zcmb7F`&SZ%7snJ|kfH*bkCb9sn1X#ZQp5s5F&`0OT8Yc%(wzB<(#T*Uj}&umQdy>^ zVac=K%hZc%0U0=14WT<>;?1%jUyXV|{&pqefdp`GZ?k%Fmgm1QX zwgvzInqcN7KczP6GEJ#?_eb>wSO)*G`gm zY#i%#F@t^`a7Y0M$Isbciv;qy#fh!RH1QWowKK#d;A_obYo`Z1`TI-lKDQa)j>Q}= zufFLz8a2B1eC@gZ)_mIA%Fk)l`8RTh*M>C#{{H@Nj+XRYHa` zn15nCh?93mQ#+tRp9=T(XlvOS2NCx^g^pUZWSBIu%~#px_t-o!n6iY%H`GjpQqI8^ zr*?IEaQ39L9c(fRTg%5n_a}qF>?qX2(&5~%Igp zuPaS1h7^>m`X^NNLRU$hSy(VI_u&u4>zIR-=zzt~2lR00F9lbcLpAUncwfAvLcEb6 z>N#Z@mal-wn}@B{`-awE>=;6-|;H#i>Tv34x%w z`3T^p1&17i<9{E+Uq&*r)VK~7ne`0fJoi3}5>;NzqIw~zrW-wi``*U*JXkTPR_iq4 zflu9GKt6NzfoW%&%0NQ$Hf2jZvaafzSw&*Q?iSF^xiDi zZ%u(_rJl>W1+#~lhIjuz)4R#@a2)7WtB16aP8Y4n9{og0H{|inx-^p)5Pm+hmAMjP z#o_x{Ll9aLyBpf&uB_%o(8cmUPAk>TH#zU-ZHty@&1GY5V_L;%kZO}{g%z)qF^Y;)EL(}@%jTzrdopOi^>ASPz{8tviRl!)q%X3 z3)0)>=ZN+{C_3(5SHEv@P5t#4D(E|J8|2c*-1C*yP4$L%5e*iOP0v`NOH=dedlPieY&Yg zhCUXJ+_Uvzj}J`lI-rT`D&ryjYL{O^>t4{sgd-1Ib&V<1Wp$FD^E;SQWy-LK0M3tW zM?xTn|Cfj$GV~MMC1+Cn29}K-6=bi76<^|s`G>O7ufN_7L`js1-hrX^VDa02UzAO#4yzZAi!7y1&Mdxe8(AOl+peSr|3Ot>*>p5Y zAV@^`-#4&!8U}GLoR6TQmHyR7#tGWH*j{>SwZ-is#hoW$BMhYM)e*&uNBVoNG) z${qWE$sLG|u^H-xApnlwUEV%=*I~+jJ!I2YZ{=+;%rZIK?}~hiJ8gF|N53>4S+Wt_ zX?f}a6dNR2ojm`k2uD<&x5KVgWF_L?mfrQPFb(up08ibx!+7iunB*C;y;AGiT$s;z zc7d3kwmEU4!YZk0n|px)J8egNag3T>OQ%wpuG$Ondia}NLaP;$V`?xiud%}mIcz%x z9aNR#lj8S885%)%FNb2yjjKQHpw6^-62e?oUTKJ5_!m6vdB!{L+R0tQY;JokJ0@TLP!*5JHUM(Y%*xJ96WOu|dL%))Mv0RiXoNxB(bveU{wUFXI6HZHl3@|pjd!-`KuaR`Y0!^lpw7U~UmZ$2&`7yg mm#hP=_<;Q