diff --git a/src/pixie/images.nim b/src/pixie/images.nim index 7e83979..9e61f9f 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -355,6 +355,16 @@ proc invert*(image: Image) {.hasSimd, raises: [].} = # We need to convert back to premultiplied alpha after inverting. image.data.toPremultipliedAlpha() +proc ceil*(image: Image) {.hasSimd, raises: [].} = + ## A value of 0 stays 0. Anything else turns into 255. + for i in 0 ..< image.data.len: + var rgbx = image.data[i] + rgbx.r = if rgbx.r == 0: 0 else: 255 + rgbx.g = if rgbx.g == 0: 0 else: 255 + rgbx.b = if rgbx.b == 0: 0 else: 255 + rgbx.a = if rgbx.a == 0: 0 else: 255 + image.data[i] = rgbx + proc blur*( image: Image, radius: float32, outOfBounds: SomeColor = color(0, 0, 0, 0) ) {.raises: [PixieError].} = diff --git a/src/pixie/paths.nim b/src/pixie/paths.nim index 534a854..c0a20e5 100644 --- a/src/pixie/paths.nim +++ b/src/pixie/paths.nim @@ -2021,6 +2021,8 @@ proc fillShapes( i += 2 if onlySimpleFillPairs: + numHits = 0 + var i: int while i < numEntryIndices: let @@ -2126,13 +2128,14 @@ proc fillShapes( let fillBegin = leftCoverEnd.clamp(0, image.width) fillEnd = rightCoverBegin.clamp(0, image.width) - if fillEnd - fillBegin > 0: - hits[0] = (fixed32(fillBegin.float32), 1.int16) - hits[1] = (fixed32(fillEnd.float32), -1.int16) - image.fillHits(rgbx, 0, y, hits, 2, NonZero, blendMode) - + hits[numHits] = (fixed32(fillBegin.float32), 1.int16) + hits[numHits + 1] = (fixed32(fillEnd.float32), -1.int16) + numHits += 2 i += 2 + if numHits > 0: + image.fillHits(rgbx, 0, y, hits, numHits, NonZero, blendMode) + inc y continue