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