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 SkottieAnimator_DEFINED 9 #define SkottieAnimator_DEFINED 10 11 #include "include/core/SkRefCnt.h" 12 13 #include <vector> 14 15 struct SkV2; 16 17 namespace skjson { 18 19 class ObjectValue; 20 21 } // namespace skjson 22 23 namespace skottie { 24 namespace internal { 25 26 class AnimationBuilder; 27 class AnimatorBuilder; 28 29 class Animator : public SkRefCnt { 30 public: 31 using StateChanged = bool; seek(float t)32 StateChanged seek(float t) { return this->onSeek(t); } 33 34 protected: 35 Animator() = default; 36 37 virtual StateChanged onSeek(float t) = 0; 38 39 private: 40 Animator(const Animator&) = delete; 41 Animator& operator=(const Animator&) = delete; 42 }; 43 44 class AnimatablePropertyContainer : public Animator { 45 public: 46 // This is the workhorse for property binding: depending on whether the property is animated, 47 // it will either apply immediately or instantiate and attach a keyframe animator, scoped to 48 // this container. 49 template <typename T> 50 bool bind(const AnimationBuilder&, const skjson::ObjectValue*, T*); 51 52 template <typename T> bind(const AnimationBuilder & abuilder,const skjson::ObjectValue * jobject,T & v)53 bool bind(const AnimationBuilder& abuilder, const skjson::ObjectValue* jobject, T& v) { 54 return this->bind<T>(abuilder, jobject, &v); 55 } 56 57 // A flavor of bind<Vec2Value> which drives an additional/optional orientation target 58 // (rotation in degrees), when bound to a motion path property. 59 bool bindAutoOrientable(const AnimationBuilder& abuilder, 60 const skjson::ObjectValue* jobject, 61 SkV2* v, float* orientation); 62 isStatic()63 bool isStatic() const { return fAnimators.empty(); } 64 65 protected: 66 virtual void onSync() = 0; 67 68 void shrink_to_fit(); 69 70 void attachDiscardableAdapter(sk_sp<AnimatablePropertyContainer>); 71 72 private: 73 StateChanged onSeek(float) final; 74 75 bool bindImpl(const AnimationBuilder&, const skjson::ObjectValue*, AnimatorBuilder&); 76 77 std::vector<sk_sp<Animator>> fAnimators; 78 bool fHasSynced = false; 79 }; 80 81 } // namespace internal 82 } // namespace skottie 83 84 #endif // SkottieAnimator_DEFINED 85