diff options
author | Florin Malita <fmalita@chromium.org> | 2018-01-10 13:36:22 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-11 19:32:45 +0000 |
commit | 5f9102f2912ef702e013c48466b5461f2a0b9eb9 (patch) | |
tree | 672c92e9267643efa229e5d0c4827d9437daeab2 /experimental/sksg/effects/SkSGMaskEffect.cpp | |
parent | 68c3fac8ce26a58bc0795f3d5da443c2a5915e2e (diff) |
[skotty,sksg] Initial matte layer support
TBR=
Change-Id: I5b689f5d7b0d147fa200cf5bffe476077085cb19
Reviewed-on: https://skia-review.googlesource.com/93300
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.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/experimental/sksg/effects/SkSGMaskEffect.cpp b/experimental/sksg/effects/SkSGMaskEffect.cpp new file mode 100644 index 0000000000..d4ce6df4db --- /dev/null +++ b/experimental/sksg/effects/SkSGMaskEffect.cpp @@ -0,0 +1,51 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkSGMaskEffect.h" + +#include "SkCanvas.h" + +namespace sksg { + +MaskEffect::MaskEffect(sk_sp<RenderNode> child, sk_sp<RenderNode> mask) + : INHERITED(std::move(child)) + , fMaskNode(std::move(mask)) { + fMaskNode->addInvalReceiver(this); +} + +MaskEffect::~MaskEffect() { + fMaskNode->removeInvalReceiver(this); +} + +void MaskEffect::onRender(SkCanvas* canvas) const { + if (this->bounds().isEmpty()) + return; + + SkAutoCanvasRestore acr(canvas, false); + + canvas->saveLayer(this->bounds(), nullptr); + fMaskNode->render(canvas); + + + SkPaint p; + p.setBlendMode(SkBlendMode::kSrcIn); + canvas->saveLayer(this->bounds(), &p); + + this->INHERITED::onRender(canvas); +} + + +SkRect MaskEffect::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) { + SkASSERT(this->hasInval()); + + const auto maskBounds = fMaskNode->revalidate(ic, ctm); + auto childBounds = this->INHERITED::onRevalidate(ic, ctm); + + return childBounds.intersect(maskBounds) ? childBounds : SkRect::MakeEmpty(); +} + +} // namespace sksg |