xref: /aosp_15_r20/external/skia/modules/skottie/src/SkottiePriv.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2018 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 SkottiePriv_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkottiePriv_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/Skottie.h"
13*c8dee2aaSAndroid Build Coastguard Worker 
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMgr.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontStyle.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypeface.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/ExternalLayer.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/SkottieProperty.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/SlotManager.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/src/animator/Animator.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/src/text/Font.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkUTF.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkTHash.h"
25*c8dee2aaSAndroid Build Coastguard Worker 
26*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/include/SkShaper_factory.h"
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker namespace skjson {
31*c8dee2aaSAndroid Build Coastguard Worker class ArrayValue;
32*c8dee2aaSAndroid Build Coastguard Worker class ObjectValue;
33*c8dee2aaSAndroid Build Coastguard Worker class Value;
34*c8dee2aaSAndroid Build Coastguard Worker } // namespace skjson
35*c8dee2aaSAndroid Build Coastguard Worker 
36*c8dee2aaSAndroid Build Coastguard Worker namespace sksg {
37*c8dee2aaSAndroid Build Coastguard Worker class Color;
38*c8dee2aaSAndroid Build Coastguard Worker class Path;
39*c8dee2aaSAndroid Build Coastguard Worker class RenderNode;
40*c8dee2aaSAndroid Build Coastguard Worker class Transform;
41*c8dee2aaSAndroid Build Coastguard Worker } // namespace sksg
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker namespace skottie {
44*c8dee2aaSAndroid Build Coastguard Worker namespace internal {
45*c8dee2aaSAndroid Build Coastguard Worker 
46*c8dee2aaSAndroid Build Coastguard Worker // Close-enough to AE.
47*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kBlurSizeToSigma = 0.3f;
48*c8dee2aaSAndroid Build Coastguard Worker 
49*c8dee2aaSAndroid Build Coastguard Worker class TextAdapter;
50*c8dee2aaSAndroid Build Coastguard Worker class TransformAdapter2D;
51*c8dee2aaSAndroid Build Coastguard Worker class TransformAdapter3D;
52*c8dee2aaSAndroid Build Coastguard Worker class OpacityAdapter;
53*c8dee2aaSAndroid Build Coastguard Worker 
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker using AnimatorScope = std::vector<sk_sp<Animator>>;
56*c8dee2aaSAndroid Build Coastguard Worker 
57*c8dee2aaSAndroid Build Coastguard Worker class SceneGraphRevalidator final : public SkNVRefCnt<SceneGraphRevalidator> {
58*c8dee2aaSAndroid Build Coastguard Worker public:
59*c8dee2aaSAndroid Build Coastguard Worker     void revalidate();
60*c8dee2aaSAndroid Build Coastguard Worker     void setRoot(sk_sp<sksg::RenderNode>);
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker private:
63*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> fRoot;
64*c8dee2aaSAndroid Build Coastguard Worker };
65*c8dee2aaSAndroid Build Coastguard Worker 
66*c8dee2aaSAndroid Build Coastguard Worker class AnimationBuilder final : public SkNoncopyable {
67*c8dee2aaSAndroid Build Coastguard Worker public:
68*c8dee2aaSAndroid Build Coastguard Worker     AnimationBuilder(sk_sp<ResourceProvider>, sk_sp<SkFontMgr>, sk_sp<PropertyObserver>,
69*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<Logger>, sk_sp<MarkerObserver>, sk_sp<PrecompInterceptor>,
70*c8dee2aaSAndroid Build Coastguard Worker                      sk_sp<ExpressionManager>, sk_sp<SkShapers::Factory>,
71*c8dee2aaSAndroid Build Coastguard Worker                      Animation::Builder::Stats*, const SkSize& comp_size,
72*c8dee2aaSAndroid Build Coastguard Worker                      float duration, float framerate, uint32_t flags);
73*c8dee2aaSAndroid Build Coastguard Worker 
74*c8dee2aaSAndroid Build Coastguard Worker     struct AnimationInfo {
75*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<sksg::RenderNode> fSceneRoot;
76*c8dee2aaSAndroid Build Coastguard Worker         AnimatorScope           fAnimators;
77*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<SlotManager>      fSlotManager;
78*c8dee2aaSAndroid Build Coastguard Worker     };
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     AnimationInfo parse(const skjson::ObjectValue&);
81*c8dee2aaSAndroid Build Coastguard Worker 
82*c8dee2aaSAndroid Build Coastguard Worker     struct FontInfo {
83*c8dee2aaSAndroid Build Coastguard Worker         SkString            fFamily,
84*c8dee2aaSAndroid Build Coastguard Worker                             fStyle,
85*c8dee2aaSAndroid Build Coastguard Worker                             fPath;
86*c8dee2aaSAndroid Build Coastguard Worker         SkScalar            fAscentPct;
87*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<SkTypeface>   fTypeface;
88*c8dee2aaSAndroid Build Coastguard Worker         CustomFont::Builder fCustomFontBuilder;
89*c8dee2aaSAndroid Build Coastguard Worker 
90*c8dee2aaSAndroid Build Coastguard Worker         bool matches(const char family[], const char style[]) const;
91*c8dee2aaSAndroid Build Coastguard Worker     };
92*c8dee2aaSAndroid Build Coastguard Worker     const FontInfo* findFont(const SkString& name) const;
93*c8dee2aaSAndroid Build Coastguard Worker 
94*c8dee2aaSAndroid Build Coastguard Worker     void log(Logger::Level, const skjson::Value*, const char fmt[], ...) const SK_PRINTF_LIKE(4, 5);
95*c8dee2aaSAndroid Build Coastguard Worker 
96*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::Transform> attachMatrix2D(const skjson::ObjectValue&, sk_sp<sksg::Transform>,
97*c8dee2aaSAndroid Build Coastguard Worker                                           bool auto_orient = false) const;
98*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::Transform> attachMatrix3D(const skjson::ObjectValue&, sk_sp<sksg::Transform>,
99*c8dee2aaSAndroid Build Coastguard Worker                                           bool auto_orient = false) const;
100*c8dee2aaSAndroid Build Coastguard Worker 
101*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::Transform> attachCamera(const skjson::ObjectValue& jlayer,
102*c8dee2aaSAndroid Build Coastguard Worker                                         const skjson::ObjectValue& jtransform,
103*c8dee2aaSAndroid Build Coastguard Worker                                         sk_sp<sksg::Transform>,
104*c8dee2aaSAndroid Build Coastguard Worker                                         const SkSize&) const;
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachOpacity(const skjson::ObjectValue&,
107*c8dee2aaSAndroid Build Coastguard Worker                                           sk_sp<sksg::RenderNode>) const;
108*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::Path> attachPath(const skjson::Value&) const;
109*c8dee2aaSAndroid Build Coastguard Worker 
hasNontrivialBlending()110*c8dee2aaSAndroid Build Coastguard Worker     bool hasNontrivialBlending() const { return fHasNontrivialBlending; }
111*c8dee2aaSAndroid Build Coastguard Worker 
112*c8dee2aaSAndroid Build Coastguard Worker     class AutoScope final {
113*c8dee2aaSAndroid Build Coastguard Worker     public:
AutoScope(const AnimationBuilder * builder)114*c8dee2aaSAndroid Build Coastguard Worker         explicit AutoScope(const AnimationBuilder* builder) : AutoScope(builder, AnimatorScope()) {}
115*c8dee2aaSAndroid Build Coastguard Worker 
AutoScope(const AnimationBuilder * builder,AnimatorScope && scope)116*c8dee2aaSAndroid Build Coastguard Worker         AutoScope(const AnimationBuilder* builder, AnimatorScope&& scope)
117*c8dee2aaSAndroid Build Coastguard Worker             : fBuilder(builder)
118*c8dee2aaSAndroid Build Coastguard Worker             , fCurrentScope(std::move(scope))
119*c8dee2aaSAndroid Build Coastguard Worker             , fPrevScope(fBuilder->fCurrentAnimatorScope) {
120*c8dee2aaSAndroid Build Coastguard Worker             fBuilder->fCurrentAnimatorScope = &fCurrentScope;
121*c8dee2aaSAndroid Build Coastguard Worker         }
122*c8dee2aaSAndroid Build Coastguard Worker 
release()123*c8dee2aaSAndroid Build Coastguard Worker         AnimatorScope release() {
124*c8dee2aaSAndroid Build Coastguard Worker             fBuilder->fCurrentAnimatorScope = fPrevScope;
125*c8dee2aaSAndroid Build Coastguard Worker             SkDEBUGCODE(fBuilder = nullptr);
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker             return std::move(fCurrentScope);
128*c8dee2aaSAndroid Build Coastguard Worker         }
129*c8dee2aaSAndroid Build Coastguard Worker 
~AutoScope()130*c8dee2aaSAndroid Build Coastguard Worker         ~AutoScope() { SkASSERT(!fBuilder); }
131*c8dee2aaSAndroid Build Coastguard Worker 
132*c8dee2aaSAndroid Build Coastguard Worker     private:
133*c8dee2aaSAndroid Build Coastguard Worker         const AnimationBuilder* fBuilder;
134*c8dee2aaSAndroid Build Coastguard Worker         AnimatorScope           fCurrentScope;
135*c8dee2aaSAndroid Build Coastguard Worker         AnimatorScope*          fPrevScope;
136*c8dee2aaSAndroid Build Coastguard Worker     };
137*c8dee2aaSAndroid Build Coastguard Worker 
138*c8dee2aaSAndroid Build Coastguard Worker     template <typename T>
attachDiscardableAdapter(sk_sp<T> adapter)139*c8dee2aaSAndroid Build Coastguard Worker     void attachDiscardableAdapter(sk_sp<T> adapter) const {
140*c8dee2aaSAndroid Build Coastguard Worker         if (adapter->isStatic()) {
141*c8dee2aaSAndroid Build Coastguard Worker             // Fire off a synthetic tick to force a single SG sync before discarding.
142*c8dee2aaSAndroid Build Coastguard Worker             adapter->seek(0);
143*c8dee2aaSAndroid Build Coastguard Worker         } else {
144*c8dee2aaSAndroid Build Coastguard Worker             fCurrentAnimatorScope->push_back(std::move(adapter));
145*c8dee2aaSAndroid Build Coastguard Worker         }
146*c8dee2aaSAndroid Build Coastguard Worker     }
147*c8dee2aaSAndroid Build Coastguard Worker 
148*c8dee2aaSAndroid Build Coastguard Worker     template <typename T, typename... Args>
149*c8dee2aaSAndroid Build Coastguard Worker     auto attachDiscardableAdapter(Args&&... args) const ->
150*c8dee2aaSAndroid Build Coastguard Worker         typename std::decay<decltype(T::Make(std::forward<Args>(args)...)->node())>::type
151*c8dee2aaSAndroid Build Coastguard Worker     {
152*c8dee2aaSAndroid Build Coastguard Worker         using NodeType =
153*c8dee2aaSAndroid Build Coastguard Worker         typename std::decay<decltype(T::Make(std::forward<Args>(args)...)->node())>::type;
154*c8dee2aaSAndroid Build Coastguard Worker 
155*c8dee2aaSAndroid Build Coastguard Worker         NodeType node;
156*c8dee2aaSAndroid Build Coastguard Worker         if (auto adapter = T::Make(std::forward<Args>(args)...)) {
157*c8dee2aaSAndroid Build Coastguard Worker             node = adapter->node();
158*c8dee2aaSAndroid Build Coastguard Worker             this->attachDiscardableAdapter(std::move(adapter));
159*c8dee2aaSAndroid Build Coastguard Worker         }
160*c8dee2aaSAndroid Build Coastguard Worker         return node;
161*c8dee2aaSAndroid Build Coastguard Worker     }
162*c8dee2aaSAndroid Build Coastguard Worker 
163*c8dee2aaSAndroid Build Coastguard Worker     class AutoPropertyTracker {
164*c8dee2aaSAndroid Build Coastguard Worker     public:
AutoPropertyTracker(const AnimationBuilder * builder,const skjson::ObjectValue & obj,const PropertyObserver::NodeType node_type)165*c8dee2aaSAndroid Build Coastguard Worker         AutoPropertyTracker(const AnimationBuilder* builder, const skjson::ObjectValue& obj, const PropertyObserver::NodeType node_type)
166*c8dee2aaSAndroid Build Coastguard Worker             : fBuilder(builder)
167*c8dee2aaSAndroid Build Coastguard Worker             , fPrevContext(builder->fPropertyObserverContext), fNodeType(node_type) {
168*c8dee2aaSAndroid Build Coastguard Worker             if (fBuilder->fPropertyObserver) {
169*c8dee2aaSAndroid Build Coastguard Worker                 auto observer = builder->fPropertyObserver.get();
170*c8dee2aaSAndroid Build Coastguard Worker                 this->updateContext(observer, obj);
171*c8dee2aaSAndroid Build Coastguard Worker                 observer->onEnterNode(fBuilder->fPropertyObserverContext, fNodeType);
172*c8dee2aaSAndroid Build Coastguard Worker             }
173*c8dee2aaSAndroid Build Coastguard Worker         }
174*c8dee2aaSAndroid Build Coastguard Worker 
~AutoPropertyTracker()175*c8dee2aaSAndroid Build Coastguard Worker         ~AutoPropertyTracker() {
176*c8dee2aaSAndroid Build Coastguard Worker             if (fBuilder->fPropertyObserver) {
177*c8dee2aaSAndroid Build Coastguard Worker                 fBuilder->fPropertyObserver->onLeavingNode(fBuilder->fPropertyObserverContext, fNodeType);
178*c8dee2aaSAndroid Build Coastguard Worker                 fBuilder->fPropertyObserverContext = fPrevContext;
179*c8dee2aaSAndroid Build Coastguard Worker             }
180*c8dee2aaSAndroid Build Coastguard Worker         }
181*c8dee2aaSAndroid Build Coastguard Worker     private:
182*c8dee2aaSAndroid Build Coastguard Worker         void updateContext(PropertyObserver*, const skjson::ObjectValue&);
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker         const AnimationBuilder* fBuilder;
185*c8dee2aaSAndroid Build Coastguard Worker         const char*             fPrevContext;
186*c8dee2aaSAndroid Build Coastguard Worker         const PropertyObserver::NodeType fNodeType;
187*c8dee2aaSAndroid Build Coastguard Worker     };
188*c8dee2aaSAndroid Build Coastguard Worker 
189*c8dee2aaSAndroid Build Coastguard Worker     bool dispatchColorProperty(const sk_sp<sksg::Color>&) const;
190*c8dee2aaSAndroid Build Coastguard Worker     bool dispatchOpacityProperty(const sk_sp<sksg::OpacityEffect>&) const;
191*c8dee2aaSAndroid Build Coastguard Worker     bool dispatchTextProperty(const sk_sp<TextAdapter>&,
192*c8dee2aaSAndroid Build Coastguard Worker                               const skjson::ObjectValue* jtext) const;
193*c8dee2aaSAndroid Build Coastguard Worker     bool dispatchTransformProperty(const sk_sp<TransformAdapter2D>&) const;
194*c8dee2aaSAndroid Build Coastguard Worker 
195*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ExpressionManager> expression_manager() const;
196*c8dee2aaSAndroid Build Coastguard Worker 
getSlotsRoot()197*c8dee2aaSAndroid Build Coastguard Worker     const skjson::ObjectValue* getSlotsRoot() const {
198*c8dee2aaSAndroid Build Coastguard Worker         return fSlotsRoot;
199*c8dee2aaSAndroid Build Coastguard Worker     }
200*c8dee2aaSAndroid Build Coastguard Worker 
201*c8dee2aaSAndroid Build Coastguard Worker     void parseFonts (const skjson::ObjectValue* jfonts, const skjson::ArrayValue* jchars);
202*c8dee2aaSAndroid Build Coastguard Worker 
203*c8dee2aaSAndroid Build Coastguard Worker private:
204*c8dee2aaSAndroid Build Coastguard Worker     friend class CompositionBuilder;
205*c8dee2aaSAndroid Build Coastguard Worker     friend class CustomFont;
206*c8dee2aaSAndroid Build Coastguard Worker     friend class LayerBuilder;
207*c8dee2aaSAndroid Build Coastguard Worker     friend class AnimatablePropertyContainer;
208*c8dee2aaSAndroid Build Coastguard Worker     friend class SkSLEffectBase;
209*c8dee2aaSAndroid Build Coastguard Worker 
210*c8dee2aaSAndroid Build Coastguard Worker     struct AttachLayerContext;
211*c8dee2aaSAndroid Build Coastguard Worker     struct AttachShapeContext;
212*c8dee2aaSAndroid Build Coastguard Worker     struct FootageAssetInfo;
213*c8dee2aaSAndroid Build Coastguard Worker     struct LayerInfo;
214*c8dee2aaSAndroid Build Coastguard Worker 
215*c8dee2aaSAndroid Build Coastguard Worker     void parseAssets(const skjson::ArrayValue*);
216*c8dee2aaSAndroid Build Coastguard Worker 
217*c8dee2aaSAndroid Build Coastguard Worker     // Return true iff all fonts were resolved.
218*c8dee2aaSAndroid Build Coastguard Worker     bool resolveNativeTypefaces();
219*c8dee2aaSAndroid Build Coastguard Worker     bool resolveEmbeddedTypefaces(const skjson::ArrayValue& jchars);
220*c8dee2aaSAndroid Build Coastguard Worker 
221*c8dee2aaSAndroid Build Coastguard Worker     void dispatchMarkers(const skjson::ArrayValue*) const;
222*c8dee2aaSAndroid Build Coastguard Worker 
223*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachBlendMode(const skjson::ObjectValue&,
224*c8dee2aaSAndroid Build Coastguard Worker                                             sk_sp<sksg::RenderNode>) const;
225*c8dee2aaSAndroid Build Coastguard Worker 
226*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachShape(const skjson::ArrayValue*, AttachShapeContext*,
227*c8dee2aaSAndroid Build Coastguard Worker                                         bool suppress_draws = false) const;
228*c8dee2aaSAndroid Build Coastguard Worker     const FootageAssetInfo* loadFootageAsset(const skjson::ObjectValue&) const;
229*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachFootageAsset(const skjson::ObjectValue&, LayerInfo*) const;
230*c8dee2aaSAndroid Build Coastguard Worker 
231*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachExternalPrecompLayer(const skjson::ObjectValue&,
232*c8dee2aaSAndroid Build Coastguard Worker                                                        const LayerInfo&) const;
233*c8dee2aaSAndroid Build Coastguard Worker 
234*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachFootageLayer(const skjson::ObjectValue&, LayerInfo*) const;
235*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachNullLayer   (const skjson::ObjectValue&, LayerInfo*) const;
236*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachPrecompLayer(const skjson::ObjectValue&, LayerInfo*) const;
237*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachShapeLayer  (const skjson::ObjectValue&, LayerInfo*) const;
238*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachSolidLayer  (const skjson::ObjectValue&, LayerInfo*) const;
239*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachTextLayer   (const skjson::ObjectValue&, LayerInfo*) const;
240*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<sksg::RenderNode> attachAudioLayer  (const skjson::ObjectValue&, LayerInfo*) const;
241*c8dee2aaSAndroid Build Coastguard Worker 
242*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ResourceProvider>      fResourceProvider;
243*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkFontMgr>             fFontMgr;
244*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<PropertyObserver>      fPropertyObserver;
245*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<Logger>                fLogger;
246*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<MarkerObserver>        fMarkerObserver;
247*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<PrecompInterceptor>    fPrecompInterceptor;
248*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<ExpressionManager>     fExpressionManager;
249*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkShapers::Factory>    fShapingFactory;
250*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SceneGraphRevalidator> fRevalidator;
251*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SlotManager>           fSlotManager;
252*c8dee2aaSAndroid Build Coastguard Worker     Animation::Builder::Stats*   fStats;
253*c8dee2aaSAndroid Build Coastguard Worker     const SkSize                 fCompSize;
254*c8dee2aaSAndroid Build Coastguard Worker     const float                  fDuration,
255*c8dee2aaSAndroid Build Coastguard Worker                                  fFrameRate;
256*c8dee2aaSAndroid Build Coastguard Worker     const uint32_t               fFlags;
257*c8dee2aaSAndroid Build Coastguard Worker     mutable AnimatorScope*       fCurrentAnimatorScope;
258*c8dee2aaSAndroid Build Coastguard Worker     mutable const char*          fPropertyObserverContext = nullptr;
259*c8dee2aaSAndroid Build Coastguard Worker     mutable bool                 fHasNontrivialBlending : 1;
260*c8dee2aaSAndroid Build Coastguard Worker 
261*c8dee2aaSAndroid Build Coastguard Worker     struct LayerInfo {
262*c8dee2aaSAndroid Build Coastguard Worker         SkSize      fSize;
263*c8dee2aaSAndroid Build Coastguard Worker         const float fInPoint,
264*c8dee2aaSAndroid Build Coastguard Worker                     fOutPoint;
265*c8dee2aaSAndroid Build Coastguard Worker     };
266*c8dee2aaSAndroid Build Coastguard Worker 
267*c8dee2aaSAndroid Build Coastguard Worker     struct AssetInfo {
268*c8dee2aaSAndroid Build Coastguard Worker         const skjson::ObjectValue* fAsset;
269*c8dee2aaSAndroid Build Coastguard Worker         mutable bool               fIsAttaching; // Used for cycle detection
270*c8dee2aaSAndroid Build Coastguard Worker     };
271*c8dee2aaSAndroid Build Coastguard Worker 
272*c8dee2aaSAndroid Build Coastguard Worker     struct FootageAssetInfo {
273*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<ImageAsset> fAsset;
274*c8dee2aaSAndroid Build Coastguard Worker         SkISize           fSize;
275*c8dee2aaSAndroid Build Coastguard Worker     };
276*c8dee2aaSAndroid Build Coastguard Worker 
277*c8dee2aaSAndroid Build Coastguard Worker     class ScopedAssetRef {
278*c8dee2aaSAndroid Build Coastguard Worker     public:
279*c8dee2aaSAndroid Build Coastguard Worker         ScopedAssetRef(const AnimationBuilder* abuilder, const skjson::ObjectValue& jlayer);
280*c8dee2aaSAndroid Build Coastguard Worker 
~ScopedAssetRef()281*c8dee2aaSAndroid Build Coastguard Worker         ~ScopedAssetRef() {
282*c8dee2aaSAndroid Build Coastguard Worker             if (fInfo) {
283*c8dee2aaSAndroid Build Coastguard Worker                 fInfo->fIsAttaching = false;
284*c8dee2aaSAndroid Build Coastguard Worker             }
285*c8dee2aaSAndroid Build Coastguard Worker         }
286*c8dee2aaSAndroid Build Coastguard Worker 
287*c8dee2aaSAndroid Build Coastguard Worker         explicit operator bool() const { return !!fInfo; }
288*c8dee2aaSAndroid Build Coastguard Worker 
289*c8dee2aaSAndroid Build Coastguard Worker         const skjson::ObjectValue& operator*() const { return *fInfo->fAsset; }
290*c8dee2aaSAndroid Build Coastguard Worker 
291*c8dee2aaSAndroid Build Coastguard Worker     private:
292*c8dee2aaSAndroid Build Coastguard Worker         const AssetInfo* fInfo = nullptr;
293*c8dee2aaSAndroid Build Coastguard Worker     };
294*c8dee2aaSAndroid Build Coastguard Worker 
295*c8dee2aaSAndroid Build Coastguard Worker     skia_private::THashMap<SkString, AssetInfo>                fAssets;
296*c8dee2aaSAndroid Build Coastguard Worker     skia_private::THashMap<SkString, FontInfo>                 fFonts;
297*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<CustomFont::GlyphCompMapper>                         fCustomGlyphMapper;
298*c8dee2aaSAndroid Build Coastguard Worker     mutable skia_private::THashMap<SkString, FootageAssetInfo> fImageAssetCache;
299*c8dee2aaSAndroid Build Coastguard Worker 
300*c8dee2aaSAndroid Build Coastguard Worker     // Handle to "slots" JSON Object, used to grab slot values while building
301*c8dee2aaSAndroid Build Coastguard Worker     const skjson::ObjectValue* fSlotsRoot;
302*c8dee2aaSAndroid Build Coastguard Worker 
303*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkNoncopyable;
304*c8dee2aaSAndroid Build Coastguard Worker };
305*c8dee2aaSAndroid Build Coastguard Worker 
306*c8dee2aaSAndroid Build Coastguard Worker } // namespace internal
307*c8dee2aaSAndroid Build Coastguard Worker } // namespace skottie
308*c8dee2aaSAndroid Build Coastguard Worker 
309*c8dee2aaSAndroid Build Coastguard Worker #endif // SkottiePriv_DEFINED
310