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