1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 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/SkSGDraw.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#include "modules/sksg/include/SkSGInvalidationController.h" 14cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGPaint.h" 15cb93a386Sopenharmony_ci#include "src/core/SkTLazy.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cinamespace sksg { 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_ciDraw::Draw(sk_sp<GeometryNode> geometry, sk_sp<PaintNode> paint) 20cb93a386Sopenharmony_ci : fGeometry(std::move(geometry)) 21cb93a386Sopenharmony_ci , fPaint(std::move(paint)) { 22cb93a386Sopenharmony_ci this->observeInval(fGeometry); 23cb93a386Sopenharmony_ci this->observeInval(fPaint); 24cb93a386Sopenharmony_ci} 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ciDraw::~Draw() { 27cb93a386Sopenharmony_ci this->unobserveInval(fGeometry); 28cb93a386Sopenharmony_ci this->unobserveInval(fPaint); 29cb93a386Sopenharmony_ci} 30cb93a386Sopenharmony_ci 31cb93a386Sopenharmony_civoid Draw::onRender(SkCanvas* canvas, const RenderContext* ctx) const { 32cb93a386Sopenharmony_ci auto paint = fPaint->makePaint(); 33cb93a386Sopenharmony_ci if (ctx) { 34cb93a386Sopenharmony_ci ctx->modulatePaint(canvas->getTotalMatrix(), &paint); 35cb93a386Sopenharmony_ci } 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci const auto skipDraw = paint.nothingToDraw() || 38cb93a386Sopenharmony_ci (paint.getStyle() == SkPaint::kStroke_Style && paint.getStrokeWidth() <= 0); 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci if (!skipDraw) { 41cb93a386Sopenharmony_ci fGeometry->draw(canvas, paint); 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci} 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ciconst RenderNode* Draw::onNodeAt(const SkPoint& p) const { 46cb93a386Sopenharmony_ci const auto paint = fPaint->makePaint(); 47cb93a386Sopenharmony_ci 48cb93a386Sopenharmony_ci if (!paint.getAlpha()) { 49cb93a386Sopenharmony_ci return nullptr; 50cb93a386Sopenharmony_ci } 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci if (paint.getStyle() == SkPaint::Style::kFill_Style && fGeometry->contains(p)) { 53cb93a386Sopenharmony_ci return this; 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci SkPath stroke_path; 57cb93a386Sopenharmony_ci if (!paint.getFillPath(fGeometry->asPath(), &stroke_path)) { 58cb93a386Sopenharmony_ci return nullptr; 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci 61cb93a386Sopenharmony_ci return stroke_path.contains(p.x(), p.y()) ? this : nullptr; 62cb93a386Sopenharmony_ci} 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ciSkRect Draw::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) { 65cb93a386Sopenharmony_ci SkASSERT(this->hasInval()); 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ci auto bounds = fGeometry->revalidate(ic, ctm); 68cb93a386Sopenharmony_ci fPaint->revalidate(ic, ctm); 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci const auto paint = fPaint->makePaint(); 71cb93a386Sopenharmony_ci SkASSERT(paint.canComputeFastBounds()); 72cb93a386Sopenharmony_ci 73cb93a386Sopenharmony_ci return paint.computeFastBounds(bounds, &bounds); 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_ci} // namespace sksg 77