15f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita/*
25f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita * Copyright 2018 Google Inc.
35f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita *
45f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita * Use of this source code is governed by a BSD-style license that can be
55f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita * found in the LICENSE file.
65f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita */
75f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
85f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita#include "SkSGMaskEffect.h"
95f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
105f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita#include "SkCanvas.h"
115f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
125f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malitanamespace sksg {
135f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
145f9102f2912ef702e013c48466b5461f2a0b9eb9Florin MalitaMaskEffect::MaskEffect(sk_sp<RenderNode> child, sk_sp<RenderNode> mask)
155f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    : INHERITED(std::move(child))
165f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    , fMaskNode(std::move(mask)) {
173ba3fa72ae2fd4102cff22b947d124f72ce0f880Florin Malita    this->observeInval(fMaskNode);
185f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita}
195f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
205f9102f2912ef702e013c48466b5461f2a0b9eb9Florin MalitaMaskEffect::~MaskEffect() {
213ba3fa72ae2fd4102cff22b947d124f72ce0f880Florin Malita    this->unobserveInval(fMaskNode);
225f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita}
235f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
245f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malitavoid MaskEffect::onRender(SkCanvas* canvas) const {
255f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    if (this->bounds().isEmpty())
265f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita        return;
275f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
285f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    SkAutoCanvasRestore acr(canvas, false);
295f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
305f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    canvas->saveLayer(this->bounds(), nullptr);
315f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    fMaskNode->render(canvas);
325f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
335f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
345f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    SkPaint p;
355f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    p.setBlendMode(SkBlendMode::kSrcIn);
365f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    canvas->saveLayer(this->bounds(), &p);
375f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
385f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    this->INHERITED::onRender(canvas);
395f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita}
405f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
415f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
425f9102f2912ef702e013c48466b5461f2a0b9eb9Florin MalitaSkRect MaskEffect::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) {
435f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    SkASSERT(this->hasInval());
445f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
455f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    const auto maskBounds = fMaskNode->revalidate(ic, ctm);
465f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    auto childBounds = this->INHERITED::onRevalidate(ic, ctm);
475f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
485f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita    return childBounds.intersect(maskBounds) ? childBounds : SkRect::MakeEmpty();
495f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita}
505f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita
515f9102f2912ef702e013c48466b5461f2a0b9eb9Florin Malita} // namespace sksg
52