From db2ad644d33ee5c15970a0899a67f6a0e361b924 Mon Sep 17 00:00:00 2001 From: treeform Date: Wed, 15 Apr 2026 15:37:15 -0700 Subject: [PATCH 1/3] Use the new vmath v3 with CCW angles. --- src/pixie/contexts.nim | 2 +- src/pixie/fileformats/svg.nim | 2 +- src/pixie/paints.nim | 2 +- src/pixie/paths.nim | 2 +- tests/test_images_draw.nim | 20 ++++++++++---------- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/pixie/contexts.nim b/src/pixie/contexts.nim index 87822b9c..b5f0ce91 100644 --- a/src/pixie/contexts.nim +++ b/src/pixie/contexts.nim @@ -551,7 +551,7 @@ proc scale*(ctx: Context, x, y: float32) {.inline, raises: [].} = proc rotate*(ctx: Context, angle: float32) {.inline, raises: [].} = ## Adds a rotation to the transformation matrix. - ctx.mat = ctx.mat * rotate(-angle) + ctx.mat = ctx.mat * rotate(angle) proc resetTransform*(ctx: Context) {.inline, raises: [].} = ## Resets the current transform to the identity matrix. diff --git a/src/pixie/fileformats/svg.nim b/src/pixie/fileformats/svg.nim index ac01734b..047566ee 100644 --- a/src/pixie/fileformats/svg.nim +++ b/src/pixie/fileformats/svg.nim @@ -277,7 +277,7 @@ proc parseSvgProperties(node: XmlNode, inherited: SvgProperties): SvgProperties elif f.startsWith("rotate("): let values = splitArgs(f[7 .. ^2]) - angle: float32 = parseFloat(values[0]) * -PI / 180 + angle: float32 = parseFloat(values[0]) * PI / 180 var cx, cy: float32 if values.len > 1: cx = parseFloat(values[1]) diff --git a/src/pixie/paints.nim b/src/pixie/paints.nim index 530932c0..203ae511 100644 --- a/src/pixie/paints.nim +++ b/src/pixie/paints.nim @@ -198,7 +198,7 @@ proc fillGradientRadial(image: Image, paint: Paint) = gradientAngle = normalize(center - edge).angle().fixAngle() mat = ( translate(center) * - rotate(-gradientAngle) * + rotate(gradientAngle) * scale(vec2(distanceX, distanceY)) ).inverse() for y in 0 ..< image.height: diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index 69a9635e..b0aa3d02 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -839,7 +839,7 @@ proc commandsToShapes( ArcParams( radii: radii, - rotMat: rotate(-radians), + rotMat: rotate(radians), center: center, theta: theta, delta: delta diff --git a/tests/test_images_draw.nim b/tests/test_images_draw.nim index e154d5c2..493584a1 100644 --- a/tests/test_images_draw.nim +++ b/tests/test_images_draw.nim @@ -17,7 +17,7 @@ block: a.fill(rgba(255, 0, 0, 255)) b.fill(rgba(0, 255, 0, 255)) - a.draw(b, translate(vec2(250, 250)) * rotate(90 * PI.float32 / 180)) + a.draw(b, translate(vec2(250, 250)) * rotate(-90 * PI.float32 / 180)) a.xray("tests/images/rotate90.png") block: @@ -27,7 +27,7 @@ block: a.fill(rgba(255, 0, 0, 255)) b.fill(rgba(0, 255, 0, 255)) - a.draw(b, translate(vec2(250, 250)) * rotate(180 * PI.float32 / 180)) + a.draw(b, translate(vec2(250, 250)) * rotate(-180 * PI.float32 / 180)) a.xray("tests/images/rotate180.png") block: @@ -37,7 +37,7 @@ block: a.fill(rgba(255, 0, 0, 255)) b.fill(rgba(0, 255, 0, 255)) - a.draw(b, translate(vec2(250, 250)) * rotate(270 * PI.float32 / 180)) + a.draw(b, translate(vec2(250, 250)) * rotate(-270 * PI.float32 / 180)) a.xray("tests/images/rotate270.png") block: @@ -47,7 +47,7 @@ block: a.fill(rgba(255, 0, 0, 255)) b.fill(rgba(0, 255, 0, 255)) - a.draw(b, translate(vec2(250, 250)) * rotate(360 * PI.float32 / 180)) + a.draw(b, translate(vec2(250, 250)) * rotate(-360 * PI.float32 / 180)) a.xray("tests/images/rotate360.png") block: @@ -143,7 +143,7 @@ block: b = newImage(50, 50) a.fill(rgba(255, 255, 255, 255)) b.fill(rgbx(0, 0, 0, 255)) - a.draw(b, translate(vec2(0, 50)) * rotate(45.toRadians)) + a.draw(b, translate(vec2(0, 50)) * rotate(-45.toRadians)) a.xray("tests/images/masters/smooth2.png") block: @@ -170,7 +170,7 @@ block: b = newImage(10, 10) a.fill(rgba(255, 255, 255, 255)) b.fill(rgbx(255, 0, 0, 255)) - let m = translate(vec2(50, 50)) * rotate(30.toRadians) + let m = translate(vec2(50, 50)) * rotate(-30.toRadians) a.draw(b, m) a.xray("tests/images/masters/smooth5.png") @@ -179,7 +179,7 @@ block: a = newImage(100, 100) b = readImage(&"tests/images/turtle.png") a.fill(rgba(255, 255, 255, 255)) - let m = translate(vec2(50, 50)) * rotate(30.toRadians) + let m = translate(vec2(50, 50)) * rotate(-30.toRadians) a.draw(b, m) a.xray("tests/images/masters/smooth6.png") @@ -188,7 +188,7 @@ block: a = newImage(100, 100) b = readImage(&"tests/images/turtle@10x.png") a.fill(rgba(255, 255, 255, 255)) - let m = translate(vec2(50, 50)) * rotate(30.toRadians) * scale(vec2(0.1, 0.1)) + let m = translate(vec2(50, 50)) * rotate(-30.toRadians) * scale(vec2(0.1, 0.1)) a.draw(b, m) a.xray("tests/images/masters/smooth7.png") @@ -225,7 +225,7 @@ block: b = readImage(&"tests/images/turtle.png") a.fill(rgba(255, 255, 255, 255)) let m = translate(vec2(-43.29, -103.87)) * - rotate(-15.toRadians) * + rotate(15.toRadians) * scale(vec2(263.86/40, 263.86/40)) a.draw(b, m) a.xray("tests/images/masters/smooth11.png") @@ -235,7 +235,7 @@ block: a = newImage(100, 100) b = readImage(&"tests/images/turtle.png") a.fill(rgba(255, 255, 255, 255)) - let m = translate(vec2(50, 50)) * rotate(-5.toRadians) + let m = translate(vec2(50, 50)) * rotate(5.toRadians) a.draw(b, m * translate(vec2(0, 0))) a.draw(b, m * translate(vec2(-40, 0))) a.draw(b, m * translate(vec2(-40, -40))) From 0a4ec76d6922529dec526775d708c201a8165ffa Mon Sep 17 00:00:00 2001 From: treeform Date: Wed, 15 Apr 2026 17:45:25 -0700 Subject: [PATCH 2/3] 6.0.0 --- pixie.nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixie.nimble b/pixie.nimble index ce4bd9c2..2c3d3a9e 100644 --- a/pixie.nimble +++ b/pixie.nimble @@ -1,4 +1,4 @@ -version = "5.1.0" +version = "6.0.0" author = "Andre von Houck and Ryan Oldenburg" description = "Full-featured 2d graphics library for Nim." license = "MIT" From 7973f61a3fdd7c49617ebbf4715a5fb941020816 Mon Sep 17 00:00:00 2001 From: treeform Date: Wed, 15 Apr 2026 18:04:11 -0700 Subject: [PATCH 3/3] vmath >= 3.0.0 --- pixie.nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pixie.nimble b/pixie.nimble index 2c3d3a9e..6903560c 100644 --- a/pixie.nimble +++ b/pixie.nimble @@ -6,7 +6,7 @@ license = "MIT" srcDir = "src" requires "nim >= 1.4.8" -requires "vmath >= 1.1.4" +requires "vmath >= 3.0.0" requires "chroma >= 0.2.6" requires "zippy >= 0.10.3" requires "flatty >= 0.3.4"