aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/sksg/effects/SkSGMaskEffect.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'experimental/sksg/effects/SkSGMaskEffect.cpp')
-rw-r--r--experimental/sksg/effects/SkSGMaskEffect.cpp11
1 files changed, 7 insertions, 4 deletions
diff --git a/experimental/sksg/effects/SkSGMaskEffect.cpp b/experimental/sksg/effects/SkSGMaskEffect.cpp
index 17b4da7037..16e4c0dd8d 100644
--- a/experimental/sksg/effects/SkSGMaskEffect.cpp
+++ b/experimental/sksg/effects/SkSGMaskEffect.cpp
@@ -11,9 +11,10 @@
namespace sksg {
-MaskEffect::MaskEffect(sk_sp<RenderNode> child, sk_sp<RenderNode> mask)
+MaskEffect::MaskEffect(sk_sp<RenderNode> child, sk_sp<RenderNode> mask, Mode mode)
: INHERITED(std::move(child))
- , fMaskNode(std::move(mask)) {
+ , fMaskNode(std::move(mask))
+ , fMaskMode(mode) {
this->observeInval(fMaskNode);
}
@@ -32,7 +33,7 @@ void MaskEffect::onRender(SkCanvas* canvas) const {
SkPaint p;
- p.setBlendMode(SkBlendMode::kSrcIn);
+ p.setBlendMode(fMaskMode == Mode::kNormal ? SkBlendMode::kSrcIn : SkBlendMode::kSrcOut);
canvas->saveLayer(this->bounds(), &p);
this->INHERITED::onRender(canvas);
@@ -45,7 +46,9 @@ SkRect MaskEffect::onRevalidate(InvalidationController* ic, const SkMatrix& ctm)
const auto maskBounds = fMaskNode->revalidate(ic, ctm);
auto childBounds = this->INHERITED::onRevalidate(ic, ctm);
- return childBounds.intersect(maskBounds) ? childBounds : SkRect::MakeEmpty();
+ return (fMaskMode == Mode::kInvert || childBounds.intersect(maskBounds))
+ ? childBounds
+ : SkRect::MakeEmpty();
}
} // namespace sksg