blob: c3ba6c21b214d05478f3e3b2eea2edf742bdc912 [file] [log] [blame]
Florin Malita4aa44412017-12-19 12:21:02 -05001/*
2 * Copyright 2017 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#ifndef SkSGTransform_DEFINED
9#define SkSGTransform_DEFINED
10
11#include "SkSGEffectNode.h"
12
13#include "SkMatrix.h"
Florin Malita919e2092019-01-09 15:37:57 -050014#include "SkMatrix44.h"
Florin Malita4aa44412017-12-19 12:21:02 -050015
16namespace sksg {
17
18/**
Florin Malita919e2092019-01-09 15:37:57 -050019 * Transformations base class.
Florin Malita18eafd92018-01-04 21:11:55 -050020 */
Florin Malita919e2092019-01-09 15:37:57 -050021class Transform : public Node {
Florin Malita18eafd92018-01-04 21:11:55 -050022public:
Florin Malita919e2092019-01-09 15:37:57 -050023 // Compose T = A x B
24 static sk_sp<Transform> MakeConcat(sk_sp<Transform> a, sk_sp<Transform> b);
25
Florin Malita919e2092019-01-09 15:37:57 -050026protected:
27 Transform();
28
Florin Malitadf0e1af2019-01-10 11:27:13 -050029 virtual SkMatrix asMatrix () const = 0;
30 virtual SkMatrix44 asMatrix44() const = 0;
31
Florin Malita919e2092019-01-09 15:37:57 -050032private:
Florin Malitadf0e1af2019-01-10 11:27:13 -050033 friend class TransformPriv;
34
Florin Malita919e2092019-01-09 15:37:57 -050035 using INHERITED = Node;
36};
37
38/**
39 * Concrete, SkMatrix-backed transformation.
40 */
41class Matrix final : public Transform {
42public:
43 static sk_sp<Matrix> Make(const SkMatrix& m);
Florin Malita18eafd92018-01-04 21:11:55 -050044
Florin Malita16322632018-09-12 10:15:34 -040045 SG_ATTRIBUTE(Matrix, SkMatrix, fMatrix)
Florin Malita18eafd92018-01-04 21:11:55 -050046
Florin Malita18eafd92018-01-04 21:11:55 -050047protected:
Florin Malita16322632018-09-12 10:15:34 -040048 explicit Matrix(const SkMatrix&);
Florin Malita18eafd92018-01-04 21:11:55 -050049
Florin Malitac14f1442018-01-05 11:32:31 -050050 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
Florin Malita18eafd92018-01-04 21:11:55 -050051
Florin Malitadf0e1af2019-01-10 11:27:13 -050052 SkMatrix asMatrix () const override;
53 SkMatrix44 asMatrix44() const override;
54
Florin Malita18eafd92018-01-04 21:11:55 -050055private:
Florin Malita16322632018-09-12 10:15:34 -040056 SkMatrix fMatrix;
Florin Malita18eafd92018-01-04 21:11:55 -050057
Florin Malita919e2092019-01-09 15:37:57 -050058 using INHERITED = Transform;
Florin Malita18eafd92018-01-04 21:11:55 -050059};
60
61/**
Florin Malita919e2092019-01-09 15:37:57 -050062 * Concrete, SkMatrix44-backed transformation.
Florin Malita4aa44412017-12-19 12:21:02 -050063 */
Florin Malita919e2092019-01-09 15:37:57 -050064class Matrix44 final : public Transform {
Florin Malita4aa44412017-12-19 12:21:02 -050065public:
Florin Malita919e2092019-01-09 15:37:57 -050066 static sk_sp<Matrix44> Make(const SkMatrix44& m);
67
68 SG_ATTRIBUTE(Matrix, SkMatrix44, fMatrix)
69
Florin Malita919e2092019-01-09 15:37:57 -050070protected:
71 explicit Matrix44(const SkMatrix44&);
72
73 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
74
Florin Malitadf0e1af2019-01-10 11:27:13 -050075 SkMatrix asMatrix () const override;
76 SkMatrix44 asMatrix44() const override;
77
Florin Malita919e2092019-01-09 15:37:57 -050078private:
79 SkMatrix44 fMatrix;
80
81 using INHERITED = Transform;
82};
83
84/**
85 * Concrete Effect node, binding a Transform to a RenderNode.
86 */
87class TransformEffect final : public EffectNode {
88public:
89 static sk_sp<TransformEffect> Make(sk_sp<RenderNode> child, sk_sp<Transform> transform) {
90 return child && transform
91 ? sk_sp<TransformEffect>(new TransformEffect(std::move(child), std::move(transform)))
Florin Malita18eafd92018-01-04 21:11:55 -050092 : nullptr;
Florin Malita4aa44412017-12-19 12:21:02 -050093 }
94
Florin Malita919e2092019-01-09 15:37:57 -050095 static sk_sp<TransformEffect> Make(sk_sp<RenderNode> child, const SkMatrix& m) {
Florin Malita18eafd92018-01-04 21:11:55 -050096 return Make(std::move(child), Matrix::Make(m));
97 }
98
Florin Malita919e2092019-01-09 15:37:57 -050099 ~TransformEffect() override;
Florin Malita18eafd92018-01-04 21:11:55 -0500100
Florin Malita919e2092019-01-09 15:37:57 -0500101 const sk_sp<Transform>& getTransform() const { return fTransform; }
Florin Malita4aa44412017-12-19 12:21:02 -0500102
103protected:
Florin Malitac0132ff2018-08-09 07:40:01 -0400104 void onRender(SkCanvas*, const RenderContext*) const override;
Florin Malita4aa44412017-12-19 12:21:02 -0500105
Florin Malitac14f1442018-01-05 11:32:31 -0500106 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
Florin Malita4aa44412017-12-19 12:21:02 -0500107
108private:
Florin Malita919e2092019-01-09 15:37:57 -0500109 TransformEffect(sk_sp<RenderNode>, sk_sp<Transform>);
Florin Malita16d0ad02018-01-19 15:07:29 -0500110
Florin Malita919e2092019-01-09 15:37:57 -0500111 const sk_sp<Transform> fTransform;
Florin Malita4aa44412017-12-19 12:21:02 -0500112
113 typedef EffectNode INHERITED;
114};
115
116} // namespace sksg
117
118#endif // SkSGTransform_DEFINED