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