From 10a10d3f272f5fda2f5ac257a2d82c50e5b22cc6 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Sat, 19 Dec 2020 21:59:43 -0600 Subject: [PATCH] svg more basic shapes, more transforms --- src/pixie/fileformats/svg.nim | 107 ++++++++++++++++++++++++++------ src/pixie/paths.nim | 6 ++ tests/images/svg/circle01.png | Bin 0 -> 13656 bytes tests/images/svg/circle01.svg | 13 ++++ tests/images/svg/line01.png | Bin 0 -> 8954 bytes tests/images/svg/line01.svg | 23 +++++++ tests/images/svg/polygon01.png | Bin 0 -> 22825 bytes tests/images/svg/polygon01.svg | 18 ++++++ tests/images/svg/polyline01.png | Bin 0 -> 11086 bytes tests/images/svg/polyline01.svg | 19 ++++++ tests/images/svg/rect01.png | Bin 0 -> 5347 bytes tests/images/svg/rect01.svg | 13 ++++ tests/images/svg/rect02.png | Bin 0 -> 22298 bytes tests/images/svg/rect02.svg | 17 +++++ tests/test_svg.nim | 6 ++ 15 files changed, 204 insertions(+), 18 deletions(-) create mode 100644 tests/images/svg/circle01.png create mode 100644 tests/images/svg/circle01.svg create mode 100644 tests/images/svg/line01.png create mode 100644 tests/images/svg/line01.svg create mode 100644 tests/images/svg/polygon01.png create mode 100644 tests/images/svg/polygon01.svg create mode 100644 tests/images/svg/polyline01.png create mode 100644 tests/images/svg/polyline01.svg create mode 100644 tests/images/svg/rect01.png create mode 100644 tests/images/svg/rect01.svg create mode 100644 tests/images/svg/rect02.png create mode 100644 tests/images/svg/rect02.svg diff --git a/src/pixie/fileformats/svg.nim b/src/pixie/fileformats/svg.nim index 90560f5..b2ffc57 100644 --- a/src/pixie/fileformats/svg.nim +++ b/src/pixie/fileformats/svg.nim @@ -49,22 +49,42 @@ proc decodeCtx(inherited: Ctx, node: XmlNode): Ctx = if transform == "": discard # Inherit else: - if transform.startsWith("matrix("): - let arr = transform[7..^2].split(",") - if arr.len != 6: - failInvalid() - var m = mat3() - m[0] = parseFloat(arr[0]) - m[1] = parseFloat(arr[1]) - m[3] = parseFloat(arr[2]) - m[4] = parseFloat(arr[3]) - m[6] = parseFloat(arr[4]) - m[7] = parseFloat(arr[5]) - result.transform = result.transform * m - else: + template failInvalidTransform(transform: string) = raise newException( - PixieError, "Unsupported SVG transform: " & transform & "." - ) + PixieError, "Unsupported SVG transform: " & transform & "." + ) + + var remaining = transform + while remaining.len > 0: + let index = remaining.find(")") + if index == -1: + failInvalidTransform(transform) + let f = remaining[0 .. index].strip() + remaining = remaining[index + 1 .. ^1] + + if f.startsWith("matrix("): + let arr = f[7 .. ^2].split(",") + if arr.len != 6: + failInvalidTransform(transform) + var m = mat3() + m[0] = parseFloat(arr[0]) + m[1] = parseFloat(arr[1]) + m[3] = parseFloat(arr[2]) + m[4] = parseFloat(arr[3]) + m[6] = parseFloat(arr[4]) + m[7] = parseFloat(arr[5]) + result.transform = result.transform * m + elif f.startsWith("translate("): + let + components = f[10 .. ^2].split(" ") + tx = parseFloat(components[0]) + ty = parseFloat(components[1]) + result.transform = result.transform * translate(vec2(tx, ty)) + elif f.startsWith("rotate("): + let angle = parseFloat(f[7 .. ^2]) * -PI / 180 + result.transform = result.transform * rotationMat3(angle) + else: + failInvalidTransform(transform) proc draw( img: Image, node: XmlNode, ctxStack: var seq[Ctx] @@ -99,6 +119,53 @@ proc draw( ) img.draw(strokeImg, bounds.xy) + of "line": + let + ctx = decodeCtx(ctxStack[^1], node) + x1 = parseFloat(node.attr("x1")) + y1 = parseFloat(node.attr("y1")) + x2 = parseFloat(node.attr("x2")) + y2 = parseFloat(node.attr("y2")) + + let path = newPath() + path.moveTo(x1, y1) + path.lineTo(x2, y2) + path.closePath() + + if ctx.fill != ColorRGBA(): + img.fillPath(path, ctx.fill, ctx.transform) + if ctx.stroke != ColorRGBA() and ctx.strokeWidth > 0: + img.strokePath(path, ctx.stroke, ctx.strokeWidth, ctx.transform) + + of "polyline", "polygon": + let + ctx = decodeCtx(ctxStack[^1], node) + points = node.attr("points") + + var vecs: seq[Vec2] + for pair in points.split(" "): + let parts = pair.split(",") + if parts.len != 2: + failInvalid() + vecs.add(vec2(parseFloat(parts[0]), parseFloat(parts[1]))) + + if vecs.len == 0: + failInvalid() + + let path = newPath() + path.moveTo(vecs[0]) + for i in 1 ..< vecs.len: + path.lineTo(vecs[i]) + + # The difference between polyline and polygon is whether we close the path + if node.tag == "polygon": + path.closePath() + + if ctx.fill != ColorRGBA(): + img.fillPath(path, ctx.fill, ctx.transform) + if ctx.stroke != ColorRGBA() and ctx.strokeWidth > 0: + img.strokePath(path, ctx.stroke, ctx.strokeWidth, ctx.transform) + of "rect": let ctx = decodeCtx(ctxStack[^1], node) @@ -106,12 +173,14 @@ proc draw( y = parseFloat(node.attr("y")) width = parseFloat(node.attr("width")) height = parseFloat(node.attr("height")) - path = newPath() + + let path = newPath() path.moveTo(x, y) - path.lineTo(x + width, x) + path.lineTo(x + width, y) path.lineTo(x + width, y + height) path.lineTo(x, y + height) path.closePath() + if ctx.fill != ColorRGBA(): img.fillPath(path, ctx.fill, ctx.transform) if ctx.stroke != ColorRGBA() and ctx.strokeWidth > 0: @@ -126,13 +195,15 @@ proc draw( cy = parseFloat(node.attr("cy")) r = parseFloat(node.attr("r")) magic = (4.0 * (-1.0 + sqrt(2.0)) / 3) * r - path = newPath() + + let path = newPath() path.moveTo(cx + r, cy) path.bezierCurveTo(cx + r, cy + magic, cx + magic, cy + r, cx, cy + r) path.bezierCurveTo(cx - magic, cy + r, cx - r, cy + magic, cx - r, cy) path.bezierCurveTo(cx - r, cy - magic, cx - magic, cy - r, cx, cy - r) path.bezierCurveTo(cx + magic, cy - r, cx + r, cy - magic, cx + r, cy) path.closePath() + let d = $path if ctx.fill != ColorRGBA(): let (bounds, fillImg) = fillPathBounds(d, ctx.fill, ctx.transform) diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index eebebca..9500e05 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -828,11 +828,17 @@ proc moveTo*(path: Path, x, y: float32) = path.commands.add PathCommand(kind: Move, numbers: @[x, y]) path.at = vec2(x, y) +proc moveTo*(path: Path, pos: Vec2) = + path.moveTo(pos.x, pos.y) + proc lineTo*(path: Path, x, y: float32) = ## Connects the last point in the subpath to the (x, y) coordinates with a straight line. path.commands.add PathCommand(kind: Line, numbers: @[x, y]) path.at = vec2(x, y) +proc lineTo*(path: Path, pos: Vec2) = + path.lineTo(pos.x, pos.y) + proc bezierCurveTo*(path: Path, x1, y1, x2, y2, x3, y3: float32) = ## Adds a cubic Bézier curve to the path. It requires three points. The first two points are control points and the third one is the end point. The starting point is the last point in the current path, which can be changed using moveTo() before creating the Bézier curve. path.commands.add(PathCommand(kind: Cubic, numbers: @[ diff --git a/tests/images/svg/circle01.png b/tests/images/svg/circle01.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d4ddfe41bc8acf69065ef33b0bc89ec43d14cb GIT binary patch literal 13656 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 VB3G}E0$)I1e&%(o>eGm?{tqfc^;iG^ literal 0 HcmV?d00001 diff --git a/tests/images/svg/circle01.svg b/tests/images/svg/circle01.svg new file mode 100644 index 0000000..bf71ce9 --- /dev/null +++ b/tests/images/svg/circle01.svg @@ -0,0 +1,13 @@ + + + Example circle01 - circle filled with red and stroked with blue + + + + + + + diff --git a/tests/images/svg/line01.png b/tests/images/svg/line01.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee524a9b0bb6942c4bffba8d16b518cd5eac1f0 GIT binary patch literal 8954 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 F_&?a1-}V3i literal 0 HcmV?d00001 diff --git a/tests/images/svg/line01.svg b/tests/images/svg/line01.svg new file mode 100644 index 0000000..bb1d2bf --- /dev/null +++ b/tests/images/svg/line01.svg @@ -0,0 +1,23 @@ + + + Example line01 - lines expressed in user coordinates + + + + + + + + + + + + + diff --git a/tests/images/svg/polygon01.png b/tests/images/svg/polygon01.png new file mode 100644 index 0000000000000000000000000000000000000000..60d4d9163586d7bc77fd1d7f222465f90b57d130 GIT binary patch literal 22825 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 literal 0 HcmV?d00001 diff --git a/tests/images/svg/polygon01.svg b/tests/images/svg/polygon01.svg new file mode 100644 index 0000000..900cf65 --- /dev/null +++ b/tests/images/svg/polygon01.svg @@ -0,0 +1,18 @@ + + + Example polygon01 - star and hexagon + + + + + + + + diff --git a/tests/images/svg/polyline01.png b/tests/images/svg/polyline01.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8d0c7aeee8230fd05c8472730c57d965c76146 GIT binary patch literal 11086 zcmdT~c_5VOAAb>9%4k=TES244cPwoon}#CCE}g54Ss_Bk(Xm?Om`+M&YPEijN~MG3 z8b?JjD~ueemLU2psQjdM|Cx8@nfHC3@AExA-_Q5^yhqosHJ>S? zECWH%OiK&XjSw^~9fHJ8NK1i{{Op*m5cKVAOVd?9`-yclhFVLkQkZssjrXC?7ax|B zKhxm5TJ~4*FYkX=8u*p`4(qx;m0KDHZdKQVR1Mne6WDB8RB>65qf`Z9u8xE&Wk$5v zQjs6>dJ@0o_1kV014|iS?6ueR*r%b9l9K!fd-T1$2j@FW^~WEK&yN>E3ZH6Qnqhn7rX*ASHTv(m~L`}f680$mjoB%Ws-{U z=mX(D?Po$ncWnQheEd3`9jqSs!Yyf-_7@jC7F^~*&q*O8snp`Y6<|5~xY6kd(8NHa}u z_0eMO^{~w824%?+8@4e`WY9n!J-0UpJ3K4=d-EO##=*NLR3_3MBSx*Vj% z4(LMAR&3Oked(Vua*rlko(rhxs{bp>H5xn}w#CQwk+P&>lMTrq(ZIZoV+^p@u5F7m zW49D}Gz9H(S7py=Ug1%KXv)*#c1*{n=!yj>v*fvmM$;Gcx#q0fuN!Kpl;UcINPna{ z?h!_krqbh>6}v=Ik-iKF*_4A0Jwwk`-D?yi~=*1+W5G#Z&A;@-wcx#CBeOk3^d?rk6NK>qz-HEF_5M5 z;5?ukzjtX6NDJGEtzf&S^xy*#Q#e*m#1s$|Xf8o?#>(Y2_^xdC8$1ph&9nAw&N7rY zSfr&!#Bd*Q*-`R$YwJRFiQ5g@kEJo3sB|~P)^ObV?*uU-pEfyrPrzC^iDFQ-oCQ$wktlWyHpD0W=_PP(wEhiUf3ghQZII0G2Oxp2Ac>n})z(m-CU3LVz zVlgXTKFY=TxT(O1P?x&WYlmtBP)$+then0*y@X{GA=asFhx4|>DJDm=n^Uv<_8Qmy z+TqqL&j={ZU}hZ;fsah2<*2`^3xB{R=)}w|DJT!l;*0oGsnMebFAf zk;cBY;Is*_3NQjUcM_Ior$0fG=|>wKXp*_M_bVWxBp3fV(jc@z0|!CU8z$#Kfa)MF z_&&}y&b@?H^T~t!72pORX><@Z6LS11>UlaoFE#W_Qal_aoM7kxthBWla4`Ts0SE=;MG(RR zVU(Hr(fbHQ)+?2hjhgKD)jzDy?HmBvhL{30guYX?fDb${+ciFIXWO+2WUP-p>fGZV z_!n7aZy{{wZf;sU@)=ik`iDNDeIes8r097a`fTXHF&j$IuG;#5dEd`}QxQCj%1DLt zk29cGFADh9=cVhar(i9EB11&W=9f8HbSw*) zU%XW>{Wa~^v0#j7%1NglPPdUVg%=`lt)g;w_nwQgt?YY4-fieHAHJw)R;PUUu1Y8d z^K3~d2q8{+S7x|5mOV6maBA*7o*=rB3VcbFvUwvEAGPl)j^d+P)|C1Qjj8r^W@I2vUMH` z5T6Happat4NCnmcPb(8f6yCOxQb9HpqWnDG;}8*O>@^=+gi(ibvbxYh5YVHx%8x5i zvu~7DM~Xp&GYAuhW(yCeivpAKWVG7fSEUOrj|H{Gh1$M!I&&#t4#O$;+6}SDA0f#remkuVnD3?Et?-%cD*r<>* z=H;2_Q2Q&RD@@0$z@vMmT;w=ZY3e*+lDnt-v_8X0wsR$9N*-XT(}IJuu6iZB<<+$jxN*-SXHCaG60>l8wp@x6*Nf95%7><{LC zkBn%)Cx9NuD8WBbI95hr`*@o?>)@Sp2W&{J+>%T8k5d~Dx;)5oS8}E__DgIy% zW8PL^KhpSc+d0OhV?6GeP>p_g5v{Q#wluf zO@@Pw4q3ERDFvB?f6@(;<=p!Bv%P1tRq)7a5-j9-*dYNyu8Y( z&4GDl*sRM5($MI$tQ(r=o4jkF_`HAnQb$AHQX{5%i~-b2$eV;H3T1tt3#Y-01ij#c zQ?tVR7E~}iO2n^lOll&%;>8)?)?WwIQ^S5F406~Lhs`h`iE40jp-5H|iVera0CI;& zXmHpBw*!uB7;aVz_=!-0CY*1(%ju3IHW7Sqn&q%{kiND+&!aR1H_`yG?oJ> zs~!uNRf2hVMs2P9f&xumm7qV5=tS_rL5?ZYPJ6iIW{GCFZcGq#2n1fhX*D4Y1o{9i-x2UH6CNM|K^r*Q0B9 zljYoc@qJw$1d;aFgCTH;Ug#!otf#$n6S?MlHw(Pz77C>gBPNE3DyjN0LVLeMUfRv38hM zx*ygj1p)}Zy?bkK6(#B=U}d1~*w{R(?Uz(IX>j8W0B-)6d+T2~_#7m}7yVBMiT+t&A>MNZ%J%FTXg&qyj&MOE$bGv<;| zDpk)vu;M8*!&+5sk6+-k$FH5w0~vzElfC8d<_w>EBttsv)x(OuLwAld#I$y^>K2hm z28NiNyL4wc5-AWDg02Qw8tu+N#ik@q*T>OEPs&~IRnD+&B6w46$pf0>a7~cTNd1 z$5_+%cnxK&2QQOti%O=^7}z=e1zJ~9vNPWVsd*Bq)MW*4SnkL7*3<{Ae7(93w-$$Y zV|#fX0e`5f%>%oNpql6VRu&NBu~9?k;piJWInVTBGHva5>S>SSvqBPHtZ^|h#9Z!S z)hUrkNro6bAjvl*QUsF~T}D@r7ys5ucXtu9WtYNMQ@uhueKELWtP5E)y>M~5xIc6G zH`)uI8e)jx;nP&=2LHfAy{zS6!kwyW=FgcYf7(CWZ2#<%aPw)}3(p&37WxGq>S2X7 zGiQPO4^Yh)lStC4YB377PW}6BYkXqXG@yca>X%@`!(uFAtDGI?kVr~wG!cWMo~34$ z53s^Asup@<9=7`S_c7rg+X99&UwGmF^MX0cIlj2H)eYY}T+GPx?c0CJ=%somI6{R6 zwPeuez&jGgSyz+&{hYDIUl?I{={h^8pPWdXJYn zDH_Tujerjq^7$}$&RB~3-sckqTlUIpZC~u@oIY@H?Dte1rHDon+uzJC{EJqP?U)9h cCM@29BHmwgx$`9cC@h8Lnzg2>s~r#g4{qNihX4Qo literal 0 HcmV?d00001 diff --git a/tests/images/svg/polyline01.svg b/tests/images/svg/polyline01.svg new file mode 100644 index 0000000..9ac958d --- /dev/null +++ b/tests/images/svg/polyline01.svg @@ -0,0 +1,19 @@ + + + Example polyline01 - increasingly larger bars + + + + + + + diff --git a/tests/images/svg/rect01.png b/tests/images/svg/rect01.png new file mode 100644 index 0000000000000000000000000000000000000000..7fcfcbb4233f8e8a2573be770b8a2e845a085350 GIT binary patch literal 5347 zcmcgwc~p~E7QYFrAVNTeL+!}mP>nDwie>8{IB@}oAc1oP1AfT2ZsD!zX5RDZfq(lGs&dZnY-Sypj zfA_vUtGLT8%L-#8}KoqU}dr?BXoMo$uwRvm`Q0 zqAD!=EuVplyC=gO7wYd*B5~;*WGd@*x_( zNY8y)eN>7$K z^*e?+<%$l9;kbY`=0hz;=Qf*D;Ei$SP<5kmXkjcUt&3UtL${6OrnuR&^9)n&hb(5z z;WPH0`GlGQPwOjGPq#9Ay#&&Rt0d3TT0ovRklF%N4`y^~0c8|`=|JzWmVoy%Cgt~YQC}<=EnH+)rdBDy z51Hj4vyJ%NNAn+}VTbW~iJ&u`;S6@yqZgbM3!D~OP@k!=6iEHMe~r+vktkO(?IPF;^Ji70U+b7YM89^pUR?^_OJ1F! z-}eW za@p}di;Sq(5vYC{o~RG8&zUJtIgUs|tC55!i}{-dNj|nT`5-(viW|bxf!!PYyKuPv0BXDb)s$5b7v*$|sH>1avil$k{`XxC<^)89^d{Z$Gf7KgQAxF>VZ2FV6(n;y)iNuubn3VbLqZI;%RU^naAWiO%Z0Z6JwjWnFGA z?4M0pekAP}&WB-FSIwR2I1|=&`yPtU9{7aWTZCER$vOo}-mMuh1qC;AT%ciBx>3MB zoI@(}$N+Q_5^$>R-I#P?P2%%GRJLxp^3# zXzN(G`)N>x*ez2J-Bs@+HMCXoWP=0>Cvt0I#VR;1=&KIV>!OHWYz0FkmGmQTbOR`K zjz5>IhsjV*u6jC;3i|%3$GwHQDH7X7u@%QPZ92Z|6rgmADvKspCZHmhR1+o7a*(%T zeD4}9zB`P>X}Ongdwp4N* + + Example rect01 - rectangle with sharp corners + + + + + + + diff --git a/tests/images/svg/rect02.png b/tests/images/svg/rect02.png new file mode 100644 index 0000000000000000000000000000000000000000..ecf92f2034de263c4eb9a4d86ab39bc779bc3e37 GIT binary patch literal 22298 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%0AF@u|r$hNpy+(Fz}rOCV)VNLTN#T9`Cl$x=Brn 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 CH=El4 literal 0 HcmV?d00001 diff --git a/tests/images/svg/rect02.svg b/tests/images/svg/rect02.svg new file mode 100644 index 0000000..b943ff4 --- /dev/null +++ b/tests/images/svg/rect02.svg @@ -0,0 +1,17 @@ + + + Example rect02 - rounded rectangles + + + + + + + + + + diff --git a/tests/test_svg.nim b/tests/test_svg.nim index 435fbae..9356964 100644 --- a/tests/test_svg.nim +++ b/tests/test_svg.nim @@ -1,6 +1,12 @@ import pixie/fileformats/svg, pixie, strformat const files = [ + "line01", + "polyline01", + "polygon01", + "rect01", + "rect02", + "circle01", "triangle01", "quad01", "Ghostscript_Tiger"