From c0b74fbc7322b09f1c6ae624430d422d319f19b6 Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Fri, 3 Dec 2021 17:02:10 -0600 Subject: [PATCH 1/3] f --- src/pixie/images.nim | 6 +++--- src/pixie/masks.nim | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/pixie/images.nim b/src/pixie/images.nim index d8737ee..529d066 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -95,7 +95,7 @@ proc setColor*(image: Image, x, y: int, color: Color) {.inline, raises: [].} = proc fillUnsafe*( data: var seq[ColorRGBX], color: SomeColor, start, len: int ) {.raises: [].} = - ## Fills the image data with the parameter color starting at index start and + ## Fills the image data with the color starting at index start and ## continuing for len indices. let rgbx = color.asRgbx() @@ -126,7 +126,7 @@ proc fillUnsafe*( data[j] = rgbx proc fill*(image: Image, color: SomeColor) {.inline, raises: [].} = - ## Fills the image with the parameter color. + ## Fills the image with the color. fillUnsafe(image.data, color, 0, image.data.len) proc isOneColor*(image: Image): bool {.raises: [].} = @@ -565,7 +565,7 @@ proc blur*( image.setRgbaUnsafe(x, y, rgbx(values)) proc newMask*(image: Image): Mask {.raises: [PixieError].} = - ## Returns a new mask using the alpha values of the parameter image. + ## Returns a new mask using the alpha values of the image. result = newMask(image.width, image.height) var i: int diff --git a/src/pixie/masks.nim b/src/pixie/masks.nim index ac8a7a6..c09607e 100644 --- a/src/pixie/masks.nim +++ b/src/pixie/masks.nim @@ -172,12 +172,12 @@ proc magnifyBy2*(mask: Mask, power = 1): Mask {.raises: [PixieError].} = proc fillUnsafe*( data: var seq[uint8], value: uint8, start, len: int ) {.raises: [].} = - ## Fills the mask data with the parameter value starting at index start and + ## Fills the mask data with the value starting at index start and ## continuing for len indices. nimSetMem(data[start].addr, value.cint, len) proc fill*(mask: Mask, value: uint8) {.inline, raises: [].} = - ## Fills the mask with the parameter value. + ## Fills the mask with the value. fillUnsafe(mask.data, value, 0, mask.data.len) proc getValueSmooth*(mask: Mask, x, y: float32): uint8 {.raises: [].} = From 0671bc9516744befdb4be4be1e2d19c5ff96460b Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Fri, 3 Dec 2021 19:15:47 -0600 Subject: [PATCH 2/3] faster non-simd path --- src/pixie/paths.nim | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index 6352457..8a55446 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -2550,10 +2550,13 @@ proc fillImage( let channels = [rgbx.r.uint32, rgbx.g.uint32, rgbx.b.uint32, rgbx.a.uint32] for i in i ..< result.data.len: let coverage = mask.data[i] - result.data[i].r = ((channels[0] * coverage) div 255).uint8 - result.data[i].g = ((channels[1] * coverage) div 255).uint8 - result.data[i].b = ((channels[2] * coverage) div 255).uint8 - result.data[i].a = ((channels[3] * coverage) div 255).uint8 + if coverage == 255: + result.data[i] = rgbx + elif coverage != 0: + result.data[i].r = ((channels[0] * coverage) div 255).uint8 + result.data[i].g = ((channels[1] * coverage) div 255).uint8 + result.data[i].b = ((channels[2] * coverage) div 255).uint8 + result.data[i].a = ((channels[3] * coverage) div 255).uint8 proc fillImage*( path: SomePath, width, height: int, color: SomeColor, windingRule = wrNonZero From cee2f7ec3a0347f8845b0301245a1fbfccd4846b Mon Sep 17 00:00:00 2001 From: Ryan Oldenburg Date: Fri, 3 Dec 2021 19:30:03 -0600 Subject: [PATCH 3/3] add path.fillImage test --- tests/paths/pathHeart2.png | Bin 0 -> 2440 bytes tests/test_paths.nim | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 tests/paths/pathHeart2.png diff --git a/tests/paths/pathHeart2.png b/tests/paths/pathHeart2.png new file mode 100644 index 0000000000000000000000000000000000000000..560cd6648020522cf54e28e701015f4cfddca69c GIT binary patch literal 2440 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