/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkottieProperty_DEFINED #define SkottieProperty_DEFINED #include "SkColor.h" #include "SkPoint.h" #include "SkRefCnt.h" #include <functional> class SkMatrix; namespace sksg { class Color; class OpacityEffect; } // namespace sksg namespace skottie { using ColorPropertyValue = SkColor; using OpacityPropertyValue = float; struct TransformPropertyValue { SkPoint fAnchorPoint, fPosition; SkVector fScale; SkScalar fRotation, fSkew, fSkewAxis; bool operator==(const TransformPropertyValue& other) const; bool operator!=(const TransformPropertyValue& other) const; }; namespace internal { class AnimationBuilder; } /** * Property handles are adapters between user-facing AE model/values * and the internal scene-graph representation. */ template <typename ValueT, typename NodeT> class SK_API PropertyHandle final { public: ~PropertyHandle(); ValueT get() const; void set(const ValueT&); private: explicit PropertyHandle(sk_sp<NodeT> node) : fNode(std::move(node)) {} friend class skottie::internal::AnimationBuilder; const sk_sp<NodeT> fNode; }; class TransformAdapter2D; using ColorPropertyHandle = PropertyHandle<ColorPropertyValue , sksg::Color >; using OpacityPropertyHandle = PropertyHandle<OpacityPropertyValue , sksg::OpacityEffect >; using TransformPropertyHandle = PropertyHandle<TransformPropertyValue, TransformAdapter2D >; /** * A PropertyObserver can be used to track and manipulate certain properties of "interesting" * Lottie nodes. * * When registered with an animation builder, PropertyObserver receives notifications for * various properties of layer and shape nodes. The |node_name| argument corresponds to the * name ("nm") node property. */ class SK_API PropertyObserver : public SkRefCnt { public: template <typename T> using LazyHandle = std::function<std::unique_ptr<T>()>; virtual void onColorProperty (const char node_name[], const LazyHandle<ColorPropertyHandle>&); virtual void onOpacityProperty (const char node_name[], const LazyHandle<OpacityPropertyHandle>&); virtual void onTransformProperty(const char node_name[], const LazyHandle<TransformPropertyHandle>&); }; } // namespace skottie #endif // SkottieProperty_DEFINED