• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 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 SkottieTransform_DEFINED
9 #define SkottieTransform_DEFINED
10 
11 #include "include/core/SkM44.h"
12 #include "include/core/SkMatrix.h"
13 #include "include/core/SkPoint.h"
14 #include "modules/skottie/src/Adapter.h"
15 #include "modules/skottie/src/SkottieValue.h"
16 #include "modules/sksg/include/SkSGTransform.h"
17 
18 namespace skjson {
19 
20 class ObjectValue;
21 
22 } // namespace skjson
23 
24 namespace skottie {
25 namespace internal {
26 
27 class TransformAdapter2D final : public DiscardableAdapterBase<TransformAdapter2D,
28                                                                sksg::Matrix<SkMatrix>> {
29 public:
30     TransformAdapter2D(const AnimationBuilder&,
31                        const skjson::ObjectValue* janchor_point,
32                        const skjson::ObjectValue* jposition,
33                        const skjson::ObjectValue* jscale,
34                        const skjson::ObjectValue* jrotation,
35                        const skjson::ObjectValue* jskew,
36                        const skjson::ObjectValue* jskew_axis,
37                        bool auto_orient = false);
38     ~TransformAdapter2D() override;
39 
40     // Accessors needed for public property APIs.
41     // TODO: introduce a separate public type.
42     SkPoint getAnchorPoint() const;
43     void    setAnchorPoint(const SkPoint&);
44 
45     SkPoint getPosition() const;
46     void    setPosition(const SkPoint&);
47 
48     SkVector getScale() const;
49     void     setScale(const SkVector&);
50 
getRotation()51     float getRotation() const  { return fRotation; }
52     void  setRotation(float r);
53 
getSkew()54     float getSkew() const   { return fSkew; }
55     void  setSkew(float sk);
56 
getSkewAxis()57     float getSkewAxis() const    { return fSkewAxis; }
58     void  setSkewAxis(float sa );
59 
60     SkMatrix totalMatrix() const;
61 
62 private:
63     void onSync() override;
64 
65     Vec2Value   fAnchorPoint = {   0,   0 },
66                 fPosition    = {   0,   0 },
67                 fScale       = { 100, 100 };
68     ScalarValue fRotation    = 0,
69                 fSkew        = 0,
70                 fSkewAxis    = 0,
71                 fOrientation = 0; // additional rotation component controlled by auto-orient
72 
73     using INHERITED = DiscardableAdapterBase<TransformAdapter2D, sksg::Matrix<SkMatrix>>;
74 };
75 
76 class TransformAdapter3D : public DiscardableAdapterBase<TransformAdapter3D, sksg::Matrix<SkM44>> {
77 public:
78     TransformAdapter3D(const skjson::ObjectValue&, const AnimationBuilder&);
79     ~TransformAdapter3D() override;
80 
81     virtual SkM44 totalMatrix() const;
82 
83 protected:
84     SkV3 anchor_point() const;
85     SkV3 position() const;
86     SkV3 rotation() const;
87 
88 private:
89     void onSync() final;
90 
91     VectorValue fAnchorPoint,
92                 fPosition,
93                 fOrientation,
94                 fScale = { 100, 100, 100 };
95     ScalarValue fRx = 0,
96                 fRy = 0,
97                 fRz = 0;
98 
99     using INHERITED = DiscardableAdapterBase<TransformAdapter3D, sksg::Matrix<SkM44>>;
100 };
101 
102 } // namespace internal
103 } // namespace skottie
104 
105 #endif // SkottieTransform_DEFINED
106