From 4765f55716ffdff87a76578909d29735281c47a4 Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Sat, 14 Nov 2026 03:40:07 -0800 Subject: [PATCH] Continue the dash pattern across stroke segments Signed-off-by: Sai Asish Y --- src/pixie/paths.nim | 23 +++++++++++++---------- tests/test_paths.nim | 7 +++++++ 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index b201a919..bfb121ec 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -2054,6 +2054,9 @@ proc strokeShapes( if d <= 0.0: raise newException(PixieError, "Invalid line dash value") + var + dashIndex = 0 + dashRemaining = if dashes.len > 0: dashes[0] else: 0.float32 for i in 1 ..< shape.len: let pos = shape[i] @@ -2063,16 +2066,16 @@ proc strokeShapes( var distance = dist(prevPos, pos) let dir = dir(pos, prevPos) var currPos = prevPos - block dashLoop: - while true: - for i, d in dashes: - if i mod 2 == 0: - let d = min(distance, d) - shapeStroke.add(makeRect(currPos, currPos + dir * d)) - currPos += dir * d - distance -= d - if distance <= 0: - break dashLoop + while distance > 0: + let d = min(distance, dashRemaining) + if dashIndex mod 2 == 0: + shapeStroke.add(makeRect(currPos, currPos + dir * d)) + currPos += dir * d + distance -= d + dashRemaining -= d + if dashRemaining <= 0: + dashIndex = (dashIndex + 1) mod dashes.len + dashRemaining = dashes[dashIndex] else: shapeStroke.add(makeRect(prevPos, pos)) diff --git a/tests/test_paths.nim b/tests/test_paths.nim index e8ebf5cd..a403f9f9 100644 --- a/tests/test_paths.nim +++ b/tests/test_paths.nim @@ -287,6 +287,13 @@ block: image.xray("tests/paths/dashes.png") +block: + # The dash pattern continues across segments instead of restarting. + let path = parsePath("M 0 0 L 3 0 L 6 0 L 9 0 L 12 0") + + doAssert path.strokeOverlaps(vec2(2, 0), dashes = @[4.float32, 4]) + doAssert not path.strokeOverlaps(vec2(5, 0), dashes = @[4.float32, 4]) + block: proc miterTest(angle, limit: float32) = let