blob: 224d46bd1873929d079263a5722da60fd49ca5dc [file] [log] [blame]
Florin Malita16d0ad02018-01-19 15:07:29 -05001/*
2 * Copyright 2018 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkSGGeometryTransform.h"
9
10#include "SkCanvas.h"
Florin Malita760a0522019-01-10 15:24:15 -050011#include "SkSGTransform.h"
Florin Malitadf0e1af2019-01-10 11:27:13 -050012#include "SkSGTransformPriv.h"
Florin Malita16d0ad02018-01-19 15:07:29 -050013
14namespace sksg {
15
Florin Malita919e2092019-01-09 15:37:57 -050016GeometryTransform::GeometryTransform(sk_sp<GeometryNode> child, sk_sp<Transform> transform)
Florin Malita16d0ad02018-01-19 15:07:29 -050017 : fChild(std::move(child))
Florin Malita919e2092019-01-09 15:37:57 -050018 , fTransform(std::move(transform)) {
Florin Malita3ba3fa72018-01-22 10:19:28 -050019 this->observeInval(fChild);
Florin Malita919e2092019-01-09 15:37:57 -050020 this->observeInval(fTransform);
Florin Malita16d0ad02018-01-19 15:07:29 -050021}
22
23GeometryTransform::~GeometryTransform() {
Florin Malita3ba3fa72018-01-22 10:19:28 -050024 this->unobserveInval(fChild);
Florin Malita919e2092019-01-09 15:37:57 -050025 this->unobserveInval(fTransform);
Florin Malita16d0ad02018-01-19 15:07:29 -050026}
27
Florin Malita38ea40e2018-01-29 16:31:14 -050028void GeometryTransform::onClip(SkCanvas* canvas, bool antiAlias) const {
Florin Malita919e2092019-01-09 15:37:57 -050029 canvas->clipPath(fTransformedPath, SkClipOp::kIntersect, antiAlias);
Florin Malita38ea40e2018-01-29 16:31:14 -050030}
31
32void GeometryTransform::onDraw(SkCanvas* canvas, const SkPaint& paint) const {
Florin Malita919e2092019-01-09 15:37:57 -050033 canvas->drawPath(fTransformedPath, paint);
Florin Malita38ea40e2018-01-29 16:31:14 -050034}
35
Florin Malitaeb46bd82019-02-12 09:33:21 -050036bool GeometryTransform::onContains(const SkPoint& p) const {
37 return fTransformedPath.contains(p.x(), p.y());
38}
39
Florin Malita16d0ad02018-01-19 15:07:29 -050040SkRect GeometryTransform::onRevalidate(InvalidationController* ic, const SkMatrix& ctm) {
41 SkASSERT(this->hasInval());
42
43 // We don't care about matrix reval results.
Florin Malita919e2092019-01-09 15:37:57 -050044 fTransform->revalidate(ic, ctm);
Florin Malita13c1b962019-01-10 14:44:59 -050045 const auto m = TransformPriv::As<SkMatrix>(fTransform);
Florin Malita16d0ad02018-01-19 15:07:29 -050046
47 auto bounds = fChild->revalidate(ic, ctm);
Florin Malita919e2092019-01-09 15:37:57 -050048 fTransformedPath = fChild->asPath();
49 fTransformedPath.transform(m);
50 fTransformedPath.shrinkToFit();
Florin Malita16d0ad02018-01-19 15:07:29 -050051
52 m.mapRect(&bounds);
53 return bounds;
54}
55
56SkPath GeometryTransform::onAsPath() const {
Florin Malita919e2092019-01-09 15:37:57 -050057 return fTransformedPath;
Florin Malita16d0ad02018-01-19 15:07:29 -050058}
59
Florin Malita16d0ad02018-01-19 15:07:29 -050060} // namespace sksg