@@ -186,22 +186,35 @@ proc draw(
186186 if ctx.stroke != ColorRGBA () and ctx.strokeWidth > 0 :
187187 img.strokePath (path, ctx.stroke, ctx.strokeWidth, ctx.transform)
188188
189- of " circle" :
189+ of " circle" , " ellipse " :
190190 # Reference for magic constant:
191191 # https://dl3.pushbulletusercontent.com/a3fLVC8boTzRoxevD1OgCzRzERB9z2EZ/unknown.png
192- let
193- ctx = decodeCtx (ctxStack[^ 1 ], node)
192+ let ctx = decodeCtx (ctxStack[^ 1 ], node)
193+
194+ var cx, cy: float32 # Default to 0.0 unless set by cx and cy on node
195+ if node.attr (" cx" ) != " " :
194196 cx = parseFloat (node.attr (" cx" ))
197+ if node.attr (" cy" ) != " " :
195198 cy = parseFloat (node.attr (" cy" ))
196- r = parseFloat (node.attr (" r" ))
197- magic = (4.0 * (- 1.0 + sqrt (2.0 )) / 3 ) * r
199+
200+ var rx, ry: float32
201+ if node.tag == " circle" :
202+ rx = parseFloat (node.attr (" r" ))
203+ ry = rx
204+ else :
205+ rx = parseFloat (node.attr (" rx" ))
206+ ry = parseFloat (node.attr (" ry" ))
207+
208+ let
209+ magicX = (4.0 * (- 1.0 + sqrt (2.0 )) / 3 ) * rx
210+ magicY = (4.0 * (- 1.0 + sqrt (2.0 )) / 3 ) * ry
198211
199212 let path = newPath ()
200- path.moveTo (cx + r , cy)
201- path.bezierCurveTo (cx + r , cy + magic , cx + magic , cy + r , cx, cy + r )
202- path.bezierCurveTo (cx - magic , cy + r , cx - r , cy + magic , cx - r , cy)
203- path.bezierCurveTo (cx - r , cy - magic , cx - magic , cy - r , cx, cy - r )
204- path.bezierCurveTo (cx + magic , cy - r , cx + r , cy - magic , cx + r , cy)
213+ path.moveTo (cx + rx , cy)
214+ path.bezierCurveTo (cx + rx , cy + magicY , cx + magicX , cy + ry , cx, cy + ry )
215+ path.bezierCurveTo (cx - magicX , cy + ry , cx - rx , cy + magicY , cx - rx , cy)
216+ path.bezierCurveTo (cx - rx , cy - magicY , cx - magicX , cy - ry , cx, cy - ry )
217+ path.bezierCurveTo (cx + magicX , cy - ry , cx + rx , cy - magicY , cx + rx , cy)
205218 path.closePath ()
206219
207220 let d = $ path
0 commit comments