1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2018 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSGMaskEffect.h"
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace sksg {
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotMaskEffect::MaskEffect(sk_sp<RenderNode> child, sk_sp<RenderNode> mask)
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    : INHERITED(std::move(child))
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    , fMaskNode(std::move(mask)) {
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->observeInval(fMaskNode);
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotMaskEffect::~MaskEffect() {
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->unobserveInval(fMaskNode);
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid MaskEffect::onRender(SkCanvas* canvas) const {
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    if (this->bounds().isEmpty())
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoCanvasRestore acr(canvas, false);
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->saveLayer(this->bounds(), nullptr);
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    fMaskNode->render(canvas);
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPaint p;
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    p.setBlendMode(SkBlendMode::kSrcIn);
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    canvas->saveLayer(this->bounds(), &p);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    this->INHERITED::onRender(canvas);
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotSkRect MaskEffect::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) {
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkASSERT(this->hasInval());
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const auto maskBounds = fMaskNode->revalidate(ic, ctm);
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    auto childBounds = this->INHERITED::onRevalidate(ic, ctm);
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return childBounds.intersect(maskBounds) ? childBounds : SkRect::MakeEmpty();
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} // namespace sksg
52