aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/sksg/effects/SkSGMaskEffect.cpp
diff options
context:
space:
mode:
authorGravatar Florin Malita <fmalita@chromium.org>2018-03-05 14:01:41 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-03-05 20:11:05 +0000
commita016be94993aa57a3a5afcea07d70e6e18068d48 (patch)
treedd8a313268b3c81377e818784244f046f1d76018 /experimental/sksg/effects/SkSGMaskEffect.cpp
parent07edbd45c24b13c6d8c638c50f04291c427e9575 (diff)
[skottie] Inverted matte support
TBR= Change-Id: I761d80d27d9a737710123a183af37135c270b8a7 Reviewed-on: https://skia-review.googlesource.com/112162 Reviewed-by: Florin Malita <fmalita@chromium.org> Commit-Queue: Florin Malita <fmalita@chromium.org>
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