blob: e08f4ecca4d91ededbb970d4544ea7813f299c35 [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
26 // TODO: hide these from public API?
27 virtual SkMatrix asMatrix () const = 0;
28 virtual SkMatrix44 asMatrix44() const = 0;
29
30protected:
31 Transform();
32
33private:
34 using INHERITED = Node;
35};
36
37/**
38 * Concrete, SkMatrix-backed transformation.
39 */
40class Matrix final : public Transform {
41public:
42 static sk_sp<Matrix> Make(const SkMatrix& m);
Florin Malita18eafd92018-01-04 21:11:55 -050043
Florin Malita16322632018-09-12 10:15:34 -040044 SG_ATTRIBUTE(Matrix, SkMatrix, fMatrix)
Florin Malita18eafd92018-01-04 21:11:55 -050045
Florin Malita919e2092019-01-09 15:37:57 -050046 SkMatrix asMatrix () const override;
47 SkMatrix44 asMatrix44() const override;
Florin Malita18eafd92018-01-04 21:11:55 -050048
49protected:
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
54private:
Florin Malita16322632018-09-12 10:15:34 -040055 SkMatrix fMatrix;
Florin Malita18eafd92018-01-04 21:11:55 -050056
Florin Malita919e2092019-01-09 15:37:57 -050057 using INHERITED = Transform;
Florin Malita18eafd92018-01-04 21:11:55 -050058};
59
60/**
Florin Malita919e2092019-01-09 15:37:57 -050061 * Concrete, SkMatrix44-backed transformation.
Florin Malita4aa44412017-12-19 12:21:02 -050062 */
Florin Malita919e2092019-01-09 15:37:57 -050063class Matrix44 final : public Transform {
Florin Malita4aa44412017-12-19 12:21:02 -050064public:
Florin Malita919e2092019-01-09 15:37:57 -050065 static sk_sp<Matrix44> Make(const SkMatrix44& m);
66
67 SG_ATTRIBUTE(Matrix, SkMatrix44, fMatrix)
68
69 SkMatrix asMatrix () const override;
70 SkMatrix44 asMatrix44() const override;
71
72protected:
73 explicit Matrix44(const SkMatrix44&);
74
75 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
76
77private:
78 SkMatrix44 fMatrix;
79
80 using INHERITED = Transform;
81};
82
83/**
84 * Concrete Effect node, binding a Transform to a RenderNode.
85 */
86class TransformEffect final : public EffectNode {
87public:
88 static sk_sp<TransformEffect> Make(sk_sp<RenderNode> child, sk_sp<Transform> transform) {
89 return child && transform
90 ? sk_sp<TransformEffect>(new TransformEffect(std::move(child), std::move(transform)))
Florin Malita18eafd92018-01-04 21:11:55 -050091 : nullptr;
Florin Malita4aa44412017-12-19 12:21:02 -050092 }
93
Florin Malita919e2092019-01-09 15:37:57 -050094 static sk_sp<TransformEffect> Make(sk_sp<RenderNode> child, const SkMatrix& m) {
Florin Malita18eafd92018-01-04 21:11:55 -050095 return Make(std::move(child), Matrix::Make(m));
96 }
97
Florin Malita919e2092019-01-09 15:37:57 -050098 ~TransformEffect() override;
Florin Malita18eafd92018-01-04 21:11:55 -050099
Florin Malita919e2092019-01-09 15:37:57 -0500100 const sk_sp<Transform>& getTransform() const { return fTransform; }
Florin Malita4aa44412017-12-19 12:21:02 -0500101
102protected:
Florin Malitac0132ff2018-08-09 07:40:01 -0400103 void onRender(SkCanvas*, const RenderContext*) const override;
Florin Malita4aa44412017-12-19 12:21:02 -0500104
Florin Malitac14f1442018-01-05 11:32:31 -0500105 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
Florin Malita4aa44412017-12-19 12:21:02 -0500106
107private:
Florin Malita919e2092019-01-09 15:37:57 -0500108 TransformEffect(sk_sp<RenderNode>, sk_sp<Transform>);
Florin Malita16d0ad02018-01-19 15:07:29 -0500109
Florin Malita919e2092019-01-09 15:37:57 -0500110 const sk_sp<Transform> fTransform;
Florin Malita4aa44412017-12-19 12:21:02 -0500111
112 typedef EffectNode INHERITED;
113};
114
115} // namespace sksg
116
117#endif // SkSGTransform_DEFINED