/* * 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 SkottieUtils_DEFINED #define SkottieUtils_DEFINED #include "include/core/SkColor.h" #include "include/core/SkString.h" #include "include/private/SkTHash.h" #include "modules/skottie/include/Skottie.h" #include "modules/skottie/include/SkottieProperty.h" #include #include #include #include class SkAnimCodecPlayer; class SkData; class SkImage; namespace skottie_utils { class MultiFrameImageAsset final : public skottie::ImageAsset { public: /** * By default, images are decoded on-the-fly, at rasterization time. * Large images may cause jank as decoding is expensive (and can thrash internal caches). * * Pass |predecode| true to force-decode all images upfront, at the cost of potentially more RAM * and slower animation build times. */ static sk_sp Make(sk_sp, bool predecode = false); bool isMultiFrame() override; sk_sp getFrame(float t) override; private: explicit MultiFrameImageAsset(std::unique_ptr, bool predecode); std::unique_ptr fPlayer; bool fPreDecode; using INHERITED = skottie::ImageAsset; }; class FileResourceProvider final : public skottie::ResourceProvider { public: static sk_sp Make(SkString base_dir); sk_sp load(const char resource_path[], const char resource_name[]) const override; sk_sp loadImageAsset(const char[], const char []) const override; private: explicit FileResourceProvider(SkString); const SkString fDir; using INHERITED = skottie::ResourceProvider; }; /** * CustomPropertyManager implements a property management scheme where color/opacity/transform * attributes are grouped and manipulated by name (one-to-many mapping). * * - setters apply the value to all properties in a named group * * - getters return all the managed property groups, and the first value within each of them * (unchecked assumption: all properties within the same group have the same value) * * Attach to an Animation::Builder using the utility methods below to intercept properties and * markers at build time. */ class CustomPropertyManager final { public: CustomPropertyManager(); ~CustomPropertyManager(); using PropKey = std::string; std::vector getColorProps() const; skottie::ColorPropertyValue getColor(const PropKey&) const; bool setColor(const PropKey&, const skottie::ColorPropertyValue&); std::vector getOpacityProps() const; skottie::OpacityPropertyValue getOpacity(const PropKey&) const; bool setOpacity(const PropKey&, const skottie::OpacityPropertyValue&); std::vector getTransformProps() const; skottie::TransformPropertyValue getTransform(const PropKey&) const; bool setTransform(const PropKey&, const skottie::TransformPropertyValue&); struct MarkerInfo { std::string name; float t0, t1; }; const std::vector& markers() const { return fMarkers; } // Returns a property observer to be attached to an animation builder. sk_sp getPropertyObserver() const; // Returns a marker observer to be attached to an animation builder. sk_sp getMarkerObserver() const; private: class PropertyInterceptor; class MarkerInterceptor; static std::string acceptKey(const char* name) { static constexpr char kPrefix = '$'; return (name[0] == kPrefix && name[1] != '\0') ? std::string(name + 1) : std::string(); } sk_sp fPropertyInterceptor; sk_sp fMarkerInterceptor; template using PropGroup = std::vector>; template using PropMap = std::unordered_map>; template std::vector getProps(const PropMap& container) const; template V get(const PropKey&, const PropMap& container) const; template bool set(const PropKey&, const V&, const PropMap& container); PropMap fColorMap; PropMap fOpacityMap; PropMap fTransformMap; std::vector fMarkers; }; } // namespace skottie_utils #endif // SkottieUtils_DEFINED