diff --git a/examples/tiger.png b/examples/tiger.png index a92d166..21f7ce0 100644 Binary files a/examples/tiger.png and b/examples/tiger.png differ diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index 6ba6eb5..bc0c995 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -807,7 +807,7 @@ proc commandsToShapes*(path: Path, pixelScale: float32 = 1.0): seq[seq[Vec2]] = of Move: if shape.len > 0: result.add(shape) - shape.setLen(0) + shape = newSeq[Vec2]() at.x = command.numbers[0] at.y = command.numbers[1] start = at @@ -881,7 +881,7 @@ proc commandsToShapes*(path: Path, pixelScale: float32 = 1.0): seq[seq[Vec2]] = of RMove: if shape.len > 0: result.add(shape) - shape.setLen(0) + shape = newSeq[Vec2]() at.x += command.numbers[0] at.y += command.numbers[1] start = at @@ -959,7 +959,7 @@ proc commandsToShapes*(path: Path, pixelScale: float32 = 1.0): seq[seq[Vec2]] = at = start if shape.len > 0: result.add(shape) - shape.setLen(0) + shape = newSeq[Vec2]() prevCommandKind = command.kind @@ -995,8 +995,8 @@ proc computePixelBounds(segments: seq[(Segment, int16)]): Rect = for (segment, _) in segments: xMin = min(xMin, min(segment.at.x, segment.to.x)) xMax = max(xMax, max(segment.at.x, segment.to.x)) - yMin = min(yMin, min(segment.at.y, segment.to.y)) - yMax = max(yMax, max(segment.at.y, segment.to.y)) + yMin = min(yMin, segment.at.y) + yMax = max(yMax, segment.to.y) xMin = floor(xMin) xMax = ceil(xMax) @@ -1071,6 +1071,16 @@ proc quickSort(a: var seq[(float32, int16)], inl, inr: int) = quickSort(a, inl, r) quickSort(a, l, inr) +proc insertionSort(s: var seq[(float32, int16)], hi: int) {.inline.} = + for i in 1 .. hi: + var + j = i - 1 + k = i + while j >= 0 and s[j][0] > s[k][0]: + swap(s[j + 1], s[j]) + dec j + dec k + proc shouldFill(windingRule: WindingRule, count: int): bool {.inline.} = ## Should we fill based on the current winding rule and count? case windingRule: @@ -1113,7 +1123,10 @@ template computeCoverages( hits[numHits] = (min(at.x, size.x), winding) inc numHits - quickSort(hits, 0, numHits - 1) + if hits.len > 32: + quickSort(hits, 0, numHits - 1) + else: + insertionSort(hits, numHits - 1) var prevAt: float32 diff --git a/tests/images/svg/Ghostscript_Tiger.png b/tests/images/svg/Ghostscript_Tiger.png index bf8f8a2..3908147 100644 Binary files a/tests/images/svg/Ghostscript_Tiger.png and b/tests/images/svg/Ghostscript_Tiger.png differ diff --git a/tests/images/svg/circle01.png b/tests/images/svg/circle01.png index fac810b..14fb41d 100644 Binary files a/tests/images/svg/circle01.png and b/tests/images/svg/circle01.png differ diff --git a/tests/images/svg/ellipse01.png b/tests/images/svg/ellipse01.png index 23d454c..c06bfb8 100644 Binary files a/tests/images/svg/ellipse01.png and b/tests/images/svg/ellipse01.png differ diff --git a/tests/images/svg/emojitwo.png b/tests/images/svg/emojitwo.png index 05177dc..81a5666 100644 Binary files a/tests/images/svg/emojitwo.png and b/tests/images/svg/emojitwo.png differ diff --git a/tests/images/svg/flat-color-icons.png b/tests/images/svg/flat-color-icons.png index 2be16bc..5597525 100644 Binary files a/tests/images/svg/flat-color-icons.png and b/tests/images/svg/flat-color-icons.png differ diff --git a/tests/images/svg/ionicons.png b/tests/images/svg/ionicons.png index f53bbd0..2025b35 100644 Binary files a/tests/images/svg/ionicons.png and b/tests/images/svg/ionicons.png differ diff --git a/tests/images/svg/miterlimit.png b/tests/images/svg/miterlimit.png index d36784d..75da14b 100644 Binary files a/tests/images/svg/miterlimit.png and b/tests/images/svg/miterlimit.png differ diff --git a/tests/images/svg/noto-emoji.png b/tests/images/svg/noto-emoji.png index 9f93974..6c9492b 100644 Binary files a/tests/images/svg/noto-emoji.png and b/tests/images/svg/noto-emoji.png differ diff --git a/tests/images/svg/openmoji.png b/tests/images/svg/openmoji.png index 2038f0d..c7deb8e 100644 Binary files a/tests/images/svg/openmoji.png and b/tests/images/svg/openmoji.png differ diff --git a/tests/images/svg/polygon01.png b/tests/images/svg/polygon01.png index c7fe070..7a43fe1 100644 Binary files a/tests/images/svg/polygon01.png and b/tests/images/svg/polygon01.png differ diff --git a/tests/images/svg/quad01.png b/tests/images/svg/quad01.png index 9722cce..ec45624 100644 Binary files a/tests/images/svg/quad01.png and b/tests/images/svg/quad01.png differ diff --git a/tests/images/svg/rect02.png b/tests/images/svg/rect02.png index 90f9702..accf977 100644 Binary files a/tests/images/svg/rect02.png and b/tests/images/svg/rect02.png differ diff --git a/tests/images/svg/simple-icons.png b/tests/images/svg/simple-icons.png index de85d50..2233473 100644 Binary files a/tests/images/svg/simple-icons.png and b/tests/images/svg/simple-icons.png differ diff --git a/tests/images/svg/tabler-icons.png b/tests/images/svg/tabler-icons.png index c27a0dc..e041516 100644 Binary files a/tests/images/svg/tabler-icons.png and b/tests/images/svg/tabler-icons.png differ diff --git a/tests/images/svg/triangle01.png b/tests/images/svg/triangle01.png index 994bc97..b521dbf 100644 Binary files a/tests/images/svg/triangle01.png and b/tests/images/svg/triangle01.png differ diff --git a/tests/images/svg/twbs-icons.png b/tests/images/svg/twbs-icons.png index 5f5ac82..e9638de 100644 Binary files a/tests/images/svg/twbs-icons.png and b/tests/images/svg/twbs-icons.png differ diff --git a/tests/images/svg/twemoji.png b/tests/images/svg/twemoji.png index 441a234..bfd58d4 100644 Binary files a/tests/images/svg/twemoji.png and b/tests/images/svg/twemoji.png differ