From fa6b8352e6386263015e2c40072811b36e90930e Mon Sep 17 00:00:00 2001 From: treeform Date: Wed, 2 Dec 2020 23:20:14 -0800 Subject: [PATCH] Add path tests. --- pathBottomArc.png | Bin 0 -> 1083 bytes pathCornerArc.png | Bin 0 -> 975 bytes pathHeart.png | Bin 0 -> 2062 bytes pathInvertedCornerArc.png | Bin 0 -> 981 bytes pathRedRectangle.png | Bin 0 -> 358 bytes pathRotatedArc.png | Bin 0 -> 1276 bytes pathRoundRect.png | Bin 0 -> 810 bytes pathYellowRectangle.png | Bin 0 -> 360 bytes src/pixie/paths.nim | 12 ++- tests/images/pathBlackRectangle.png | Bin 0 -> 350 bytes tests/images/pathStroke1.png | Bin 0 -> 714 bytes tests/images/pathStroke2.png | Bin 0 -> 1059 bytes tests/images/pathStroke3.png | Bin 0 -> 1587 bytes tests/test_paths.nim | 135 ++++++++++++++++++++++++++++ 14 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 pathBottomArc.png create mode 100644 pathCornerArc.png create mode 100644 pathHeart.png create mode 100644 pathInvertedCornerArc.png create mode 100644 pathRedRectangle.png create mode 100644 pathRotatedArc.png create mode 100644 pathRoundRect.png create mode 100644 pathYellowRectangle.png create mode 100644 tests/images/pathBlackRectangle.png create mode 100644 tests/images/pathStroke1.png create mode 100644 tests/images/pathStroke2.png create mode 100644 tests/images/pathStroke3.png create mode 100644 tests/test_paths.nim diff --git a/pathBottomArc.png b/pathBottomArc.png new file mode 100644 index 0000000000000000000000000000000000000000..f535a0e74fe3e53de7090c8e3de211644ce168aa GIT binary patch literal 1083 zcmeAS@N?(olHy`uVBq!ia0vp^DIm*k&w#{i!Uiswv?ls9L6v~|T?>{|3xIkg*pIngoC*leE1%A^V-QUP3lxzJgnQqD> zc7&~G;k`n!IXCQA-g*`=T_SCRf?C_Jqz7WVZ4=vrPRf_X-oM~j$5Q6|BRiY1LSyQm z+Zs(b78qVJX9_Qstw_1I`qr}tI>!7}Ei)uuRX&K@ZR=PabTa<@CcRdL`wZob)6W_G z;E-XL^Hx1?^6G(O&I5^8@(sV!X2sk;w<iOdV`&ql)Pc;O-cvSu1+N#_)ySDr8{l393=;Z!m0sGl< z*!3cpPk;H^J0bh3nfkAH88dSPCVS26Us%VwLu|(_IpHFa9ecB82WMMOE&)o|&Go7? zZTsc_Kux0N+5U#w(Azdin{W1Hd)l4Y6!MAP@QQoG>qhNq^7j+u8MlY#e*RUp_gzNQ zjF3+&Lq2sIUb)X`&M^D!N8SYWH?g6&-)xh-_W7%uXiB8k&kCNejuADB*RkkD*X8xf zGS6d>TXE~zXVZJ%>!nhG7RPz0%6qHY%RB#7OL#s*_kioS8h+La$%-9Wv;TUp-*_Rp z-dHks!qlLX>cJ=9FPSty_Seckk{^T(_~-D)Y$*CInlszKvAps5n~W8=((Yf{=eO=g z-eDi56JFnB_kUSwH_NL|bLyWGt)D0V@4QjGtv5H@{r0YT^1EilOxXAtYp(k#zSuJV V+TG_iwZKAw!PC{xWt~$(69Bf7?5O|% literal 0 HcmV?d00001 diff --git a/pathCornerArc.png b/pathCornerArc.png new file mode 100644 index 0000000000000000000000000000000000000000..26f348f82ad4ed5780cbe398017663b55aaa81ec GIT binary patch literal 975 zcmeAS@N?(olHy`uVBq!ia0vp^DIm`YxLjq@79Z(v)p#c&B67D&+jXYA zQT-CJPp2|vj=r?J?B{PE`h4#Kao)d6%)E=Pj7HKE$+{s%N4ESs2r zSD4?($@gdGgY*YH1t~|Or#*9gwnFoMl+zxz8rD0u&zJr_*8FDCvOg*x*gyQy(~soj z|0JJvYTLRWb^F6_Bv(w3%{sMxiokx>d#zt{a;hdc`u@~=aJ@Os)f964(Kj<7Q4K4M;7b`N`F4UefY<$%gGb^ zqhe!bt^-QG{d4=g!}p5gO0le(inr`mhl}w>Mdmx+W0@B)??Lw$u@vDQ|c^7Pnr!7o?%MZ0UI~nZ-aM_Ib09^F&4ZJDN?~%iKRHuPG-dKlfHb zRK3Pui+}u`(ld7MuM{wpbLn9heC&9nf-1}uJ-#~&ng6?)PbbaL&+11dCSG$CpPvoP Os0^O2elF{r5}E*OE3|_E literal 0 HcmV?d00001 diff --git a/pathHeart.png b/pathHeart.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4c9ad455bfeeeed6e1faf07bc5d9f4ec2a8ddd GIT binary patch literal 2062 zcmZ`)dpOhkAOFtW=DJ3?r{xkcvQ{o5;uMA= zwbITw{ao5;E{80al`)lw9ce|KufKlJ^Lw7(AD`RndA%>s>;3*b?>rx`6RJwON&o<; zy16?0f@k#BQj`bxxOcQu0HE-fo3qoY6v(H_m|WxI+S%cc{CIW|Xq*quqnZ(!SDQSo zh@X{o1|D{Cw`lCh1F;sSrCOuHAKS~>nZ8SL!zFU zPp)tD?0yUy^|w{s2K;r*;`%@595X#cApS65qh}=C-H+j6BB6 zT5f&6k+HnM^PS^EV=^s$5X9=Z*<2&h0if8O58Qe@2~NAprNH2zq{7_-snSH5RN;(Guw;SBov4+~iZ~P1 z?4f+B<;bk!GGERmM_s$}J~QaxH*}?FN4MN($N;~fq`$xTTM+R($hG7zHy$QtLnl4*OKx4!EOoh$$?cd=Lm8KAe#o@` zNCE3Hf0*X>9;3L-Fh$Z8IP9)OQ3EJ`^X?Ta1uT*TNRnxV&5Y;9ypDUhGu}^h`Zm0o ziYTegTbf&e>l>vibJ#e9*09$c=FFCBZ9t zGrTbPlaV2mq;oW&^7I@?|2G@4imY~6_|brtC{D-DGP>0CXx5;hA(C>$YH|B{y5%NC zs;6+KwTg30`xd;0DWyfRB!+PNl%xw@!Jdiw6|8;o`#@FaO_5cyoI6KuMoj?1E3T8) z*yl>g5kicsAmD36b;cLJwcLsH%-U@zD|HdHR~czMb#m#wV(HL<2yWM?NuHR-qIRaBzyLpdG4Zw%Pj@{z+KPH%$u09IVQ(wp-D#$J z{(i82VyS+R|E_Ttw{!%(SYLzI<~--l%j%dvhY}eAd&FM_fv4f9mAa^b{bxIOVA^e3 z_92f#_p5SB&>yqpfI_f8vJKcFrqjwuLD_mK)w|BuKQc&-E#DeY`ocOPJqACDQ5+iM z;V{!`_!Gd+2fQpT$iW)pAKejQmiMlMx&&2II-wjTV9$eCm3pY{K5V4H6~Zq}3itzd zlLkCcqTX}cJ2bgDR)(AhIE1&j^Us$=r%x1>JIvcmO1cV16KJfTtCAF;vG0sC!jBNl zwluBprIE5a3QTbb$*!;vf;ouoAP|>4!j*&kV+fYfo&SH7t{D36>-S!AS0aFO9&kJE K<=l+H|Mm~Avc9VT literal 0 HcmV?d00001 diff --git a/pathInvertedCornerArc.png b/pathInvertedCornerArc.png new file mode 100644 index 0000000000000000000000000000000000000000..50691b0322a17733227da848d72b02cf63cdbe1c GIT binary patch literal 981 zcmeAS@N?(olHy`uVBq!ia0vp^DIm=HFv=>v-Vqq;+ z=KaSyy;r+DFGjP~L-zRrgOev`8rxp}JJ0Ss>tUU=WviFvJzKmyJxyFWz-f=(_Otty zcWC!0c@+JdcE_w8gPwS%Fe^OJd=Jq@l+@!z#?EJZ5hdMU06z&+Y?_Uo$mMGc}9(mrlJ-t1A0^<~c*XjB3S8YGvd?=d2aPsH$ z#$Co0lB_QyIX|X7$bN85n|G~(?d&&G(XY6lQ#CyNy*jQlPfxr5 z>|D@+q(O3I~&{Tofjmz>I(#7wt zY0~lJ{Al(-{lQ7S*&!2DH5BbEIzMJyKdb5C4)jWcd_%Q$URH0D&I-8{uXFQR?O49) z?3j64;{=meN9p}X)(hm?VzpRrHVHkN_oU`8-@D}>{+sho_jP<0;pvSJQx08SRk^Z`fl@$LdRDd-#+=%_~eiF$)7wmCO_Z2OpLhO z{dJF<^pd*&nwI#~0m> zIh9+y@m}KT<@*k;kNUfAjl?2_V;UWXTuD7m5{s$AJP~?vckJGNjqs(U8TW_%mR#c@ UwaNfJV0LBjboFyt=akR{0C#b>m;e9( literal 0 HcmV?d00001 diff --git a/pathRedRectangle.png b/pathRedRectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..d649f6872c95c17ee58381eafbbd2c4e00f40c89 GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^DImI3}@lA~DjePS_pW*S9h1{ksI|pdwF%9~zopr02oej!2kdN literal 0 HcmV?d00001 diff --git a/pathRotatedArc.png b/pathRotatedArc.png new file mode 100644 index 0000000000000000000000000000000000000000..a4d3a326b41f058c58f77aa83f7fb4b9b9f8e0c1 GIT binary patch literal 1276 zcmeAS@N?(olHy`uVBq!ia0vp^DImdAN77wRAAbujqKhJfGYA&;eKOgRLoV-4s1KBw}}PC~53F z)vC}Wbka%KJ5ZobP>E%J@)T>6$dd-av9`6#|5qm@%ro8otRy`A?yk)ueVQ>HhWJsG zxX~Im>6RZ_igDUURE}i7`n}qz%U?4e`1slBk5+>^!=3N;+u2)w zL@L$=bZqDTn5Foye51FPT1o_O7{^C$hHuO}SPxh+EcY!q5zCNZ+aTRIafy0s#bN<{ z!AFY~k4_fea#6aALo%#6mf;@r2HuQ2&u%i9G47B(ko;AkTxZD-@BF&2h9+V__w+MZ zF!a=&xU^!b+R9d*)dy7>;^tgDqcuG{%djf< zr``66dNZOr1YWoP`KQ-3cM|t&#WyJ)A0KPl-8|U1Xb4NDA&8Aa*WUw+wa4(-qvf8>1a(r-(rFvcCl^K!4m@Fr{)*e@FN zXLsGY;-Z#0><<>6Q`SE$y30`Q2>V(crQ#MD_5~}2eZ#*n+CDDl`uG~?sa@|bTyb*h za#q~O+_3J(??b5!dF#$kxxf3(l`Bpniu?E^dJon*UH-Yd<%h%c!{O@$bbWSg^*75h zN!;bz5&!y?(|qj|#sim2)qfp(RrPJD_^z!g47k`># zx7c_+e_H6HS-LKQNpm-6=Z4Lw4o#l1zkLrp?uY}o4b6;$k zb3udoOfG9C$KA!(7rn1l+&cMlmX3?yBYg%Nt_MD~cZyANx9BbT;U@i8N6DpM>~AwK z!(29fwlDmyQHqsIO47SI0$Y9xeeP$M91p8 X`z|rWtqZ6GmTC;1u6{1-oD!MUDz0~wPr9CP4+4bJsn>+LL+|At4Z}}2}WL$chI|>C1`IL@19AI>kR;=BW>vFEVtj)!qaK@u+=Il13+~4k9{qh!_Ca)u|LV*bYY$;QmI}5QMn0z7 z;{A1(_r2f3KAEwPtwQ=?^4#7PqDwf_8QR8QQ} zx;K@b(|~WzyS+=+PPliVSn%Fji};l)CsY%b6p6l0RXh~3-qF)@g7krFCMUaiU3bhj zUajKsE6sGq<`tzkBpy~BzsaTQxGwa}cAI9wq;nT0DJZ5pu6_pcCsxl7tl*jd9FzX7 zQ~JI9WbRCR!F77pmtDWHv0HHFyxVln>S)wYnTKWPl9(-2fi-QJ`@A??mcGphJ{_FYj&?ckkWGhZoAG&zDZ&{2K+LSv+^X*nJ1_v$9R`b zP&t&-Aeazdm1pZ~`XJ_f;C~ISNh}q7Zy3v#J->F9`$0rY>pEpE5q3}Ujt?pa{1faq zEKIsv_lbP0l+XkK-xox7 literal 0 HcmV?d00001 diff --git a/pathYellowRectangle.png b/pathYellowRectangle.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b1b2b87fc1d3114c1691deb9dc177df1ea01d1 GIT binary patch literal 360 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-ze)q*avO74UU*?>YGTk)em6irWMU$0U|cBu1L`iORm>bB1fn%Qsw$uztI}`Ho^4 z+b16kg_v3gOvKL6ZZpuWhx_I_Z?`>ctcUEdQtg}0puiDc7kI>I5O?9roOh{U+VxvAeU?DG%aZ8N`>H_b7u@S7mv zn8ea4sNyyV8TX{)Z>3GsHJ+~by7UvOM>vE&S57EiDA|8M;nduIMSB4Z4_GqH)LnSS U+IXunFx(hCUHx3vIVCg!0FH%fIRF3v literal 0 HcmV?d00001 diff --git a/tests/images/pathStroke1.png b/tests/images/pathStroke1.png new file mode 100644 index 0000000000000000000000000000000000000000..48666bee14bf74c0e3531c236f457c68d2646ef8 GIT binary patch literal 714 zcmV;*0yX`KP)rUjS%BA^c!_@(n18;RIqw?g08coE zGL=A#B@kl?#8?6`mOzXZ1hNB8M&QlZyEKtE$PTy!a6bU=Bk<6~S1^Rp6H3`uL6}g=O!bUn5`^`NVitt;h+-Oq^@d^|g!P0{1qkZ} zr5X^{14>mOtaX&?Kv>HtRf4cqQK|)DEuvHn!dgSA9)z`o(gX-=1*I7f)&fdXAgp$j z=0I4@C{2Q}T2Yz>VKt&O4Z>q%qmK^ zAj~34*C5OqO7|el5{f|fSwRuVk1U`FgegQdU{{R3007*qoM6N<$f}^ky{r~^~ literal 0 HcmV?d00001 diff --git a/tests/images/pathStroke2.png b/tests/images/pathStroke2.png new file mode 100644 index 0000000000000000000000000000000000000000..7e99ee7107b649d15ea0b331c8753fa1939785c4 GIT binary patch literal 1059 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 literal 0 HcmV?d00001 diff --git a/tests/test_paths.nim b/tests/test_paths.nim new file mode 100644 index 0000000..d69a055 --- /dev/null +++ b/tests/test_paths.nim @@ -0,0 +1,135 @@ +import pixie, chroma + +block: + echo "pathNumbers" + let pathStr = "M 0.1E-10 0.1e10 L2+2 L3-3 L0.1E+10-1" + let path = parsePath(pathStr) + +block: + echo "pathStroke1" + let image = newImage(100, 100) + let pathStr = "M 10 10 L 90 90" + let color = rgba(255, 0, 0, 255) + image.strokePath(pathStr, color, 10) + image.writeFile("tests/images/pathStroke1.png") + +block: + echo "pathStroke2" + let image = newImage(100, 100) + let pathStr = "M 10 10 L 50 60 90 90" + let color = rgba(255, 0, 0, 255) + image.strokePath(pathStr, color, 10) + image.writeFile("tests/images/pathStroke2.png") + +block: + echo "pathStroke3" + let image = newImage(100, 100) + image.strokePath( + "M 15 10 L 30 90 60 30 90 90", + rgba(255, 255, 0, 255), + strokeWidth = 10 + ) + image.writeFile("tests/images/pathStroke3.png") + +block: + echo "pathBlackRectangle" + let image = newImage(100, 100) + let pathStr = "M 10 10 H 90 V 90 H 10 L 10 10" + let color = rgba(0, 0, 0, 255) + image.fillPath(pathStr, color) + image.writeFile("tests/images/pathBlackRectangle.png") + +block: + echo "pathYellowRectangle" + let image = newImage(100, 100) + image.fillPath( + "M 10 10 H 90 V 90 H 10 L 10 10", + rgba(255, 255, 0, 255) + ) + image.writeFile("pathYellowRectangle.png") + +block: + echo "pathRedRectangle" + let image = newImage(100, 100) + var path = newPath() + path.moveTo(10, 10) + path.lineTo(10, 90) + path.lineTo(90, 90) + path.lineTo(90, 10) + path.lineTo(10, 10) + image.fillPath( + path, + rgba(255, 0, 0, 255) + ) + image.writeFile("pathRedRectangle.png") + +block: + echo "pathBottomArc" + let image = newImage(100, 100) + image.fillPath( + "M30 60 A 20 20 0 0 0 90 60 L 30 60", + parseHtmlColor("#FC427B").rgba + ) + image.writeFile("pathBottomArc.png") + +block: + echo "pathHeart" + let image = newImage(100, 100) + image.fillPath( + """ + M 10,30 + A 20,20 0,0,1 50,30 + A 20,20 0,0,1 90,30 + Q 90,60 50,90 + Q 10,60 10,30 z + """, + parseHtmlColor("#FC427B").rgba + ) + image.writeFile("pathHeart.png") + +block: + echo "pathRotatedArc" + let image = newImage(100, 100) + image.fillPath( + "M 20 50 A 20 10 45 1 1 80 50 L 20 50", + parseHtmlColor("#FC427B").rgba + ) + image.writeFile("pathRotatedArc.png") + +block: + echo "pathInvertedCornerArc" + let image = newImage(100, 100) + image.fillPath( + "M 0 50 A 50 50 0 0 0 50 0 L 50 50 L 0 50", + parseHtmlColor("#FC427B").rgba + ) + image.writeFile("pathInvertedCornerArc.png") + +block: + echo "pathCornerArc" + let image = newImage(100, 100) + image.fillPath( + "M 0 50 A 50 50 0 0 1 50 0 L 50 50 L 0 50", + parseHtmlColor("#FC427B").rgba + ) + image.writeFile("pathCornerArc.png") + +block: + let image = newImage(100, 100) + var path = newPath() + let + r = 10.0 + x = 10.0 + y = 10.0 + h = 80.0 + w = 80.0 + path.moveTo(x+r, y) + path.arcTo(x+w, y, x+w, y+h, r) + path.arcTo(x+w, y+h, x, y+h, r) + path.arcTo(x, y+h, x, y, r) + path.arcTo(x, y, x+w, y, r) + image.fillPath( + path, + rgba(255, 0, 0, 255) + ) + image.writeFile("pathRoundRect.png")