blob: 9f0fd77a0c9c495e8d31ee1291ba5ccdbbc7fff6 [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 Malita13c1b962019-01-10 14:44:59 -050029 virtual bool is44() const = 0;
30
Florin Malitadf0e1af2019-01-10 11:27:13 -050031 virtual SkMatrix asMatrix () const = 0;
32 virtual SkMatrix44 asMatrix44() const = 0;
33
Florin Malita919e2092019-01-09 15:37:57 -050034private:
Florin Malitadf0e1af2019-01-10 11:27:13 -050035 friend class TransformPriv;
36
Florin Malita919e2092019-01-09 15:37:57 -050037 using INHERITED = Node;
38};
39
40/**
41 * Concrete, SkMatrix-backed transformation.
42 */
43class Matrix final : public Transform {
44public:
45 static sk_sp<Matrix> Make(const SkMatrix& m);
Florin Malita18eafd92018-01-04 21:11:55 -050046
Florin Malita16322632018-09-12 10:15:34 -040047 SG_ATTRIBUTE(Matrix, SkMatrix, fMatrix)
Florin Malita18eafd92018-01-04 21:11:55 -050048
Florin Malita18eafd92018-01-04 21:11:55 -050049protected:
Florin Malita16322632018-09-12 10:15:34 -040050 explicit Matrix(const SkMatrix&);
Florin Malita18eafd92018-01-04 21:11:55 -050051
Florin Malitac14f1442018-01-05 11:32:31 -050052 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
Florin Malita18eafd92018-01-04 21:11:55 -050053
Florin Malita13c1b962019-01-10 14:44:59 -050054 bool is44() const override { return false; }
55
Florin Malitadf0e1af2019-01-10 11:27:13 -050056 SkMatrix asMatrix () const override;
57 SkMatrix44 asMatrix44() const override;
58
Florin Malita18eafd92018-01-04 21:11:55 -050059private:
Florin Malita16322632018-09-12 10:15:34 -040060 SkMatrix fMatrix;
Florin Malita18eafd92018-01-04 21:11:55 -050061
Florin Malita919e2092019-01-09 15:37:57 -050062 using INHERITED = Transform;
Florin Malita18eafd92018-01-04 21:11:55 -050063};
64
65/**
Florin Malita919e2092019-01-09 15:37:57 -050066 * Concrete, SkMatrix44-backed transformation.
Florin Malita4aa44412017-12-19 12:21:02 -050067 */
Florin Malita919e2092019-01-09 15:37:57 -050068class Matrix44 final : public Transform {
Florin Malita4aa44412017-12-19 12:21:02 -050069public:
Florin Malita919e2092019-01-09 15:37:57 -050070 static sk_sp<Matrix44> Make(const SkMatrix44& m);
71
72 SG_ATTRIBUTE(Matrix, SkMatrix44, fMatrix)
73
Florin Malita919e2092019-01-09 15:37:57 -050074protected:
75 explicit Matrix44(const SkMatrix44&);
76
77 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
78
Florin Malita13c1b962019-01-10 14:44:59 -050079 bool is44() const override { return true; }
80
Florin Malitadf0e1af2019-01-10 11:27:13 -050081 SkMatrix asMatrix () const override;
82 SkMatrix44 asMatrix44() const override;
83
Florin Malita919e2092019-01-09 15:37:57 -050084private:
85 SkMatrix44 fMatrix;
86
87 using INHERITED = Transform;
88};
89
90/**
91 * Concrete Effect node, binding a Transform to a RenderNode.
92 */
93class TransformEffect final : public EffectNode {
94public:
95 static sk_sp<TransformEffect> Make(sk_sp<RenderNode> child, sk_sp<Transform> transform) {
96 return child && transform
97 ? sk_sp<TransformEffect>(new TransformEffect(std::move(child), std::move(transform)))
Florin Malita18eafd92018-01-04 21:11:55 -050098 : nullptr;
Florin Malita4aa44412017-12-19 12:21:02 -050099 }
100
Florin Malita919e2092019-01-09 15:37:57 -0500101 static sk_sp<TransformEffect> Make(sk_sp<RenderNode> child, const SkMatrix& m) {
Florin Malita18eafd92018-01-04 21:11:55 -0500102 return Make(std::move(child), Matrix::Make(m));
103 }
104
Florin Malita919e2092019-01-09 15:37:57 -0500105 ~TransformEffect() override;
Florin Malita18eafd92018-01-04 21:11:55 -0500106
Florin Malita919e2092019-01-09 15:37:57 -0500107 const sk_sp<Transform>& getTransform() const { return fTransform; }
Florin Malita4aa44412017-12-19 12:21:02 -0500108
109protected:
Florin Malitac0132ff2018-08-09 07:40:01 -0400110 void onRender(SkCanvas*, const RenderContext*) const override;
Florin Malita4aa44412017-12-19 12:21:02 -0500111
Florin Malitac14f1442018-01-05 11:32:31 -0500112 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
Florin Malita4aa44412017-12-19 12:21:02 -0500113
114private:
Florin Malita919e2092019-01-09 15:37:57 -0500115 TransformEffect(sk_sp<RenderNode>, sk_sp<Transform>);
Florin Malita16d0ad02018-01-19 15:07:29 -0500116
Florin Malita919e2092019-01-09 15:37:57 -0500117 const sk_sp<Transform> fTransform;
Florin Malita4aa44412017-12-19 12:21:02 -0500118
119 typedef EffectNode INHERITED;
120};
121
122} // namespace sksg
123
124#endif // SkSGTransform_DEFINED