1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SlotManager_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SlotManager_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAPI.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/src/SkottieValue.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/src/text/TextAdapter.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTHash.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker #include <optional> 21*c8dee2aaSAndroid Build Coastguard Worker 22*c8dee2aaSAndroid Build Coastguard Worker struct SkV2; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker namespace skresources { 25*c8dee2aaSAndroid Build Coastguard Worker class ImageAsset; 26*c8dee2aaSAndroid Build Coastguard Worker } 27*c8dee2aaSAndroid Build Coastguard Worker 28*c8dee2aaSAndroid Build Coastguard Worker namespace skottie { 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker struct TextPropertyValue; 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker namespace internal { 33*c8dee2aaSAndroid Build Coastguard Worker class AnimationBuilder; 34*c8dee2aaSAndroid Build Coastguard Worker class SceneGraphRevalidator; 35*c8dee2aaSAndroid Build Coastguard Worker class AnimatablePropertyContainer; 36*c8dee2aaSAndroid Build Coastguard Worker } // namespace internal 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private; 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker class SK_API SlotManager final : public SkRefCnt { 41*c8dee2aaSAndroid Build Coastguard Worker 42*c8dee2aaSAndroid Build Coastguard Worker public: 43*c8dee2aaSAndroid Build Coastguard Worker using SlotID = SkString; 44*c8dee2aaSAndroid Build Coastguard Worker 45*c8dee2aaSAndroid Build Coastguard Worker SlotManager(sk_sp<skottie::internal::SceneGraphRevalidator>); 46*c8dee2aaSAndroid Build Coastguard Worker ~SlotManager() override; 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker bool setColorSlot(const SlotID&, SkColor); 49*c8dee2aaSAndroid Build Coastguard Worker bool setImageSlot(const SlotID&, const sk_sp<skresources::ImageAsset>&); 50*c8dee2aaSAndroid Build Coastguard Worker bool setScalarSlot(const SlotID&, float); 51*c8dee2aaSAndroid Build Coastguard Worker bool setVec2Slot(const SlotID&, SkV2); 52*c8dee2aaSAndroid Build Coastguard Worker bool setTextSlot(const SlotID&, const TextPropertyValue&); 53*c8dee2aaSAndroid Build Coastguard Worker 54*c8dee2aaSAndroid Build Coastguard Worker std::optional<SkColor> getColorSlot(const SlotID&) const; 55*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const skresources::ImageAsset> getImageSlot(const SlotID&) const; 56*c8dee2aaSAndroid Build Coastguard Worker std::optional<float> getScalarSlot(const SlotID&) const; 57*c8dee2aaSAndroid Build Coastguard Worker std::optional<SkV2> getVec2Slot(const SlotID&) const; 58*c8dee2aaSAndroid Build Coastguard Worker std::optional<TextPropertyValue> getTextSlot(const SlotID&) const; 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker struct SlotInfo { 61*c8dee2aaSAndroid Build Coastguard Worker TArray<SlotID> fColorSlotIDs; 62*c8dee2aaSAndroid Build Coastguard Worker TArray<SlotID> fScalarSlotIDs; 63*c8dee2aaSAndroid Build Coastguard Worker TArray<SlotID> fVec2SlotIDs; 64*c8dee2aaSAndroid Build Coastguard Worker TArray<SlotID> fImageSlotIDs; 65*c8dee2aaSAndroid Build Coastguard Worker TArray<SlotID> fTextSlotIDs; 66*c8dee2aaSAndroid Build Coastguard Worker }; 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker // Helper function to get all slot IDs and their value types 69*c8dee2aaSAndroid Build Coastguard Worker SlotInfo getSlotInfo() const; 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker private: 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker // pass value to the SlotManager for manipulation and node for invalidation 74*c8dee2aaSAndroid Build Coastguard Worker void trackColorValue(const SlotID&, ColorValue*, 75*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skottie::internal::AnimatablePropertyContainer>); 76*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skresources::ImageAsset> trackImageValue(const SlotID&, sk_sp<skresources::ImageAsset>); 77*c8dee2aaSAndroid Build Coastguard Worker void trackScalarValue(const SlotID&, ScalarValue*, 78*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skottie::internal::AnimatablePropertyContainer>); 79*c8dee2aaSAndroid Build Coastguard Worker void trackVec2Value(const SlotID&, Vec2Value*, 80*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skottie::internal::AnimatablePropertyContainer>); 81*c8dee2aaSAndroid Build Coastguard Worker void trackTextValue(const SlotID&, sk_sp<skottie::internal::TextAdapter>); 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker // ValuePair tracks a pointer to a value to change, and a means to invalidate the render tree. 84*c8dee2aaSAndroid Build Coastguard Worker // For the latter, we can take either a node in the scene graph that directly the scene graph, 85*c8dee2aaSAndroid Build Coastguard Worker // or an adapter which takes the value passed and interprets it before pushing to the scene 86*c8dee2aaSAndroid Build Coastguard Worker // (clamping, normalizing, etc.) 87*c8dee2aaSAndroid Build Coastguard Worker // Only one should be set, it is UB to create a ValuePair with both a node and an adapter. 88*c8dee2aaSAndroid Build Coastguard Worker template <typename T> 89*c8dee2aaSAndroid Build Coastguard Worker struct ValuePair 90*c8dee2aaSAndroid Build Coastguard Worker { 91*c8dee2aaSAndroid Build Coastguard Worker T value; 92*c8dee2aaSAndroid Build Coastguard Worker sk_sp<skottie::internal::AnimatablePropertyContainer> adapter; 93*c8dee2aaSAndroid Build Coastguard Worker }; 94*c8dee2aaSAndroid Build Coastguard Worker 95*c8dee2aaSAndroid Build Coastguard Worker class ImageAssetProxy; 96*c8dee2aaSAndroid Build Coastguard Worker template <typename T> 97*c8dee2aaSAndroid Build Coastguard Worker using SlotMap = THashMap<SlotID, TArray<T>>; 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker SlotMap<ValuePair<ColorValue*>> fColorMap; 100*c8dee2aaSAndroid Build Coastguard Worker SlotMap<ValuePair<ScalarValue*>> fScalarMap; 101*c8dee2aaSAndroid Build Coastguard Worker SlotMap<ValuePair<Vec2Value*>> fVec2Map; 102*c8dee2aaSAndroid Build Coastguard Worker SlotMap<sk_sp<ImageAssetProxy>> fImageMap; 103*c8dee2aaSAndroid Build Coastguard Worker SlotMap<sk_sp<skottie::internal::TextAdapter>> fTextMap; 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker const sk_sp<skottie::internal::SceneGraphRevalidator> fRevalidator; 106*c8dee2aaSAndroid Build Coastguard Worker 107*c8dee2aaSAndroid Build Coastguard Worker friend class skottie::internal::AnimationBuilder; 108*c8dee2aaSAndroid Build Coastguard Worker friend class skottie::internal::AnimatablePropertyContainer; 109*c8dee2aaSAndroid Build Coastguard Worker }; 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker } // namespace skottie 112*c8dee2aaSAndroid Build Coastguard Worker 113*c8dee2aaSAndroid Build Coastguard Worker #endif // SlotManager_DEFINED 114