/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "SkSGRoundEffect.h" #include "SkCanvas.h" #include "SkCornerPathEffect.h" #include "SkStrokeRec.h" namespace sksg { RoundEffect::RoundEffect(sk_sp<GeometryNode> child) : fChild(std::move(child)) { this->observeInval(fChild); } RoundEffect::~RoundEffect() { this->unobserveInval(fChild); } void RoundEffect::onClip(SkCanvas* canvas, bool antiAlias) const { canvas->clipPath(fRoundedPath, SkClipOp::kIntersect, antiAlias); } void RoundEffect::onDraw(SkCanvas* canvas, const SkPaint& paint) const { SkASSERT(!paint.getPathEffect()); canvas->drawPath(fRoundedPath, paint); } bool RoundEffect::onContains(const SkPoint& p) const { return fRoundedPath.contains(p.x(), p.y()); } SkPath RoundEffect::onAsPath() const { return fRoundedPath; } SkRect RoundEffect::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) { SkASSERT(this->hasInval()); const auto childbounds = fChild->revalidate(ic, ctm); const auto path = fChild->asPath(); if (auto round = SkCornerPathEffect::Make(fRadius)) { fRoundedPath.reset(); SkStrokeRec rec(SkStrokeRec::kHairline_InitStyle); SkAssertResult(round->filterPath(&fRoundedPath, path, &rec, &childbounds)); } else { fRoundedPath = path; } fRoundedPath.shrinkToFit(); return fRoundedPath.computeTightBounds(); } } // namespace sksg