xref: /aosp_15_r20/external/skia/modules/skottie/include/Skottie.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2017 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 Skottie_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define Skottie_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSize.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skresources/include/SkResources.h"
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker // TODO(kjlubick) update clients and then remove the following:
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMgr.h"  // IWYU pragma: keep
20*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/ExternalLayer.h"  // IWYU pragma: keep
21*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/SkottieProperty.h"  // IWYU pragma: keep
22*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/SlotManager.h"  // IWYU pragma: keep
23*c8dee2aaSAndroid Build Coastguard Worker 
24*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
25*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
26*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas;
29*c8dee2aaSAndroid Build Coastguard Worker class SkStream;
30*c8dee2aaSAndroid Build Coastguard Worker struct SkRect;
31*c8dee2aaSAndroid Build Coastguard Worker 
32*c8dee2aaSAndroid Build Coastguard Worker namespace sksg {
33*c8dee2aaSAndroid Build Coastguard Worker 
34*c8dee2aaSAndroid Build Coastguard Worker class InvalidationController;
35*c8dee2aaSAndroid Build Coastguard Worker class RenderNode;
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker } // namespace sksg
38*c8dee2aaSAndroid Build Coastguard Worker 
39*c8dee2aaSAndroid Build Coastguard Worker namespace SkShapers { class Factory; }
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker namespace skottie {
42*c8dee2aaSAndroid Build Coastguard Worker 
43*c8dee2aaSAndroid Build Coastguard Worker namespace internal { class Animator; }
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker using ImageAsset = skresources::ImageAsset;
46*c8dee2aaSAndroid Build Coastguard Worker using ResourceProvider = skresources::ResourceProvider;
47*c8dee2aaSAndroid Build Coastguard Worker 
48*c8dee2aaSAndroid Build Coastguard Worker /**
49*c8dee2aaSAndroid Build Coastguard Worker  * A Logger subclass can be used to receive Animation::Builder parsing errors and warnings.
50*c8dee2aaSAndroid Build Coastguard Worker  */
51*c8dee2aaSAndroid Build Coastguard Worker class SK_API Logger : public SkRefCnt {
52*c8dee2aaSAndroid Build Coastguard Worker public:
53*c8dee2aaSAndroid Build Coastguard Worker     enum class Level {
54*c8dee2aaSAndroid Build Coastguard Worker         kWarning,
55*c8dee2aaSAndroid Build Coastguard Worker         kError,
56*c8dee2aaSAndroid Build Coastguard Worker     };
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     virtual void log(Level, const char message[], const char* json = nullptr) = 0;
59*c8dee2aaSAndroid Build Coastguard Worker };
60*c8dee2aaSAndroid Build Coastguard Worker 
61*c8dee2aaSAndroid Build Coastguard Worker // Evaluates AE expressions.
62*c8dee2aaSAndroid Build Coastguard Worker template <class T>
63*c8dee2aaSAndroid Build Coastguard Worker class SK_API ExpressionEvaluator : public SkRefCnt {
64*c8dee2aaSAndroid Build Coastguard Worker public:
65*c8dee2aaSAndroid Build Coastguard Worker     // Evaluate the expression at the current time.
66*c8dee2aaSAndroid Build Coastguard Worker     virtual T evaluate(float t) = 0;
67*c8dee2aaSAndroid Build Coastguard Worker };
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker /**
70*c8dee2aaSAndroid Build Coastguard Worker  * Creates ExpressionEvaluators to evaluate AE expressions and return the results.
71*c8dee2aaSAndroid Build Coastguard Worker  */
72*c8dee2aaSAndroid Build Coastguard Worker class SK_API ExpressionManager : public SkRefCnt {
73*c8dee2aaSAndroid Build Coastguard Worker public:
74*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<ExpressionEvaluator<float>> createNumberExpressionEvaluator(
75*c8dee2aaSAndroid Build Coastguard Worker         const char expression[]) = 0;
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<ExpressionEvaluator<SkString>> createStringExpressionEvaluator(
78*c8dee2aaSAndroid Build Coastguard Worker         const char expression[]) = 0;
79*c8dee2aaSAndroid Build Coastguard Worker 
80*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<ExpressionEvaluator<std::vector<float>>> createArrayExpressionEvaluator(
81*c8dee2aaSAndroid Build Coastguard Worker         const char expression[]) = 0;
82*c8dee2aaSAndroid Build Coastguard Worker };
83*c8dee2aaSAndroid Build Coastguard Worker 
84*c8dee2aaSAndroid Build Coastguard Worker /**
85*c8dee2aaSAndroid Build Coastguard Worker  * Interface for receiving AE composition markers at Animation build time.
86*c8dee2aaSAndroid Build Coastguard Worker  */
87*c8dee2aaSAndroid Build Coastguard Worker class SK_API MarkerObserver : public SkRefCnt {
88*c8dee2aaSAndroid Build Coastguard Worker public:
89*c8dee2aaSAndroid Build Coastguard Worker     // t0,t1 are in the Animation::seek() domain.
90*c8dee2aaSAndroid Build Coastguard Worker     virtual void onMarker(const char name[], float t0, float t1) = 0;
91*c8dee2aaSAndroid Build Coastguard Worker };
92*c8dee2aaSAndroid Build Coastguard Worker 
93*c8dee2aaSAndroid Build Coastguard Worker class SK_API Animation : public SkNVRefCnt<Animation> {
94*c8dee2aaSAndroid Build Coastguard Worker public:
95*c8dee2aaSAndroid Build Coastguard Worker     class SK_API Builder final {
96*c8dee2aaSAndroid Build Coastguard Worker     public:
97*c8dee2aaSAndroid Build Coastguard Worker         enum Flags : uint32_t {
98*c8dee2aaSAndroid Build Coastguard Worker             kDeferImageLoading   = 0x01, // Normally, all static image frames are resolved at
99*c8dee2aaSAndroid Build Coastguard Worker                                          // load time via ImageAsset::getFrame(0).  With this flag,
100*c8dee2aaSAndroid Build Coastguard Worker                                          // frames are only resolved when needed, at seek() time.
101*c8dee2aaSAndroid Build Coastguard Worker             kPreferEmbeddedFonts = 0x02, // Attempt to use the embedded fonts (glyph paths,
102*c8dee2aaSAndroid Build Coastguard Worker                                          // normally used as fallback) over native Skia typefaces.
103*c8dee2aaSAndroid Build Coastguard Worker         };
104*c8dee2aaSAndroid Build Coastguard Worker 
105*c8dee2aaSAndroid Build Coastguard Worker         explicit Builder(uint32_t flags = 0);
106*c8dee2aaSAndroid Build Coastguard Worker         Builder(const Builder&);
107*c8dee2aaSAndroid Build Coastguard Worker         Builder(Builder&&);
108*c8dee2aaSAndroid Build Coastguard Worker         ~Builder();
109*c8dee2aaSAndroid Build Coastguard Worker 
110*c8dee2aaSAndroid Build Coastguard Worker         struct Stats {
111*c8dee2aaSAndroid Build Coastguard Worker             float  fTotalLoadTimeMS  = 0, // Total animation instantiation time.
112*c8dee2aaSAndroid Build Coastguard Worker                    fJsonParseTimeMS  = 0, // Time spent building a JSON DOM.
113*c8dee2aaSAndroid Build Coastguard Worker                    fSceneParseTimeMS = 0; // Time spent constructing the animation scene graph.
114*c8dee2aaSAndroid Build Coastguard Worker             size_t fJsonSize         = 0, // Input JSON size.
115*c8dee2aaSAndroid Build Coastguard Worker                    fAnimatorCount    = 0; // Number of dynamically animated properties.
116*c8dee2aaSAndroid Build Coastguard Worker         };
117*c8dee2aaSAndroid Build Coastguard Worker 
118*c8dee2aaSAndroid Build Coastguard Worker         /**
119*c8dee2aaSAndroid Build Coastguard Worker          * Returns various animation build stats.
120*c8dee2aaSAndroid Build Coastguard Worker          *
121*c8dee2aaSAndroid Build Coastguard Worker          * @return Stats (see above).
122*c8dee2aaSAndroid Build Coastguard Worker          */
getStats()123*c8dee2aaSAndroid Build Coastguard Worker         const Stats& getStats() const { return fStats; }
124*c8dee2aaSAndroid Build Coastguard Worker 
125*c8dee2aaSAndroid Build Coastguard Worker         /**
126*c8dee2aaSAndroid Build Coastguard Worker          * Specify a loader for external resources (images, etc.).
127*c8dee2aaSAndroid Build Coastguard Worker          */
128*c8dee2aaSAndroid Build Coastguard Worker         Builder& setResourceProvider(sk_sp<ResourceProvider>);
129*c8dee2aaSAndroid Build Coastguard Worker 
130*c8dee2aaSAndroid Build Coastguard Worker         /**
131*c8dee2aaSAndroid Build Coastguard Worker          * Specify a font manager for loading animation fonts.
132*c8dee2aaSAndroid Build Coastguard Worker          */
133*c8dee2aaSAndroid Build Coastguard Worker         Builder& setFontManager(sk_sp<SkFontMgr>);
134*c8dee2aaSAndroid Build Coastguard Worker 
135*c8dee2aaSAndroid Build Coastguard Worker         /**
136*c8dee2aaSAndroid Build Coastguard Worker          * Specify a PropertyObserver to receive callbacks during parsing.
137*c8dee2aaSAndroid Build Coastguard Worker          *
138*c8dee2aaSAndroid Build Coastguard Worker          * See SkottieProperty.h for more details.
139*c8dee2aaSAndroid Build Coastguard Worker          *
140*c8dee2aaSAndroid Build Coastguard Worker          */
141*c8dee2aaSAndroid Build Coastguard Worker         Builder& setPropertyObserver(sk_sp<PropertyObserver>);
142*c8dee2aaSAndroid Build Coastguard Worker 
143*c8dee2aaSAndroid Build Coastguard Worker         /**
144*c8dee2aaSAndroid Build Coastguard Worker          * Register a Logger with this builder.
145*c8dee2aaSAndroid Build Coastguard Worker          */
146*c8dee2aaSAndroid Build Coastguard Worker         Builder& setLogger(sk_sp<Logger>);
147*c8dee2aaSAndroid Build Coastguard Worker 
148*c8dee2aaSAndroid Build Coastguard Worker         /**
149*c8dee2aaSAndroid Build Coastguard Worker          * Register a MarkerObserver with this builder.
150*c8dee2aaSAndroid Build Coastguard Worker          */
151*c8dee2aaSAndroid Build Coastguard Worker         Builder& setMarkerObserver(sk_sp<MarkerObserver>);
152*c8dee2aaSAndroid Build Coastguard Worker 
153*c8dee2aaSAndroid Build Coastguard Worker         /**
154*c8dee2aaSAndroid Build Coastguard Worker          * Register a precomp layer interceptor.
155*c8dee2aaSAndroid Build Coastguard Worker          * This allows substituting precomp layers with custom/externally managed content.
156*c8dee2aaSAndroid Build Coastguard Worker          */
157*c8dee2aaSAndroid Build Coastguard Worker         Builder& setPrecompInterceptor(sk_sp<PrecompInterceptor>);
158*c8dee2aaSAndroid Build Coastguard Worker 
159*c8dee2aaSAndroid Build Coastguard Worker         /**
160*c8dee2aaSAndroid Build Coastguard Worker          * Registers an ExpressionManager to evaluate AE expressions.
161*c8dee2aaSAndroid Build Coastguard Worker          * If unspecified, expressions in the animation JSON will be ignored.
162*c8dee2aaSAndroid Build Coastguard Worker          */
163*c8dee2aaSAndroid Build Coastguard Worker         Builder& setExpressionManager(sk_sp<ExpressionManager>);
164*c8dee2aaSAndroid Build Coastguard Worker 
165*c8dee2aaSAndroid Build Coastguard Worker         /**
166*c8dee2aaSAndroid Build Coastguard Worker          * Registers a factory to be used when shaping text.
167*c8dee2aaSAndroid Build Coastguard Worker          * If unspecified, text will be shaped with primitive shaping.
168*c8dee2aaSAndroid Build Coastguard Worker          * See //modules/skshaper/utils/FactoryHelpers.h
169*c8dee2aaSAndroid Build Coastguard Worker          */
170*c8dee2aaSAndroid Build Coastguard Worker         Builder& setTextShapingFactory(sk_sp<SkShapers::Factory>);
171*c8dee2aaSAndroid Build Coastguard Worker 
172*c8dee2aaSAndroid Build Coastguard Worker         /**
173*c8dee2aaSAndroid Build Coastguard Worker          * Animation factories.
174*c8dee2aaSAndroid Build Coastguard Worker          */
175*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<Animation> make(SkStream*);
176*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<Animation> make(const char* data, size_t length);
177*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<Animation> makeFromFile(const char path[]);
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker         /**
180*c8dee2aaSAndroid Build Coastguard Worker          * Get handle for SlotManager after animation is built.
181*c8dee2aaSAndroid Build Coastguard Worker          */
getSlotManager()182*c8dee2aaSAndroid Build Coastguard Worker         const sk_sp<SlotManager>& getSlotManager() const {return fSlotManager;}
183*c8dee2aaSAndroid Build Coastguard Worker 
184*c8dee2aaSAndroid Build Coastguard Worker     private:
185*c8dee2aaSAndroid Build Coastguard Worker         const uint32_t          fFlags;
186*c8dee2aaSAndroid Build Coastguard Worker 
187*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<ResourceProvider>   fResourceProvider;
188*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<SkFontMgr>          fFontMgr;
189*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<PropertyObserver>   fPropertyObserver;
190*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<Logger>             fLogger;
191*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<MarkerObserver  >   fMarkerObserver;
192*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<PrecompInterceptor> fPrecompInterceptor;
193*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<ExpressionManager>  fExpressionManager;
194*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<SkShapers::Factory> fShapingFactory;
195*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<SlotManager>        fSlotManager;
196*c8dee2aaSAndroid Build Coastguard Worker         Stats                     fStats;
197*c8dee2aaSAndroid Build Coastguard Worker     };
198*c8dee2aaSAndroid Build Coastguard Worker 
199*c8dee2aaSAndroid Build Coastguard Worker     /**
200*c8dee2aaSAndroid Build Coastguard Worker      * Animation factories.
201*c8dee2aaSAndroid Build Coastguard Worker      *
202*c8dee2aaSAndroid Build Coastguard Worker      * Use the Builder helper above for more options/control.
203*c8dee2aaSAndroid Build Coastguard Worker      */
204*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Animation> Make(const char* data, size_t length);
205*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Animation> Make(SkStream*);
206*c8dee2aaSAndroid Build Coastguard Worker     static sk_sp<Animation> MakeFromFile(const char path[]);
207*c8dee2aaSAndroid Build Coastguard Worker 
208*c8dee2aaSAndroid Build Coastguard Worker     ~Animation();
209*c8dee2aaSAndroid Build Coastguard Worker 
210*c8dee2aaSAndroid Build Coastguard Worker     enum RenderFlag : uint32_t {
211*c8dee2aaSAndroid Build Coastguard Worker         // When rendering into a known transparent buffer, clients can pass
212*c8dee2aaSAndroid Build Coastguard Worker         // this flag to avoid some unnecessary compositing overhead for
213*c8dee2aaSAndroid Build Coastguard Worker         // animations using layer blend modes.
214*c8dee2aaSAndroid Build Coastguard Worker         kSkipTopLevelIsolation   = 0x01,
215*c8dee2aaSAndroid Build Coastguard Worker         // By default, content is clipped to the intrinsic animation
216*c8dee2aaSAndroid Build Coastguard Worker         // bounds (as determined by its size).  If this flag is set,
217*c8dee2aaSAndroid Build Coastguard Worker         // then the animation can draw outside of the bounds.
218*c8dee2aaSAndroid Build Coastguard Worker         kDisableTopLevelClipping = 0x02,
219*c8dee2aaSAndroid Build Coastguard Worker     };
220*c8dee2aaSAndroid Build Coastguard Worker     using RenderFlags = uint32_t;
221*c8dee2aaSAndroid Build Coastguard Worker 
222*c8dee2aaSAndroid Build Coastguard Worker     /**
223*c8dee2aaSAndroid Build Coastguard Worker      * Draws the current animation frame.
224*c8dee2aaSAndroid Build Coastguard Worker      *
225*c8dee2aaSAndroid Build Coastguard Worker      * It is undefined behavior to call render() on a newly created Animation
226*c8dee2aaSAndroid Build Coastguard Worker      * before specifying an initial frame via one of the seek() variants.
227*c8dee2aaSAndroid Build Coastguard Worker      *
228*c8dee2aaSAndroid Build Coastguard Worker      * @param canvas   destination canvas
229*c8dee2aaSAndroid Build Coastguard Worker      * @param dst      optional destination rect
230*c8dee2aaSAndroid Build Coastguard Worker      * @param flags    optional RenderFlags
231*c8dee2aaSAndroid Build Coastguard Worker      */
232*c8dee2aaSAndroid Build Coastguard Worker     void render(SkCanvas* canvas, const SkRect* dst = nullptr) const;
233*c8dee2aaSAndroid Build Coastguard Worker     void render(SkCanvas* canvas, const SkRect* dst, RenderFlags) const;
234*c8dee2aaSAndroid Build Coastguard Worker 
235*c8dee2aaSAndroid Build Coastguard Worker     /**
236*c8dee2aaSAndroid Build Coastguard Worker      * [Deprecated: use one of the other versions.]
237*c8dee2aaSAndroid Build Coastguard Worker      *
238*c8dee2aaSAndroid Build Coastguard Worker      * Updates the animation state for |t|.
239*c8dee2aaSAndroid Build Coastguard Worker      *
240*c8dee2aaSAndroid Build Coastguard Worker      * @param t   normalized [0..1] frame selector (0 -> first frame, 1 -> final frame)
241*c8dee2aaSAndroid Build Coastguard Worker      * @param ic  optional invalidation controller (dirty region tracking)
242*c8dee2aaSAndroid Build Coastguard Worker      *
243*c8dee2aaSAndroid Build Coastguard Worker      */
244*c8dee2aaSAndroid Build Coastguard Worker     void seek(SkScalar t, sksg::InvalidationController* ic = nullptr) {
245*c8dee2aaSAndroid Build Coastguard Worker         this->seekFrameTime(t * this->duration(), ic);
246*c8dee2aaSAndroid Build Coastguard Worker     }
247*c8dee2aaSAndroid Build Coastguard Worker 
248*c8dee2aaSAndroid Build Coastguard Worker     /**
249*c8dee2aaSAndroid Build Coastguard Worker      * Update the animation state to match |t|, specified as a frame index
250*c8dee2aaSAndroid Build Coastguard Worker      * i.e. relative to duration() * fps().
251*c8dee2aaSAndroid Build Coastguard Worker      *
252*c8dee2aaSAndroid Build Coastguard Worker      * Fractional values are allowed and meaningful - e.g.
253*c8dee2aaSAndroid Build Coastguard Worker      *
254*c8dee2aaSAndroid Build Coastguard Worker      *   0.0 -> first frame
255*c8dee2aaSAndroid Build Coastguard Worker      *   1.0 -> second frame
256*c8dee2aaSAndroid Build Coastguard Worker      *   0.5 -> halfway between first and second frame
257*c8dee2aaSAndroid Build Coastguard Worker      */
258*c8dee2aaSAndroid Build Coastguard Worker     void seekFrame(double t, sksg::InvalidationController* ic = nullptr);
259*c8dee2aaSAndroid Build Coastguard Worker 
260*c8dee2aaSAndroid Build Coastguard Worker     /** Update the animation state to match t, specifed in frame time
261*c8dee2aaSAndroid Build Coastguard Worker      *  i.e. relative to duration().
262*c8dee2aaSAndroid Build Coastguard Worker      */
263*c8dee2aaSAndroid Build Coastguard Worker     void seekFrameTime(double t, sksg::InvalidationController* = nullptr);
264*c8dee2aaSAndroid Build Coastguard Worker 
265*c8dee2aaSAndroid Build Coastguard Worker     /**
266*c8dee2aaSAndroid Build Coastguard Worker      * Returns the animation duration in seconds.
267*c8dee2aaSAndroid Build Coastguard Worker      */
duration()268*c8dee2aaSAndroid Build Coastguard Worker     double duration() const { return fDuration; }
269*c8dee2aaSAndroid Build Coastguard Worker 
270*c8dee2aaSAndroid Build Coastguard Worker     /**
271*c8dee2aaSAndroid Build Coastguard Worker      * Returns the animation frame rate (frames / second).
272*c8dee2aaSAndroid Build Coastguard Worker      */
fps()273*c8dee2aaSAndroid Build Coastguard Worker     double fps() const { return fFPS; }
274*c8dee2aaSAndroid Build Coastguard Worker 
275*c8dee2aaSAndroid Build Coastguard Worker     /**
276*c8dee2aaSAndroid Build Coastguard Worker      * Animation in point, in frame index units.
277*c8dee2aaSAndroid Build Coastguard Worker      */
inPoint()278*c8dee2aaSAndroid Build Coastguard Worker     double inPoint()  const { return fInPoint;  }
279*c8dee2aaSAndroid Build Coastguard Worker 
280*c8dee2aaSAndroid Build Coastguard Worker     /**
281*c8dee2aaSAndroid Build Coastguard Worker      * Animation out point, in frame index units.
282*c8dee2aaSAndroid Build Coastguard Worker      */
outPoint()283*c8dee2aaSAndroid Build Coastguard Worker     double outPoint() const { return fOutPoint; }
284*c8dee2aaSAndroid Build Coastguard Worker 
version()285*c8dee2aaSAndroid Build Coastguard Worker     const SkString& version() const { return fVersion; }
size()286*c8dee2aaSAndroid Build Coastguard Worker     const SkSize&      size() const { return fSize;    }
287*c8dee2aaSAndroid Build Coastguard Worker 
288*c8dee2aaSAndroid Build Coastguard Worker private:
289*c8dee2aaSAndroid Build Coastguard Worker     enum Flags : uint32_t {
290*c8dee2aaSAndroid Build Coastguard Worker         kRequiresTopLevelIsolation = 1 << 0, // Needs to draw into a layer due to layer blending.
291*c8dee2aaSAndroid Build Coastguard Worker     };
292*c8dee2aaSAndroid Build Coastguard Worker 
293*c8dee2aaSAndroid Build Coastguard Worker     Animation(sk_sp<sksg::RenderNode>,
294*c8dee2aaSAndroid Build Coastguard Worker               std::vector<sk_sp<internal::Animator>>&&,
295*c8dee2aaSAndroid Build Coastguard Worker               SkString ver, const SkSize& size,
296*c8dee2aaSAndroid Build Coastguard Worker               double inPoint, double outPoint, double duration, double fps, uint32_t flags);
297*c8dee2aaSAndroid Build Coastguard Worker 
298*c8dee2aaSAndroid Build Coastguard Worker     const sk_sp<sksg::RenderNode>                fSceneRoot;
299*c8dee2aaSAndroid Build Coastguard Worker     const std::vector<sk_sp<internal::Animator>> fAnimators;
300*c8dee2aaSAndroid Build Coastguard Worker     const SkString                               fVersion;
301*c8dee2aaSAndroid Build Coastguard Worker     const SkSize                                 fSize;
302*c8dee2aaSAndroid Build Coastguard Worker     const double                                 fInPoint,
303*c8dee2aaSAndroid Build Coastguard Worker                                                  fOutPoint,
304*c8dee2aaSAndroid Build Coastguard Worker                                                  fDuration,
305*c8dee2aaSAndroid Build Coastguard Worker                                                  fFPS;
306*c8dee2aaSAndroid Build Coastguard Worker     const uint32_t                               fFlags;
307*c8dee2aaSAndroid Build Coastguard Worker 
308*c8dee2aaSAndroid Build Coastguard Worker     using INHERITED = SkNVRefCnt<Animation>;
309*c8dee2aaSAndroid Build Coastguard Worker };
310*c8dee2aaSAndroid Build Coastguard Worker 
311*c8dee2aaSAndroid Build Coastguard Worker } // namespace skottie
312*c8dee2aaSAndroid Build Coastguard Worker 
313*c8dee2aaSAndroid Build Coastguard Worker #endif // Skottie_DEFINED
314