1 /*
2  * Copyright 2018 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 SkottieProperty_DEFINED
9 #define SkottieProperty_DEFINED
10 
11 #include "SkColor.h"
12 #include "SkPoint.h"
13 #include "SkRefCnt.h"
14 
15 #include <functional>
16 
17 class SkMatrix;
18 
19 namespace sksg {
20 
21 class Color;
22 class OpacityEffect;
23 
24 } // namespace sksg
25 
26 namespace skottie {
27 
28 using ColorPropertyValue   = SkColor;
29 using OpacityPropertyValue = float;
30 
31 struct TransformPropertyValue {
32     SkPoint  fAnchorPoint,
33              fPosition;
34     SkVector fScale;
35     SkScalar fRotation,
36              fSkew,
37              fSkewAxis;
38 
39     bool operator==(const TransformPropertyValue& other) const;
40     bool operator!=(const TransformPropertyValue& other) const;
41 };
42 
43 namespace internal { class AnimationBuilder; }
44 
45 /**
46  * Property handles are adapters between user-facing AE model/values
47  * and the internal scene-graph representation.
48  */
49 template <typename ValueT, typename NodeT>
50 class SK_API PropertyHandle final {
51 public:
52     ~PropertyHandle();
53 
54     ValueT get() const;
55     void set(const ValueT&);
56 
57 private:
PropertyHandle(sk_sp<NodeT> node)58     explicit PropertyHandle(sk_sp<NodeT> node) : fNode(std::move(node)) {}
59 
60     friend class skottie::internal::AnimationBuilder;
61 
62     const sk_sp<NodeT> fNode;
63 };
64 
65 class TransformAdapter2D;
66 
67 using ColorPropertyHandle     = PropertyHandle<ColorPropertyValue    , sksg::Color         >;
68 using OpacityPropertyHandle   = PropertyHandle<OpacityPropertyValue  , sksg::OpacityEffect >;
69 using TransformPropertyHandle = PropertyHandle<TransformPropertyValue, TransformAdapter2D  >;
70 
71 /**
72  * A PropertyObserver can be used to track and manipulate certain properties of "interesting"
73  * Lottie nodes.
74  *
75  * When registered with an animation builder, PropertyObserver receives notifications for
76  * various properties of layer and shape nodes.  The |node_name| argument corresponds to the
77  * name ("nm") node property.
78  */
79 class SK_API PropertyObserver : public SkRefCnt {
80 public:
81     template <typename T>
82     using LazyHandle = std::function<std::unique_ptr<T>()>;
83 
84     virtual void onColorProperty    (const char node_name[],
85                                      const LazyHandle<ColorPropertyHandle>&);
86     virtual void onOpacityProperty  (const char node_name[],
87                                      const LazyHandle<OpacityPropertyHandle>&);
88     virtual void onTransformProperty(const char node_name[],
89                                      const LazyHandle<TransformPropertyHandle>&);
90 };
91 
92 } // namespace skottie
93 
94 #endif // SkottieProperty_DEFINED
95