1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2018 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGClipEffect.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
11cb93a386Sopenharmony_ci#include "include/core/SkPath.h"
12cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGGeometryNode.h"
13cb93a386Sopenharmony_ci
14cb93a386Sopenharmony_cinamespace sksg {
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_ciClipEffect::ClipEffect(sk_sp<RenderNode> child, sk_sp<GeometryNode> clip, bool aa)
17cb93a386Sopenharmony_ci    : INHERITED(std::move(child))
18cb93a386Sopenharmony_ci    , fClipNode(std::move(clip))
19cb93a386Sopenharmony_ci    , fAntiAlias(aa) {
20cb93a386Sopenharmony_ci    this->observeInval(fClipNode);
21cb93a386Sopenharmony_ci}
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ciClipEffect::~ClipEffect() {
24cb93a386Sopenharmony_ci    this->unobserveInval(fClipNode);
25cb93a386Sopenharmony_ci}
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_civoid ClipEffect::onRender(SkCanvas* canvas, const RenderContext* ctx) const {
28cb93a386Sopenharmony_ci    SkAutoCanvasRestore acr(canvas, !fNoop);
29cb93a386Sopenharmony_ci    if (!fNoop) {
30cb93a386Sopenharmony_ci        fClipNode->clip(canvas, fAntiAlias);
31cb93a386Sopenharmony_ci    }
32cb93a386Sopenharmony_ci
33cb93a386Sopenharmony_ci    this->INHERITED::onRender(canvas, ctx);
34cb93a386Sopenharmony_ci}
35cb93a386Sopenharmony_ci
36cb93a386Sopenharmony_ciconst RenderNode* ClipEffect::onNodeAt(const SkPoint& p) const {
37cb93a386Sopenharmony_ci    return fClipNode->contains(p) ? this->INHERITED::onNodeAt(p) : nullptr;
38cb93a386Sopenharmony_ci}
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_ciSkRect ClipEffect::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) {
41cb93a386Sopenharmony_ci    SkASSERT(this->hasInval());
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci    const auto clipBounds = fClipNode->revalidate(ic, ctm);
44cb93a386Sopenharmony_ci    auto childBounds = this->INHERITED::onRevalidate(ic, ctm);
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci    fNoop = fClipNode->asPath().conservativelyContainsRect(childBounds);
47cb93a386Sopenharmony_ci
48cb93a386Sopenharmony_ci    return childBounds.intersect(clipBounds) ? childBounds : SkRect::MakeEmpty();
49cb93a386Sopenharmony_ci}
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ci} // namespace sksg
52