From 0362d03b0b05e65e1a54423b60b926823f3fb1af Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Thu, 18 Feb 2021 16:30:47 -0600 Subject: [PATCH] drawEllipse, drawCircle --- README.md | 12 ++++++++ examples/rounded_rectangle.nim | 2 ++ src/pixie.nim | 40 +++++++++++++++++++++++++ src/pixie/paths.nim | 3 ++ tests/images/drawEllipse.png | Bin 0 -> 1544 bytes tests/images/drawRoundedRect.png | Bin 0 -> 917 bytes tests/images/masks/drawEllipse.png | Bin 0 -> 561 bytes tests/images/masks/drawRoundedRect.png | Bin 0 -> 491 bytes tests/test_images_draw.nim | 11 +++++++ tests/test_masks.nim | 5 ++++ 10 files changed, 73 insertions(+) create mode 100644 tests/images/drawEllipse.png create mode 100644 tests/images/drawRoundedRect.png create mode 100644 tests/images/masks/drawEllipse.png create mode 100644 tests/images/masks/drawRoundedRect.png diff --git a/README.md b/README.md index ec98a8a..3b81851 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,18 @@ image.drawSegment(segment(start, stop), color, strokeWidth = 10) ``` ![example output](examples/line.png) +### Rounded rectangle +[examples/rounded_rectangle.nim](examples/rounded_rectangle.nim) +```nim +let + pos = vec2(50, 50) + wh = vec2(100, 100) + r = 25.0 + +image.drawRoundedRect(rect(pos, wh), r, rgba(0, 255, 0, 255)) +``` +![example output](examples/rounded_rectangle.png) + ### Heart [examples/heart.nim](examples/heart.nim) ```nim diff --git a/examples/rounded_rectangle.nim b/examples/rounded_rectangle.nim index 8b6f41b..776fb6d 100644 --- a/examples/rounded_rectangle.nim +++ b/examples/rounded_rectangle.nim @@ -9,3 +9,5 @@ let r = 25.0 image.drawRoundedRect(rect(pos, wh), r, rgba(0, 255, 0, 255)) + +image.writeFile("examples/rounded_rectangle.png") diff --git a/src/pixie.nim b/src/pixie.nim index ba91f48..a757b2e 100644 --- a/src/pixie.nim +++ b/src/pixie.nim @@ -111,3 +111,43 @@ proc drawSegment*(mask: Mask, segment: Segment, strokeWidth: float32) = path.moveTo(segment.at) path.lineTo(segment.to) mask.strokePath(path, strokeWidth) + +proc drawEllipse*( + image: Image, + center: Vec2, + rx, ry: float32, + color: ColorRGBA, + blendMode = bmNormal +) = + var path: Path + path.ellipse(center, rx, ry) + image.fillPath(path, color, wrNonZero, blendMode) + +proc drawEllipse*( + mask: Mask, + center: Vec2, + rx, ry: float32 +) = + var path: Path + path.ellipse(center, rx, ry) + mask.fillPath(path) + +proc drawCircle*( + image: Image, + center: Vec2, + radius: float32, + color: ColorRGBA, + blendMode = bmNormal +) = + var path: Path + path.ellipse(center, radius, radius) + image.fillPath(path, color, wrNonZero, blendMode) + +proc drawCircle*( + mask: Mask, + center: Vec2, + radius: float32 +) = + var path: Path + path.ellipse(center, radius, radius) + mask.fillPath(path) diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index d040cf6..e6737a5 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -450,6 +450,9 @@ proc ellipse*(path: var Path, cx, cy, rx, ry: float32) = path.bezierCurveTo(cx + magicX, cy - ry, cx + rx, cy - magicY, cx + rx, cy) path.closePath() +proc ellipse*(path: var Path, center: Vec2, rx, ry: float32) {.inline.} = + path.ellipse(center.x, center.y, rx, ry) + proc polygon*(path: var Path, x, y, size: float32, sides: int) = ## Draws a n sided regular polygon at (x, y) with size. path.moveTo(x + size * cos(0.0), y + size * sin(0.0)) diff --git a/tests/images/drawEllipse.png b/tests/images/drawEllipse.png new file mode 100644 index 0000000000000000000000000000000000000000..a816ac3b6c3f17060aeaea5d226e7e96e395fea1 GIT binary patch literal 1544 zcmbW1SzOWw0LLvaK&>P^@W_GSndU`mrrBQ*QZrDzQ1e0yEi-W`Wi1s{yuttt*X5bH zqKQXpmX;@8HLonYRPtyl(^=`pZ0>Q7+r#hod-y&4KEIbQo9K;KgXloy1N&^SG+~%WN3DI6KI9`?CWl&vRAFg^WyFSw7 zb~?yIg9pUH3@)d$U#oP2OwidSjsBGiM6BxwUX>_O&L>f@;1ZLQYUwgLsOw2x3(N_q zj#^qp<%KVc(N83^@80w*4_tDhCl3w0!cu~R*| zOsz=OeVy9Jv#ncqMg7MDiLTHxhU3w7L0u_kDfwLzU%*-sCgPkWbMSD%XrUYCEp6KB zuaidNiHJ6bS=QP|(3QGO9LxuB;lBE?BSq=++6?I823H|rC&NN2J|P%gvC?G}+Bb6_ zG#7F8st(;*NQ)kTEc8U=TujxoL?N&hsBZTBwxUliPr+NzqRT4OuG)t7U zz)n}__QyEMJGx?`*0Y4Kaq9-9kOg;J47FKkc1o%4O5q|^-Rvw2n#H`;Vl9o>|(!H+1P1%D>9UAu7j>#K-b6>cN?J4%l zQynOCRl4wol@%lNY+%8xdsuE|>DL_|JKz*&#&Yf%VJSU2Rn6gHye7WX)bQASel=Lo zcfdYO9fP8zUQQb=yz7&MLF6*VSWn9d0hBvnNW`Cb8+xK(R6NtG{NQS+zdUVaB>E_oF8Mb4^{l5%cK1ZB^J?+qhP>=s{qG_c z3uNuYB9Is&xJ}ydl@5Z9R)Su959av|6x@0tMkqD0hM>E1kWezOUYW5&hp&m$fP0^& zc1S11=lVl1M0I3uEZsAA`gKR*Z1;Nwe#Q8~=N|U*T4)L(X+edeqCZN>CKHU#qYfE* z^ybJud-<7*N_Lgr^txF#(Zwoj54tL7k4d(nm6~BGV$Ag^%X73bsVF6vkvb$_+>rmJ z%nZvJ(`E3Q`DsOt?hx+AsGmO<4mUbs>e-ox&(-E)rP$}FXV=VWMC6?p&5$PTo zqR9~0uV)*(nNmyu1@L$!{YA(NlIVvyQAmz9q!g@PBaT3YH4mUw2-9ibX(3sitqSa8Dcq3W<26|`$DsE{^u3a^4ihi4($B+*l}nT6EvLFKM>+L z@)o%?IWb9_(SV1gwyPS6*cJ!pzeKCifg!`>UkeA&;_<)ux&(lw48+S5bp)+6nqsNF|7-nUp5YyKi+>~Rgj8*V&2Av7D5xz uAN~csUi9G`*vQ&ze;jw#>iRz{>~71*XMfsuGnlhQc)24uZ>$gqPyZWUk-J;~ literal 0 HcmV?d00001 diff --git a/tests/images/drawRoundedRect.png b/tests/images/drawRoundedRect.png new file mode 100644 index 0000000000000000000000000000000000000000..c3050ad5eaa1bc864cba4c872919e26d6f494228 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^DIm`wBkzjUcp>YzxF)8*Je$Cw=#1q`Dm&Gx$NkbT>CA;;2^^zNWc z?%Z3h3pM|GE=V*FHZtcjxzz z6=ADWBA@L(X13ypfZAclBNiPJ?1GOKl4M+ZnmY;w4EdDOJRPM^`p3hYH`;iQxsUKN z*+&w!a}wLW{_%0=E&lm`rKJaVsN0Rh*K?LmmVdR)bzbts?-oa#rxnjM6_`BL|Ey!% z&C_{q5y#$_-j7P0x4yWq+U9Hclus))f#%DkYUJ&3dzIRjFQN1FdiXa2EN zJs}o&BRKA{RD0#}682w*9LB@!G!)B^8YQDmrP$?`%2}!S)Ypi&WdjFnj*vV zT4|H#*V&(qw);D8`Be9uhY|Nq^L}Ja-sdniy;1L8idEc6?}u8ef3)1)*D_n3CvEmZ zbH1yb*Y`-j6rb1ecuU=*nQnS+K@a029VL!@(|)_>;LQ(P5)VCnWUydSPZpO@Orq)c z%1Na$YktoY`qp!P<`eHW+kkaD#Pl|r_04{jXx3-3raiLiMe;1+9If1*1ItclpO!}Hp(Rti c_Iy@<^8NnuLk~~!0ka!}r>mdKI;Vst0F5r4jQ{`u literal 0 HcmV?d00001 diff --git a/tests/images/masks/drawEllipse.png b/tests/images/masks/drawEllipse.png new file mode 100644 index 0000000000000000000000000000000000000000..1bd4af34d8a775bcef6c3b702b556df6e9b30e0f GIT binary patch literal 561 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5ZI3G8*4d@;iHFmA6;6g0s*hWsaxInguwH@bQ(N zxWrf1)!5|B&m>lIVQGMiZjnmI^84TSN?1+#KJ(r4-}~CD-<@as&oF7hf*1`AajsLX zO+^c_GX>74eqW!XKKbM1l3%eJa^KGTUA?_X&9Srk`PxmQpH5CnVcg&`=?(YMviNgX zrJdviJ9TSjaPL}k_;qCL!SKfW_Em?EpXKnFwqD5ZvkP;2%3n8gGsyx~|2}@%o}Ujo zJdg5aGcbfF?Z5MaKlx#8;lWClitt72HeNHIAbzg5x3EBEb@gL4zDGa9Wbc?BoLEyb zJFVx@O0!olm}O43r}HaE-r$c&ubebx#uC$sDhkt9n*^>4n{xBvyelr|`*yw98Q;

L&RLYM)LNpEz>g@0v6Row-;|2*<r+uQ~G%fYO4etDnm{r-UW|p1=9z literal 0 HcmV?d00001 diff --git a/tests/images/masks/drawRoundedRect.png b/tests/images/masks/drawRoundedRect.png new file mode 100644 index 0000000000000000000000000000000000000000..13bb852d997ec143bf84dc6d73654f1df281a86c GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^DIm-NBp5#q&c3y~na|4Vi+IFF0hZfJbqy9=mzJ(}>P}!S=dR;z(rfj5H_6c@ zD^_V~LjI)L=9NBgzRdf0Z+7(w&mEpVJdD#E3iLS6u_m4ujlOr$-+RBv^k-+balTz~ zK+QA$sd49tgjkh{k*Cdi4<4Am!9yuJ{qecjNju+LKi6n--Bh_`<+`iS?3*G}Jb%T! z6mU9ojY)K}%Eq=uq4K$#q@KL=o;0AO-$*FU#6ylw& z6qc`C{LgC1V!K^lE%$g|F1{M)volJLOR=`@Y}&cE?u#bZ7JvQiP_?_|