diff --git a/src/pixie/common.nim b/src/pixie/common.nim index f5586663..902d55fb 100644 --- a/src/pixie/common.nim +++ b/src/pixie/common.nim @@ -56,18 +56,13 @@ proc copy*(image: Image): Image {.raises: [].} = template dataIndex*(image: Image, x, y: int): int = image.width * y + x -proc mix*(a, b: uint8, t: float32): uint8 {.inline, raises: [].} = - ## Linearly interpolate between a and b using t. - let t = round(t * 255).uint32 - ((a * (255 - t) + b * t) div 255).uint8 - proc mix*(a, b: ColorRGBX, t: float32): ColorRGBX {.inline, raises: [].} = ## Linearly interpolate between a and b using t. let x = round(t * 255).uint32 - result.r = ((a.r.uint32 * (255 - x) + b.r.uint32 * x) div 255).uint8 - result.g = ((a.g.uint32 * (255 - x) + b.g.uint32 * x) div 255).uint8 - result.b = ((a.b.uint32 * (255 - x) + b.b.uint32 * x) div 255).uint8 - result.a = ((a.a.uint32 * (255 - x) + b.a.uint32 * x) div 255).uint8 + result.r = ((a.r.uint32 * (255 - x) + b.r.uint32 * x + 127) div 255).uint8 + result.g = ((a.g.uint32 * (255 - x) + b.g.uint32 * x + 127) div 255).uint8 + result.b = ((a.b.uint32 * (255 - x) + b.b.uint32 * x + 127) div 255).uint8 + result.a = ((a.a.uint32 * (255 - x) + b.a.uint32 * x + 127) div 255).uint8 proc `*`*(color: ColorRGBX, opacity: float32): ColorRGBX {.raises: [].} = if opacity == 0: @@ -75,10 +70,10 @@ proc `*`*(color: ColorRGBX, opacity: float32): ColorRGBX {.raises: [].} = else: let x = round(opacity * 255).uint32 - r = ((color.r * x) div 255).uint8 - g = ((color.g * x) div 255).uint8 - b = ((color.b * x) div 255).uint8 - a = ((color.a * x) div 255).uint8 + r = ((color.r * x + 127) div 255).uint8 + g = ((color.g * x + 127) div 255).uint8 + b = ((color.b * x + 127) div 255).uint8 + a = ((color.a * x + 127) div 255).uint8 rgbx(r, g, b, a) proc snapToPixels*(rect: Rect): Rect {.raises: [].} = diff --git a/src/pixie/images.nim b/src/pixie/images.nim index 82120401..bcce99be 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -192,10 +192,10 @@ proc minifyBy2*( c = src.data[bottomRowStart + x * 2 + 1] d = src.data[bottomRowStart + x * 2] mixed = rgbx( - ((a.r.uint32 + b.r + c.r + d.r) div 4).uint8, - ((a.g.uint32 + b.g + c.g + d.g) div 4).uint8, - ((a.b.uint32 + b.b + c.b + d.b) div 4).uint8, - ((a.a.uint32 + b.a + c.a + d.a) div 4).uint8 + ((a.r.uint32 + b.r + c.r + d.r + 2) div 4).uint8, + ((a.g.uint32 + b.g + c.g + d.g + 2) div 4).uint8, + ((a.b.uint32 + b.b + c.b + d.b + 2) div 4).uint8, + ((a.a.uint32 + b.a + c.a + d.a + 2) div 4).uint8 ) result.data[result.dataIndex(x, y)] = mixed diff --git a/src/pixie/simd/avx2.nim b/src/pixie/simd/avx2.nim index 6b652d0f..db06db85 100644 --- a/src/pixie/simd/avx2.nim +++ b/src/pixie/simd/avx2.nim @@ -296,6 +296,7 @@ proc minifyBy2Avx2*(image: Image, power = 1): Image {.simd.} = ) let oddMask = mm256_set1_epi16(0xff00) + vec2 = mm256_set1_epi16(2) permuteControl = mm256_set_epi32(7, 7, 7, 7, 6, 4, 2, 0) for y in 0 ..< resultEvenHeight: let @@ -323,8 +324,10 @@ proc minifyBy2Avx2*(image: Image, power = 1): Image {.simd.} = bottomAddedOdd = mm256_add_epi16(bottomOdd, bottomShiftedOdd) addedEven = mm256_add_epi16(topAddedEven, bottomAddedEven) addedOdd = mm256_add_epi16(topAddedOdd, bottomAddedOdd) - addedEvenDiv4 = mm256_srli_epi16(addedEven, 2) - addedOddDiv4 = mm256_srli_epi16(addedOdd, 2) + addedEvenRounding = mm256_add_epi16(addedEven, vec2) + addedOddRounding = mm256_add_epi16(addedOdd, vec2) + addedEvenDiv4 = mm256_srli_epi16(addedEvenRounding, 2) + addedOddDiv4 = mm256_srli_epi16(addedOddRounding, 2) merged = mm256_or_si256(addedEvenDiv4, mm256_slli_epi16(addedOddDiv4, 8)) # Merged has the correct values for the next two pixels at # index 0, 2, 4, 6 so permute into position and store @@ -342,10 +345,10 @@ proc minifyBy2Avx2*(image: Image, power = 1): Image {.simd.} = c = src.data[bottomRowStart + x * 2 + 1] d = src.data[bottomRowStart + x * 2] mixed = rgbx( - ((a.r.uint32 + b.r + c.r + d.r) div 4).uint8, - ((a.g.uint32 + b.g + c.g + d.g) div 4).uint8, - ((a.b.uint32 + b.b + c.b + d.b) div 4).uint8, - ((a.a.uint32 + b.a + c.a + d.a) div 4).uint8 + ((a.r.uint32 + b.r + c.r + d.r + 2) div 4).uint8, + ((a.g.uint32 + b.g + c.g + d.g + 2) div 4).uint8, + ((a.b.uint32 + b.b + c.b + d.b + 2) div 4).uint8, + ((a.a.uint32 + b.a + c.a + d.a + 2) div 4).uint8 ) result.data[result.dataIndex(x, y)] = mixed diff --git a/src/pixie/simd/sse2.nim b/src/pixie/simd/sse2.nim index 33db05d9..062b9722 100644 --- a/src/pixie/simd/sse2.nim +++ b/src/pixie/simd/sse2.nim @@ -350,19 +350,33 @@ proc minifyBy2Sse2*(image: Image, power = 1): Image {.simd.} = if srcWidthIsOdd: resultEvenWidth + 1 else: resultEvenWidth, if srcHeightIsOdd: resultEvenHeight + 1 else: resultEvenHeight ) - let oddMask = mm_set1_epi16(0xff00) + let + oddMask = mm_set1_epi16(0xff00) + loMask = mm_set_epi32(0, 0, uint32.high, uint32.high) + hiMask = mm_set_epi32(uint32.high, uint32.high, 0, 0) + vec2 = mm_set1_epi16(2) for y in 0 ..< resultEvenHeight: let topRowStart = src.dataIndex(0, y * 2) bottomRowStart = src.dataIndex(0, y * 2 + 1) + template loadEven(src: Image, idx: int): M128i = + var + a = mm_loadu_si128(src.data[idx].addr) + b = mm_loadu_si128(src.data[idx + 4].addr) + a = mm_shuffle_epi32(a, MM_SHUFFLE(3, 3, 2, 0)) + b = mm_shuffle_epi32(b, MM_SHUFFLE(2, 0, 3, 3)) + a = mm_and_si128(a, loMask) + b = mm_and_si128(b, hiMask) + mm_or_si128(a, b) + var x: int - while x <= resultEvenWidth - 4: + while x <= resultEvenWidth - 9: let - top = mm_loadu_si128(src.data[topRowStart + x * 2].addr) - bottom = mm_loadu_si128(src.data[bottomRowStart + x * 2].addr) - topShifted = mm_srli_si128(top, 4) - bottomShifted = mm_srli_si128(bottom, 4) + top = loadEven(src, topRowStart + x * 2) + bottom = loadEven(src, bottomRowStart + x * 2) + topShifted = loadEven(src, topRowStart + x * 2 + 1) + bottomShifted = loadEven(src, bottomRowStart + x * 2 + 1) topEven = mm_andnot_si128(oddMask, top) topOdd = mm_srli_epi16(top, 8) bottomEven = mm_andnot_si128(oddMask, bottom) @@ -377,15 +391,13 @@ proc minifyBy2Sse2*(image: Image, power = 1): Image {.simd.} = bottomAddedOdd = mm_add_epi16(bottomOdd, bottomShiftedOdd) addedEven = mm_add_epi16(topAddedEven, bottomAddedEven) addedOdd = mm_add_epi16(topAddedOdd, bottomAddedOdd) - addedEvenDiv4 = mm_srli_epi16(addedEven, 2) - addedOddDiv4 = mm_srli_epi16(addedOdd, 2) + addedEvenRounding = mm_add_epi16(addedEven, vec2) + addedOddRounding = mm_add_epi16(addedOdd, vec2) + addedEvenDiv4 = mm_srli_epi16(addedEvenRounding, 2) + addedOddDiv4 = mm_srli_epi16(addedOddRounding, 2) merged = mm_or_si128(addedEvenDiv4, mm_slli_epi16(addedOddDiv4, 8)) - # Merged has the correct values for the next two pixels at - # index 0 and 2 so shift 0 and 2 into position and store - shuffled = mm_shuffle_epi32(merged, MM_SHUFFLE(3, 3, 2, 0)) - lower = mm_cvtsi128_si64(shuffled) - copyMem(result.data[result.dataIndex(x, y)].addr, lower.unsafeAddr, 8) - x += 2 + mm_storeu_si128(result.data[result.dataIndex(x, y)].addr, merged) + x += 4 for x in x ..< resultEvenWidth: let @@ -394,10 +406,10 @@ proc minifyBy2Sse2*(image: Image, power = 1): Image {.simd.} = c = src.data[bottomRowStart + x * 2 + 1] d = src.data[bottomRowStart + x * 2] mixed = rgbx( - ((a.r.uint32 + b.r + c.r + d.r) div 4).uint8, - ((a.g.uint32 + b.g + c.g + d.g) div 4).uint8, - ((a.b.uint32 + b.b + c.b + d.b) div 4).uint8, - ((a.a.uint32 + b.a + c.a + d.a) div 4).uint8 + ((a.r.uint32 + b.r + c.r + d.r + 2) div 4).uint8, + ((a.g.uint32 + b.g + c.g + d.g + 2) div 4).uint8, + ((a.b.uint32 + b.b + c.b + d.b + 2) div 4).uint8, + ((a.a.uint32 + b.a + c.a + d.a + 2) div 4).uint8 ) result.data[result.dataIndex(x, y)] = mixed diff --git a/tests/contexts/beginPath_1.png b/tests/contexts/beginPath_1.png index 3f290771..5fb5d110 100644 Binary files a/tests/contexts/beginPath_1.png and b/tests/contexts/beginPath_1.png differ diff --git a/tests/contexts/bezierCurveTo_1.png b/tests/contexts/bezierCurveTo_1.png index 631c3f05..a06bc299 100644 Binary files a/tests/contexts/bezierCurveTo_1.png and b/tests/contexts/bezierCurveTo_1.png differ diff --git a/tests/contexts/bezierCurveTo_2.png b/tests/contexts/bezierCurveTo_2.png index e180f47c..a3883493 100644 Binary files a/tests/contexts/bezierCurveTo_2.png and b/tests/contexts/bezierCurveTo_2.png differ diff --git a/tests/contexts/blendmode_1.png b/tests/contexts/blendmode_1.png index a34bcddb..5dfe68d8 100644 Binary files a/tests/contexts/blendmode_1.png and b/tests/contexts/blendmode_1.png differ diff --git a/tests/contexts/clearRect_1.png b/tests/contexts/clearRect_1.png index 789d9481..199e747e 100644 Binary files a/tests/contexts/clearRect_1.png and b/tests/contexts/clearRect_1.png differ diff --git a/tests/contexts/clip_1.png b/tests/contexts/clip_1.png index c7f7a7d7..180473d2 100644 Binary files a/tests/contexts/clip_1.png and b/tests/contexts/clip_1.png differ diff --git a/tests/contexts/clip_1b.png b/tests/contexts/clip_1b.png index dd9b0d4b..7394700d 100644 Binary files a/tests/contexts/clip_1b.png and b/tests/contexts/clip_1b.png differ diff --git a/tests/contexts/clip_1c.png b/tests/contexts/clip_1c.png index b86e4b83..d180c83f 100644 Binary files a/tests/contexts/clip_1c.png and b/tests/contexts/clip_1c.png differ diff --git a/tests/contexts/clip_1d.png b/tests/contexts/clip_1d.png index 8546cf8e..8e8649ed 100644 Binary files a/tests/contexts/clip_1d.png and b/tests/contexts/clip_1d.png differ diff --git a/tests/contexts/clip_1e.png b/tests/contexts/clip_1e.png index b86e4b83..d180c83f 100644 Binary files a/tests/contexts/clip_1e.png and b/tests/contexts/clip_1e.png differ diff --git a/tests/contexts/clip_1f.png b/tests/contexts/clip_1f.png index aced6c90..3e37d4de 100644 Binary files a/tests/contexts/clip_1f.png and b/tests/contexts/clip_1f.png differ diff --git a/tests/contexts/clip_2.png b/tests/contexts/clip_2.png index a2fba6be..16dba552 100644 Binary files a/tests/contexts/clip_2.png and b/tests/contexts/clip_2.png differ diff --git a/tests/contexts/clip_3.png b/tests/contexts/clip_3.png index 29e4a161..5b137c9c 100644 Binary files a/tests/contexts/clip_3.png and b/tests/contexts/clip_3.png differ diff --git a/tests/contexts/clip_text.png b/tests/contexts/clip_text.png index 7a1f1794..fbcb8dec 100644 Binary files a/tests/contexts/clip_text.png and b/tests/contexts/clip_text.png differ diff --git a/tests/contexts/closePath_1.png b/tests/contexts/closePath_1.png index 0b43e542..e2e6866a 100644 Binary files a/tests/contexts/closePath_1.png and b/tests/contexts/closePath_1.png differ diff --git a/tests/contexts/draw_image.png b/tests/contexts/draw_image.png index 6d28b003..d006de58 100644 Binary files a/tests/contexts/draw_image.png and b/tests/contexts/draw_image.png differ diff --git a/tests/contexts/draw_image_rhino.png b/tests/contexts/draw_image_rhino.png index 9eb35137..cb9f2e3b 100644 Binary files a/tests/contexts/draw_image_rhino.png and b/tests/contexts/draw_image_rhino.png differ diff --git a/tests/contexts/draw_image_rhino2.png b/tests/contexts/draw_image_rhino2.png index 9eb35137..cb9f2e3b 100644 Binary files a/tests/contexts/draw_image_rhino2.png and b/tests/contexts/draw_image_rhino2.png differ diff --git a/tests/contexts/draw_image_scaled.png b/tests/contexts/draw_image_scaled.png index 530fcdc6..a873cf43 100644 Binary files a/tests/contexts/draw_image_scaled.png and b/tests/contexts/draw_image_scaled.png differ diff --git a/tests/contexts/draw_image_self_scaled.png b/tests/contexts/draw_image_self_scaled.png index 3a8f8080..63c20f2e 100644 Binary files a/tests/contexts/draw_image_self_scaled.png and b/tests/contexts/draw_image_self_scaled.png differ diff --git a/tests/contexts/draw_image_translated.png b/tests/contexts/draw_image_translated.png index 6d28b003..d006de58 100644 Binary files a/tests/contexts/draw_image_translated.png and b/tests/contexts/draw_image_translated.png differ diff --git a/tests/contexts/ellipse_1.png b/tests/contexts/ellipse_1.png index d6b093f6..791c358a 100644 Binary files a/tests/contexts/ellipse_1.png and b/tests/contexts/ellipse_1.png differ diff --git a/tests/contexts/fillText_1.png b/tests/contexts/fillText_1.png index 5b7b6f57..44304da8 100644 Binary files a/tests/contexts/fillText_1.png and b/tests/contexts/fillText_1.png differ diff --git a/tests/contexts/fill_1.png b/tests/contexts/fill_1.png index bee2902f..43a1c055 100644 Binary files a/tests/contexts/fill_1.png and b/tests/contexts/fill_1.png differ diff --git a/tests/contexts/globalAlpha_1.png b/tests/contexts/globalAlpha_1.png index 8bd414a5..0a4cb478 100644 Binary files a/tests/contexts/globalAlpha_1.png and b/tests/contexts/globalAlpha_1.png differ diff --git a/tests/contexts/moveTo_1.png b/tests/contexts/moveTo_1.png index b5fb3a1b..8dfcf18f 100644 Binary files a/tests/contexts/moveTo_1.png and b/tests/contexts/moveTo_1.png differ diff --git a/tests/contexts/paintSaveRestore.png b/tests/contexts/paintSaveRestore.png index 65e644c7..b1863f01 100644 Binary files a/tests/contexts/paintSaveRestore.png and b/tests/contexts/paintSaveRestore.png differ diff --git a/tests/contexts/quadracticCurveTo_1.png b/tests/contexts/quadracticCurveTo_1.png index 3cc5d991..6b572b9d 100644 Binary files a/tests/contexts/quadracticCurveTo_1.png and b/tests/contexts/quadracticCurveTo_1.png differ diff --git a/tests/contexts/quadracticCurveTo_2.png b/tests/contexts/quadracticCurveTo_2.png index 11828d2f..1f81e53e 100644 Binary files a/tests/contexts/quadracticCurveTo_2.png and b/tests/contexts/quadracticCurveTo_2.png differ diff --git a/tests/contexts/resetTransform_1.png b/tests/contexts/resetTransform_1.png index e0361bf8..66ed8086 100644 Binary files a/tests/contexts/resetTransform_1.png and b/tests/contexts/resetTransform_1.png differ diff --git a/tests/contexts/resetTransform_2.png b/tests/contexts/resetTransform_2.png index 99888243..0498e64a 100644 Binary files a/tests/contexts/resetTransform_2.png and b/tests/contexts/resetTransform_2.png differ diff --git a/tests/contexts/rotate_1.png b/tests/contexts/rotate_1.png index 94b79de7..130f7c20 100644 Binary files a/tests/contexts/rotate_1.png and b/tests/contexts/rotate_1.png differ diff --git a/tests/contexts/save_1.png b/tests/contexts/save_1.png index 52a89f91..3b0e0219 100644 Binary files a/tests/contexts/save_1.png and b/tests/contexts/save_1.png differ diff --git a/tests/contexts/scale_1.png b/tests/contexts/scale_1.png index 2a9b4c81..bd026402 100644 Binary files a/tests/contexts/scale_1.png and b/tests/contexts/scale_1.png differ diff --git a/tests/contexts/setLineDash_1.png b/tests/contexts/setLineDash_1.png index 8b1a13fe..0807706f 100644 Binary files a/tests/contexts/setLineDash_1.png and b/tests/contexts/setLineDash_1.png differ diff --git a/tests/contexts/setTransform_1.png b/tests/contexts/setTransform_1.png index 33a62db9..982d6966 100644 Binary files a/tests/contexts/setTransform_1.png and b/tests/contexts/setTransform_1.png differ diff --git a/tests/contexts/strokeRect_1.png b/tests/contexts/strokeRect_1.png index 387eb9e6..3596f437 100644 Binary files a/tests/contexts/strokeRect_1.png and b/tests/contexts/strokeRect_1.png differ diff --git a/tests/contexts/strokeRect_2.png b/tests/contexts/strokeRect_2.png index ac6888cf..51c26ca0 100644 Binary files a/tests/contexts/strokeRect_2.png and b/tests/contexts/strokeRect_2.png differ diff --git a/tests/contexts/strokeText_1.png b/tests/contexts/strokeText_1.png index 75d26c2f..373a744a 100644 Binary files a/tests/contexts/strokeText_1.png and b/tests/contexts/strokeText_1.png differ diff --git a/tests/contexts/stroke_1.png b/tests/contexts/stroke_1.png index bc91345b..2abd0c0f 100644 Binary files a/tests/contexts/stroke_1.png and b/tests/contexts/stroke_1.png differ diff --git a/tests/contexts/stroke_2.png b/tests/contexts/stroke_2.png index d574fc92..90c7da1f 100644 Binary files a/tests/contexts/stroke_2.png and b/tests/contexts/stroke_2.png differ diff --git a/tests/contexts/stroke_3.png b/tests/contexts/stroke_3.png index b0b162f9..b5e65ade 100644 Binary files a/tests/contexts/stroke_3.png and b/tests/contexts/stroke_3.png differ diff --git a/tests/contexts/textBaseline_1.png b/tests/contexts/textBaseline_1.png index d7333c77..ec93c50e 100644 Binary files a/tests/contexts/textBaseline_1.png and b/tests/contexts/textBaseline_1.png differ diff --git a/tests/contexts/translate_1.png b/tests/contexts/translate_1.png index 0cb8bea0..2dd34472 100644 Binary files a/tests/contexts/translate_1.png and b/tests/contexts/translate_1.png differ diff --git a/tests/fileformats/gif/3x5.png b/tests/fileformats/gif/3x5.png index 5de239e4..b97ea81b 100644 Binary files a/tests/fileformats/gif/3x5.png and b/tests/fileformats/gif/3x5.png differ diff --git a/tests/fileformats/gif/audrey.png b/tests/fileformats/gif/audrey.png index 51853fa5..8c7ce75e 100644 Binary files a/tests/fileformats/gif/audrey.png and b/tests/fileformats/gif/audrey.png differ diff --git a/tests/fileformats/gif/sunflower.png b/tests/fileformats/gif/sunflower.png index cdaaa164..8964f7a3 100644 Binary files a/tests/fileformats/gif/sunflower.png and b/tests/fileformats/gif/sunflower.png differ diff --git a/tests/images/drawEllipse.png b/tests/images/drawEllipse.png index 014b5358..682d26c8 100644 Binary files a/tests/images/drawEllipse.png and b/tests/images/drawEllipse.png differ diff --git a/tests/images/drawPolygon.png b/tests/images/drawPolygon.png index b117fed8..60c74963 100644 Binary files a/tests/images/drawPolygon.png and b/tests/images/drawPolygon.png differ diff --git a/tests/images/drawRect.png b/tests/images/drawRect.png index 7f2e38e0..361346d5 100644 Binary files a/tests/images/drawRect.png and b/tests/images/drawRect.png differ diff --git a/tests/images/drawRoundedRect.png b/tests/images/drawRoundedRect.png index 67f5f9d2..c89d6d1c 100644 Binary files a/tests/images/drawRoundedRect.png and b/tests/images/drawRoundedRect.png differ diff --git a/tests/images/drawSegment.png b/tests/images/drawSegment.png index 54cd5758..bd65ecf4 100644 Binary files a/tests/images/drawSegment.png and b/tests/images/drawSegment.png differ diff --git a/tests/images/fillOptimization.png b/tests/images/fillOptimization.png index 2ed0b3c7..cc2a9896 100644 Binary files a/tests/images/fillOptimization.png and b/tests/images/fillOptimization.png differ diff --git a/tests/images/fillOptimization2.png b/tests/images/fillOptimization2.png index 9960ed87..fed162d9 100644 Binary files a/tests/images/fillOptimization2.png and b/tests/images/fillOptimization2.png differ diff --git a/tests/images/flipped1.png b/tests/images/flipped1.png index 1bfaf150..0226d172 100644 Binary files a/tests/images/flipped1.png and b/tests/images/flipped1.png differ diff --git a/tests/images/flipped2.png b/tests/images/flipped2.png index 078b4d4f..043663ad 100644 Binary files a/tests/images/flipped2.png and b/tests/images/flipped2.png differ diff --git a/tests/images/flipped3.png b/tests/images/flipped3.png index 53da7d7b..11e3c998 100644 Binary files a/tests/images/flipped3.png and b/tests/images/flipped3.png differ diff --git a/tests/images/imageblur20.png b/tests/images/imageblur20.png index c0586c30..ff2778b5 100644 Binary files a/tests/images/imageblur20.png and b/tests/images/imageblur20.png differ diff --git a/tests/images/imageblur20oob.png b/tests/images/imageblur20oob.png index 70cbd9f9..1116ff37 100644 Binary files a/tests/images/imageblur20oob.png and b/tests/images/imageblur20oob.png differ diff --git a/tests/images/magnifiedBy2.png b/tests/images/magnifiedBy2.png index 99610130..1af2e206 100644 Binary files a/tests/images/magnifiedBy2.png and b/tests/images/magnifiedBy2.png differ diff --git a/tests/images/magnifiedBy4.png b/tests/images/magnifiedBy4.png index be43dd6f..d4ecbb06 100644 Binary files a/tests/images/magnifiedBy4.png and b/tests/images/magnifiedBy4.png differ diff --git a/tests/images/minifiedBy2.png b/tests/images/minifiedBy2.png index 5332c037..4ebf7bda 100644 Binary files a/tests/images/minifiedBy2.png and b/tests/images/minifiedBy2.png differ diff --git a/tests/images/minifiedBy4.png b/tests/images/minifiedBy4.png index b14dd8dc..65eb89a9 100644 Binary files a/tests/images/minifiedBy4.png and b/tests/images/minifiedBy4.png differ diff --git a/tests/images/minifiedMandrill.png b/tests/images/minifiedMandrill.png index 2bc2cf5f..86387d9e 100644 Binary files a/tests/images/minifiedMandrill.png and b/tests/images/minifiedMandrill.png differ diff --git a/tests/images/rotate180.png b/tests/images/rotate180.png index f1f9adf6..cc1d384c 100644 Binary files a/tests/images/rotate180.png and b/tests/images/rotate180.png differ diff --git a/tests/images/rotate270.png b/tests/images/rotate270.png index 61395e44..e1822b90 100644 Binary files a/tests/images/rotate270.png and b/tests/images/rotate270.png differ diff --git a/tests/images/rotate360.png b/tests/images/rotate360.png index 57b078f1..901b237e 100644 Binary files a/tests/images/rotate360.png and b/tests/images/rotate360.png differ diff --git a/tests/images/rotate90.png b/tests/images/rotate90.png index c9607ba2..49dedc65 100644 Binary files a/tests/images/rotate90.png and b/tests/images/rotate90.png differ diff --git a/tests/images/scaleHalf.png b/tests/images/scaleHalf.png index 8cd2fd5d..7fb53056 100644 Binary files a/tests/images/scaleHalf.png and b/tests/images/scaleHalf.png differ diff --git a/tests/images/strokeEllipse.png b/tests/images/strokeEllipse.png index f8ada69c..aed7b315 100644 Binary files a/tests/images/strokeEllipse.png and b/tests/images/strokeEllipse.png differ diff --git a/tests/images/strokePolygon.png b/tests/images/strokePolygon.png index b1597d76..839f1b15 100644 Binary files a/tests/images/strokePolygon.png and b/tests/images/strokePolygon.png differ diff --git a/tests/images/strokeRect.png b/tests/images/strokeRect.png index 9936ffd6..58bd2c17 100644 Binary files a/tests/images/strokeRect.png and b/tests/images/strokeRect.png differ diff --git a/tests/images/strokeRoundedRect.png b/tests/images/strokeRoundedRect.png index 3c1b6a84..b0b6e8a6 100644 Binary files a/tests/images/strokeRoundedRect.png and b/tests/images/strokeRoundedRect.png differ diff --git a/tests/images/superimage1.png b/tests/images/superimage1.png index 56eff27d..6cdf08cf 100644 Binary files a/tests/images/superimage1.png and b/tests/images/superimage1.png differ diff --git a/tests/images/superimage2.png b/tests/images/superimage2.png index 2e903a25..a1cf8a56 100644 Binary files a/tests/images/superimage2.png and b/tests/images/superimage2.png differ diff --git a/tests/images/superimage3.png b/tests/images/superimage3.png index c1b5ed93..3a3704b8 100644 Binary files a/tests/images/superimage3.png and b/tests/images/superimage3.png differ diff --git a/tests/images/superimage4.png b/tests/images/superimage4.png index 3ab561c8..ddae44c6 100644 Binary files a/tests/images/superimage4.png and b/tests/images/superimage4.png differ diff --git a/tests/images/superimage5.png b/tests/images/superimage5.png index 1903cf80..da46ce40 100644 Binary files a/tests/images/superimage5.png and b/tests/images/superimage5.png differ diff --git a/tests/images/superimage6.png b/tests/images/superimage6.png index 3343ca4d..7c236596 100644 Binary files a/tests/images/superimage6.png and b/tests/images/superimage6.png differ diff --git a/tests/paths/ButtCap.png b/tests/paths/ButtCap.png index d084c997..1a1ea272 100644 Binary files a/tests/paths/ButtCap.png and b/tests/paths/ButtCap.png differ diff --git a/tests/paths/RoundCap.png b/tests/paths/RoundCap.png index ec4a45c6..ad03e9c3 100644 Binary files a/tests/paths/RoundCap.png and b/tests/paths/RoundCap.png differ diff --git a/tests/paths/SquareCap.png b/tests/paths/SquareCap.png index 206b1348..37b14d1f 100644 Binary files a/tests/paths/SquareCap.png and b/tests/paths/SquareCap.png differ diff --git a/tests/paths/arc.png b/tests/paths/arc.png index 27f85a0a..d519ceb3 100644 Binary files a/tests/paths/arc.png and b/tests/paths/arc.png differ diff --git a/tests/paths/arcTo1.png b/tests/paths/arcTo1.png index 72c01701..52c6e9eb 100644 Binary files a/tests/paths/arcTo1.png and b/tests/paths/arcTo1.png differ diff --git a/tests/paths/arcTo2.png b/tests/paths/arcTo2.png index 0b4d2d42..f26df527 100644 Binary files a/tests/paths/arcTo2.png and b/tests/paths/arcTo2.png differ diff --git a/tests/paths/arcTo3.png b/tests/paths/arcTo3.png index d90528fe..d95e4ec6 100644 Binary files a/tests/paths/arcTo3.png and b/tests/paths/arcTo3.png differ diff --git a/tests/paths/boxBevel.png b/tests/paths/boxBevel.png index a021d394..3f5c07dc 100644 Binary files a/tests/paths/boxBevel.png and b/tests/paths/boxBevel.png differ diff --git a/tests/paths/boxMiter.png b/tests/paths/boxMiter.png index 986c3500..4c0b4afe 100644 Binary files a/tests/paths/boxMiter.png and b/tests/paths/boxMiter.png differ diff --git a/tests/paths/boxRound.png b/tests/paths/boxRound.png index d8e6571c..3cec2036 100644 Binary files a/tests/paths/boxRound.png and b/tests/paths/boxRound.png differ diff --git a/tests/paths/dashes.png b/tests/paths/dashes.png index a8f2de72..325443de 100644 Binary files a/tests/paths/dashes.png and b/tests/paths/dashes.png differ diff --git a/tests/paths/fillImagePaint.png b/tests/paths/fillImagePaint.png index 86d99735..6ff5012f 100644 Binary files a/tests/paths/fillImagePaint.png and b/tests/paths/fillImagePaint.png differ diff --git a/tests/paths/fillTiledImagePaint.png b/tests/paths/fillTiledImagePaint.png index 539642ff..5d958cc6 100644 Binary files a/tests/paths/fillTiledImagePaint.png and b/tests/paths/fillTiledImagePaint.png differ diff --git a/tests/paths/gradientAngular.png b/tests/paths/gradientAngular.png index b1a1e0bc..2ee1072c 100644 Binary files a/tests/paths/gradientAngular.png and b/tests/paths/gradientAngular.png differ diff --git a/tests/paths/gradientAngularOpacity.png b/tests/paths/gradientAngularOpacity.png index f65ec920..91c888a5 100644 Binary files a/tests/paths/gradientAngularOpacity.png and b/tests/paths/gradientAngularOpacity.png differ diff --git a/tests/paths/gradientLinear.png b/tests/paths/gradientLinear.png index 3442a167..475951e4 100644 Binary files a/tests/paths/gradientLinear.png and b/tests/paths/gradientLinear.png differ diff --git a/tests/paths/gradientLinear2.png b/tests/paths/gradientLinear2.png index 9e3a3dd8..08e0ff2c 100644 Binary files a/tests/paths/gradientLinear2.png and b/tests/paths/gradientLinear2.png differ diff --git a/tests/paths/gradientRadial.png b/tests/paths/gradientRadial.png index 1de6bc47..2611d626 100644 Binary files a/tests/paths/gradientRadial.png and b/tests/paths/gradientRadial.png differ diff --git a/tests/paths/miterLimit_10deg_2.00num.png b/tests/paths/miterLimit_10deg_2.00num.png index 31acf46b..f5182ca3 100644 Binary files a/tests/paths/miterLimit_10deg_2.00num.png and b/tests/paths/miterLimit_10deg_2.00num.png differ diff --git a/tests/paths/miterLimit_145deg_2.00num.png b/tests/paths/miterLimit_145deg_2.00num.png index d3632ac7..14cc75a0 100644 Binary files a/tests/paths/miterLimit_145deg_2.00num.png and b/tests/paths/miterLimit_145deg_2.00num.png differ diff --git a/tests/paths/miterLimit_145deg_3.32num.png b/tests/paths/miterLimit_145deg_3.32num.png index d3632ac7..14cc75a0 100644 Binary files a/tests/paths/miterLimit_145deg_3.32num.png and b/tests/paths/miterLimit_145deg_3.32num.png differ diff --git a/tests/paths/miterLimit_145deg_3.33num.png b/tests/paths/miterLimit_145deg_3.33num.png index 7cd94b72..37bf4dfc 100644 Binary files a/tests/paths/miterLimit_145deg_3.33num.png and b/tests/paths/miterLimit_145deg_3.33num.png differ diff --git a/tests/paths/miterLimit_155deg_2.00num.png b/tests/paths/miterLimit_155deg_2.00num.png index b2c0eb6b..3530ba1b 100644 Binary files a/tests/paths/miterLimit_155deg_2.00num.png and b/tests/paths/miterLimit_155deg_2.00num.png differ diff --git a/tests/paths/miterLimit_165deg_10.00num.png b/tests/paths/miterLimit_165deg_10.00num.png index c99a0097..2bfa362a 100644 Binary files a/tests/paths/miterLimit_165deg_10.00num.png and b/tests/paths/miterLimit_165deg_10.00num.png differ diff --git a/tests/paths/miterLimit_165deg_2.00num.png b/tests/paths/miterLimit_165deg_2.00num.png index ce1146bd..b7890dac 100644 Binary files a/tests/paths/miterLimit_165deg_2.00num.png and b/tests/paths/miterLimit_165deg_2.00num.png differ diff --git a/tests/paths/opacityFill.png b/tests/paths/opacityFill.png index c9388726..956dafe6 100644 Binary files a/tests/paths/opacityFill.png and b/tests/paths/opacityFill.png differ diff --git a/tests/paths/opacityStroke.png b/tests/paths/opacityStroke.png index f227fb24..382faaba 100644 Binary files a/tests/paths/opacityStroke.png and b/tests/paths/opacityStroke.png differ diff --git a/tests/paths/paintImage.png b/tests/paths/paintImage.png index 7ff83a8a..03e35ba8 100644 Binary files a/tests/paths/paintImage.png and b/tests/paths/paintImage.png differ diff --git a/tests/paths/paintImageOpacity.png b/tests/paths/paintImageOpacity.png index 2d318719..e2018c4b 100644 Binary files a/tests/paths/paintImageOpacity.png and b/tests/paths/paintImageOpacity.png differ diff --git a/tests/paths/paintImageTiled.png b/tests/paths/paintImageTiled.png index 3f3a8905..5300c7b7 100644 Binary files a/tests/paths/paintImageTiled.png and b/tests/paths/paintImageTiled.png differ diff --git a/tests/paths/paintImageTiledOpacity.png b/tests/paths/paintImageTiledOpacity.png index 176021fd..a2d0e138 100644 Binary files a/tests/paths/paintImageTiledOpacity.png and b/tests/paths/paintImageTiledOpacity.png differ diff --git a/tests/paths/paintSolid.png b/tests/paths/paintSolid.png index 8c5ac1f3..c1ab6ffe 100644 Binary files a/tests/paths/paintSolid.png and b/tests/paths/paintSolid.png differ diff --git a/tests/paths/path0pxCover.png b/tests/paths/path0pxCover.png index 37d6f93e..ad6ad865 100644 Binary files a/tests/paths/path0pxCover.png and b/tests/paths/path0pxCover.png differ diff --git a/tests/paths/path1pxCover.png b/tests/paths/path1pxCover.png index f548d551..cd04fc2e 100644 Binary files a/tests/paths/path1pxCover.png and b/tests/paths/path1pxCover.png differ diff --git a/tests/paths/pathBlackRectangle.png b/tests/paths/pathBlackRectangle.png index 17dcb584..c29a7674 100644 Binary files a/tests/paths/pathBlackRectangle.png and b/tests/paths/pathBlackRectangle.png differ diff --git a/tests/paths/pathBlackRectangleZ.png b/tests/paths/pathBlackRectangleZ.png index 17dcb584..c29a7674 100644 Binary files a/tests/paths/pathBlackRectangleZ.png and b/tests/paths/pathBlackRectangleZ.png differ diff --git a/tests/paths/pathBottomArc.png b/tests/paths/pathBottomArc.png index d71105dc..b1fb9526 100644 Binary files a/tests/paths/pathBottomArc.png and b/tests/paths/pathBottomArc.png differ diff --git a/tests/paths/pathCornerArc.png b/tests/paths/pathCornerArc.png index b4404670..856d1fdc 100644 Binary files a/tests/paths/pathCornerArc.png and b/tests/paths/pathCornerArc.png differ diff --git a/tests/paths/pathHeart.png b/tests/paths/pathHeart.png index 845e9b51..6459a883 100644 Binary files a/tests/paths/pathHeart.png and b/tests/paths/pathHeart.png differ diff --git a/tests/paths/pathInvertedCornerArc.png b/tests/paths/pathInvertedCornerArc.png index f39e9a40..7669a074 100644 Binary files a/tests/paths/pathInvertedCornerArc.png and b/tests/paths/pathInvertedCornerArc.png differ diff --git a/tests/paths/pathRedRectangle.png b/tests/paths/pathRedRectangle.png index c49424ed..86638aee 100644 Binary files a/tests/paths/pathRedRectangle.png and b/tests/paths/pathRedRectangle.png differ diff --git a/tests/paths/pathRotatedArc.png b/tests/paths/pathRotatedArc.png index ccaf2024..26919f60 100644 Binary files a/tests/paths/pathRotatedArc.png and b/tests/paths/pathRotatedArc.png differ diff --git a/tests/paths/pathStroke1.png b/tests/paths/pathStroke1.png index 44b388b4..43d0e652 100644 Binary files a/tests/paths/pathStroke1.png and b/tests/paths/pathStroke1.png differ diff --git a/tests/paths/pathStroke1Big.png b/tests/paths/pathStroke1Big.png index d1e9e2f6..892db44c 100644 Binary files a/tests/paths/pathStroke1Big.png and b/tests/paths/pathStroke1Big.png differ diff --git a/tests/paths/pathStroke2.png b/tests/paths/pathStroke2.png index 9520d1ad..5dced735 100644 Binary files a/tests/paths/pathStroke2.png and b/tests/paths/pathStroke2.png differ diff --git a/tests/paths/pathStroke3.png b/tests/paths/pathStroke3.png index 56dfc576..d2e1fd9f 100644 Binary files a/tests/paths/pathStroke3.png and b/tests/paths/pathStroke3.png differ diff --git a/tests/paths/pathSwish.png b/tests/paths/pathSwish.png index a58993ca..0103a9cc 100644 Binary files a/tests/paths/pathSwish.png and b/tests/paths/pathSwish.png differ diff --git a/tests/paths/pathYellowRectangle.png b/tests/paths/pathYellowRectangle.png index e249e562..c1e68090 100644 Binary files a/tests/paths/pathYellowRectangle.png and b/tests/paths/pathYellowRectangle.png differ diff --git a/tests/paths/pixelScale.png b/tests/paths/pixelScale.png index cee18b88..5d7f1876 100644 Binary files a/tests/paths/pixelScale.png and b/tests/paths/pixelScale.png differ diff --git a/tests/paths/rectExcludeMask.png b/tests/paths/rectExcludeMask.png index 0231da9c..4d126844 100644 Binary files a/tests/paths/rectExcludeMask.png and b/tests/paths/rectExcludeMask.png differ diff --git a/tests/paths/rectExcludeMaskAA.png b/tests/paths/rectExcludeMaskAA.png index e6cd3da9..86e8ca2a 100644 Binary files a/tests/paths/rectExcludeMaskAA.png and b/tests/paths/rectExcludeMaskAA.png differ diff --git a/tests/paths/rectMask.png b/tests/paths/rectMask.png index 8129da2c..085a0a26 100644 Binary files a/tests/paths/rectMask.png and b/tests/paths/rectMask.png differ diff --git a/tests/paths/rectMaskAA.png b/tests/paths/rectMaskAA.png index 26942df5..a1813d6d 100644 Binary files a/tests/paths/rectMaskAA.png and b/tests/paths/rectMaskAA.png differ diff --git a/tests/paths/rectMaskStroke.png b/tests/paths/rectMaskStroke.png index ea96b9db..65cba9f9 100644 Binary files a/tests/paths/rectMaskStroke.png and b/tests/paths/rectMaskStroke.png differ diff --git a/tests/paths/selfclosing.png b/tests/paths/selfclosing.png index 7782590d..c9284b89 100644 Binary files a/tests/paths/selfclosing.png and b/tests/paths/selfclosing.png differ