diff --git a/bindings/bindings.nim b/bindings/bindings.nim index a6a867c..8b18019 100644 --- a/bindings/bindings.nim +++ b/bindings/bindings.nim @@ -116,6 +116,7 @@ exportRefObject Image: getColor setColor fill(Image, Color) + fill(Image, Paint) flipHorizontal flipVertical subImage diff --git a/src/pixie.nim b/src/pixie.nim index 9a38c79..bb7ad28 100644 --- a/src/pixie.nim +++ b/src/pixie.nim @@ -1,7 +1,7 @@ import bumpy, chroma, flatty/binny, os, pixie/common, pixie/contexts, pixie/fileformats/bmp, pixie/fileformats/gif, pixie/fileformats/jpeg, pixie/fileformats/png, pixie/fileformats/ppm, pixie/fileformats/qoi, - pixie/fileformats/svg, pixie/fonts, pixie/images, pixie/masks, pixie/paints, + pixie/fileformats/svg, pixie/fonts, pixie/images, pixie/internal, pixie/masks, pixie/paints, pixie/paths, strutils, vmath export bumpy, chroma, common, contexts, fonts, images, masks, paints, paths, vmath @@ -142,3 +142,16 @@ proc writeFile*(mask: Mask, filePath: string) {.raises: [PixieError].} = writeFile(filePath, mask.encodeMask(fileFormat)) except IOError as e: raise newException(PixieError, e.msg, e) + +proc fill*(image: Image, paint: Paint) {.raises: [PixieError].} = + ## Fills the image with the paint. + case paint.kind: + of SolidPaint: + fillUnsafe(image.data, paint.color, 0, image.data.len) + of ImagePaint, TiledImagePaint: + fillUnsafe(image.data, rgbx(0, 0, 0, 0), 0, image.data.len) + let path = newPath() + path.rect(0, 0, image.width.float32, image.height.float32) + image.fillPath(path, paint) + of LinearGradientPaint, RadialGradientPaint, AngularGradientPaint: + image.fillGradient(paint) diff --git a/tests/paths/fillImagePaint.png b/tests/paths/fillImagePaint.png new file mode 100644 index 0000000..86d9973 Binary files /dev/null and b/tests/paths/fillImagePaint.png differ diff --git a/tests/paths/fillTiledImagePaint.png b/tests/paths/fillTiledImagePaint.png new file mode 100644 index 0000000..539642f Binary files /dev/null and b/tests/paths/fillTiledImagePaint.png differ diff --git a/tests/test_images.nim b/tests/test_images.nim index 1405b5c..90ee301 100644 --- a/tests/test_images.nim +++ b/tests/test_images.nim @@ -252,3 +252,8 @@ block: for i in 0 ..< premultiplied.len: doAssert premultiplied[i] == converted[i] doAssert colors[i].rgbx == converted[i] + +block: + let image = newImage(100, 100) + image.fill("white") + doAssert image[10, 10] == rgba(255, 255, 255, 255) diff --git a/tests/test_paints.nim b/tests/test_paints.nim index ebc649c..23e9751 100644 --- a/tests/test_paints.nim +++ b/tests/test_paints.nim @@ -132,3 +132,25 @@ block: let image = newImage(100, 100) image.fillPath(heartShape, paint) image.xray("tests/paths/gradientAngularOpacity.png") + +block: + let paint = newPaint(ImagePaint) + paint.image = readImage("tests/fileformats/png/mandrill.png") + paint.imageMat = scale(vec2(0.2, 0.2)) + paint.opacity = 0.5 + + let image = newImage(128, 128) + image.fill(rgbx(0, 255, 0, 255)) + image.fill(paint) + image.xray("tests/paths/fillImagePaint.png") + +block: + let paint = newPaint(TiledImagePaint) + paint.image = readImage("tests/fileformats/png/mandrill.png") + paint.imageMat = scale(vec2(0.1, 0.1)) + paint.opacity = 0.5 + + let image = newImage(128, 128) + image.fill(rgbx(0, 255, 0, 255)) + image.fill(paint) + image.xray("tests/paths/fillTiledImagePaint.png")