diff --git a/src/pixie/images.nim b/src/pixie/images.nim index f7b8bd5..fef0bba 100644 --- a/src/pixie/images.nim +++ b/src/pixie/images.nim @@ -309,12 +309,7 @@ proc drawCorrect( else: # b is a Mask validateMaskBlendMode() else: # a is a Mask - when type(b) is Image: - raise newException( - PixieError, - "Drawing an image onto a mask is not supported yet" - ) - else: # b is a Mask + when type(b) is Mask: validateMaskBlendMode() var @@ -355,9 +350,11 @@ proc drawCorrect( ) a.setRgbaUnsafe(x, y, blended) else: # a is a Mask, b must be a mask - let - value = a.getValueUnsafe(x, y) - sample = b.getValueSmooth(xFloat, yFloat).uint32 + let value = a.getValueUnsafe(x, y) + when type(b) is Image: + let sample = b.getRgbaSmooth(xFloat, yFloat).a.uint32 + else: # a is a Mask + let sample = b.getValueSmooth(xFloat, yFloat).uint32 a.setValueUnsafe(x, y, ((value * sample) div 255).uint8) proc draw*(image: Image, mask: Mask, mat: Mat3, blendMode = bmMask) = @@ -371,6 +368,9 @@ proc draw*( proc draw*(a, b: Mask, mat = mat3(), blendMode = bmMask) = a.drawCorrect(b, mat, blendMode) +proc draw*(mask: Mask, image: Image, mat = mat3(), blendMode = bmMask) = + mask.drawCorrect(image, mat, blendMode) + when defined(release): {.pop.} diff --git a/tests/images/masks/imageMaskedMask.png b/tests/images/masks/imageMaskedMask.png new file mode 100644 index 0000000..eb13fae Binary files /dev/null and b/tests/images/masks/imageMaskedMask.png differ diff --git a/tests/test_masks.nim b/tests/test_masks.nim index 161d606..e487a5b 100644 --- a/tests/test_masks.nim +++ b/tests/test_masks.nim @@ -48,3 +48,16 @@ block: a.draw(b) writeFile("tests/images/masks/maskedMask.png", a.encodePng()) + +block: + let a = newMask(100, 100) + a.fill(255) + + var path: Path + path.ellipse(a.width / 2, a.height / 2, 25, 25) + + let b = newImage(a.width, a.height) + b.fillPath(path, rgba(0, 0, 0, 255)) + + a.draw(b) + writeFile("tests/images/masks/imageMaskedMask.png", a.encodePng())