• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2019 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 "modules/skottie/src/effects/Effects.h"
9 
10 #include "modules/skottie/src/SkottieAdapter.h"
11 #include "modules/skottie/src/SkottieJson.h"
12 #include "modules/sksg/include/SkSGOpacityEffect.h"
13 #include "modules/sksg/include/SkSGTransform.h"
14 
15 namespace skottie {
16 namespace internal {
17 
18 namespace  {
19 
20 // Transform effects can operate in either uniform or anisotropic mode, with each
21 // component (including mode) animated separately.
22 class ScaleAdapter final : public SkNVRefCnt<ScaleAdapter> {
23 public:
ScaleAdapter(sk_sp<TransformAdapter2D> tadapter)24     explicit ScaleAdapter(sk_sp<TransformAdapter2D> tadapter)
25         : fTransformAdapter(std::move(tadapter)) {}
26 
27     ADAPTER_PROPERTY(IsUniform  , bool    , false)
28     ADAPTER_PROPERTY(ScaleWidth , SkScalar,   100)
29     ADAPTER_PROPERTY(ScaleHeight, SkScalar,   100)
30 
31 private:
apply()32     void apply() {
33         // In uniform mode, the scale is based solely in ScaleHeight.
34         const auto scale = SkVector::Make(fIsUniform ? fScaleHeight : fScaleWidth,
35                                           fScaleHeight);
36         fTransformAdapter->setScale(scale);
37     }
38 
39     const sk_sp<TransformAdapter2D> fTransformAdapter;
40 };
41 
42 } // anonymous ns
43 
attachTransformEffect(const skjson::ArrayValue & jprops,sk_sp<sksg::RenderNode> layer) const44 sk_sp<sksg::RenderNode> EffectBuilder::attachTransformEffect(const skjson::ArrayValue& jprops,
45                                                              sk_sp<sksg::RenderNode> layer) const {
46     enum : size_t {
47         kAnchorPoint_Index            =  0,
48         kPosition_Index               =  1,
49         kUniformScale_Index           =  2,
50         kScaleHeight_Index            =  3,
51         kScaleWidth_Index             =  4,
52         kSkew_Index                   =  5,
53         kSkewAxis_Index               =  6,
54         kRotation_Index               =  7,
55         kOpacity_Index                =  8,
56         // kUseCompShutterAngle_Index =  9,
57         // kShutterAngle_Index        = 10,
58         // kSampling_Index            = 11,
59     };
60 
61     auto matrix = sksg::Matrix<SkMatrix>::Make(SkMatrix::I());
62     auto t_adapter = sk_make_sp<TransformAdapter2D>(matrix);
63     auto s_adapter = sk_make_sp<ScaleAdapter>(t_adapter);
64 
65     fBuilder->bindProperty<VectorValue>(GetPropValue(jprops, kAnchorPoint_Index),
66         [t_adapter](const VectorValue& ap) {
67             t_adapter->setAnchorPoint(ValueTraits<VectorValue>::As<SkPoint>(ap));
68         });
69     fBuilder->bindProperty<VectorValue>(GetPropValue(jprops, kPosition_Index),
70         [t_adapter](const VectorValue& p) {
71             t_adapter->setPosition(ValueTraits<VectorValue>::As<SkPoint>(p));
72         });
73     fBuilder->bindProperty<ScalarValue>(GetPropValue(jprops, kRotation_Index),
74         [t_adapter](const ScalarValue& r) {
75             t_adapter->setRotation(r);
76         });
77     fBuilder->bindProperty<ScalarValue>(GetPropValue(jprops, kSkew_Index),
78         [t_adapter](const ScalarValue& s) {
79             t_adapter->setSkew(s);
80         });
81     fBuilder->bindProperty<ScalarValue>(GetPropValue(jprops, kSkewAxis_Index),
82         [t_adapter](const ScalarValue& sa) {
83             t_adapter->setSkewAxis(sa);
84         });
85 
86     fBuilder->bindProperty<ScalarValue>(GetPropValue(jprops, kUniformScale_Index),
87         [s_adapter](const ScalarValue& u) {
88             s_adapter->setIsUniform(SkScalarRoundToInt(u));
89         });
90     fBuilder->bindProperty<ScalarValue>(GetPropValue(jprops, kScaleHeight_Index),
91         [s_adapter](const ScalarValue& sh) {
92             s_adapter->setScaleHeight(sh);
93         });
94     fBuilder->bindProperty<ScalarValue>(GetPropValue(jprops, kScaleWidth_Index),
95         [s_adapter](const ScalarValue& sw) {
96             s_adapter->setScaleWidth(sw);
97         });
98 
99     auto opacity_node = sksg::OpacityEffect::Make(sksg::TransformEffect::Make(std::move(layer),
100                                                                               std::move(matrix)));
101 
102     fBuilder->bindProperty<ScalarValue>(GetPropValue(jprops, kOpacity_Index),
103         [opacity_node](const ScalarValue& o) {
104             opacity_node->setOpacity(o * 0.01f);
105         });
106 
107     return opacity_node;
108 }
109 
110 } // namespace internal
111 } // namespace skottie
112