Skip to content

Commit 6f37f04

Browse files
committed
support ellipse
1 parent 4b43307 commit 6f37f04

4 files changed

Lines changed: 44 additions & 10 deletions

File tree

src/pixie/fileformats/svg.nim

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

tests/images/svg/ellipse01.png

23.9 KB
Loading

tests/images/svg/ellipse01.svg

Lines changed: 20 additions & 0 deletions
Loading

tests/test_svg.nim

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const files = [
77
"rect01",
88
"rect02",
99
"circle01",
10+
"ellipse01",
1011
"triangle01",
1112
"quad01",
1213
"Ghostscript_Tiger"

0 commit comments

Comments
 (0)