1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 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 SkottieLayer_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkottieLayer_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 12*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/src/SkottiePriv.h" 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard Worker struct SkSize; 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker namespace skjson { 19*c8dee2aaSAndroid Build Coastguard Worker class ObjectValue; 20*c8dee2aaSAndroid Build Coastguard Worker } 21*c8dee2aaSAndroid Build Coastguard Worker namespace sksg { 22*c8dee2aaSAndroid Build Coastguard Worker class RenderNode; 23*c8dee2aaSAndroid Build Coastguard Worker class Transform; 24*c8dee2aaSAndroid Build Coastguard Worker } // namespace sksg 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker namespace skottie { 27*c8dee2aaSAndroid Build Coastguard Worker namespace internal { 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker class CompositionBuilder; 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker class LayerBuilder final { 32*c8dee2aaSAndroid Build Coastguard Worker public: 33*c8dee2aaSAndroid Build Coastguard Worker LayerBuilder(const skjson::ObjectValue& jlayer, const SkSize& comp_size); 34*c8dee2aaSAndroid Build Coastguard Worker LayerBuilder(const LayerBuilder&) = default; 35*c8dee2aaSAndroid Build Coastguard Worker ~LayerBuilder(); 36*c8dee2aaSAndroid Build Coastguard Worker index()37*c8dee2aaSAndroid Build Coastguard Worker int index() const { return fIndex; } 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker bool isCamera() const; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker // Attaches the local and ancestor transform chain for the layer "native" type. 42*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::Transform> buildTransform(const AnimationBuilder&, CompositionBuilder*); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker // Attaches the actual layer content and finalizes its render tree. Called once per layer. 45*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::RenderNode> buildRenderTree(const AnimationBuilder&, CompositionBuilder*, 46*c8dee2aaSAndroid Build Coastguard Worker const LayerBuilder* prev_layer); 47*c8dee2aaSAndroid Build Coastguard Worker contentTree()48*c8dee2aaSAndroid Build Coastguard Worker const sk_sp<sksg::RenderNode>& contentTree() const { return fContentTree; } 49*c8dee2aaSAndroid Build Coastguard Worker size()50*c8dee2aaSAndroid Build Coastguard Worker const SkSize& size() const { return fInfo.fSize; } 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker private: 53*c8dee2aaSAndroid Build Coastguard Worker enum TransformType : uint8_t { 54*c8dee2aaSAndroid Build Coastguard Worker k2D = 0, 55*c8dee2aaSAndroid Build Coastguard Worker k3D = 1, 56*c8dee2aaSAndroid Build Coastguard Worker }; 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker enum Flags { 59*c8dee2aaSAndroid Build Coastguard Worker // k2DTransformValid = 0x01, // reserved for cache tracking 60*c8dee2aaSAndroid Build Coastguard Worker // k3DTransformValie = 0x02, // reserved for cache tracking 61*c8dee2aaSAndroid Build Coastguard Worker kIs3D = 0x04, // 3D layer ("ddd": 1) or camera layer 62*c8dee2aaSAndroid Build Coastguard Worker }; 63*c8dee2aaSAndroid Build Coastguard Worker is3D()64*c8dee2aaSAndroid Build Coastguard Worker bool is3D() const { return fFlags & Flags::kIs3D; } 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker bool hasMotionBlur(const CompositionBuilder*) const; 67*c8dee2aaSAndroid Build Coastguard Worker 68*c8dee2aaSAndroid Build Coastguard Worker // Attaches (if needed) and caches the transform chain for a given layer, 69*c8dee2aaSAndroid Build Coastguard Worker // as either a 2D or 3D chain type. 70*c8dee2aaSAndroid Build Coastguard Worker // Called transitively (and possibly repeatedly) to resolve layer parenting. 71*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::Transform> getTransform(const AnimationBuilder&, CompositionBuilder*, 72*c8dee2aaSAndroid Build Coastguard Worker TransformType); 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::Transform> getParentTransform(const AnimationBuilder&, CompositionBuilder*, 75*c8dee2aaSAndroid Build Coastguard Worker TransformType); 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::Transform> doAttachTransform(const AnimationBuilder&, CompositionBuilder*, 78*c8dee2aaSAndroid Build Coastguard Worker TransformType); 79*c8dee2aaSAndroid Build Coastguard Worker 80*c8dee2aaSAndroid Build Coastguard Worker const skjson::ObjectValue& fJlayer; 81*c8dee2aaSAndroid Build Coastguard Worker const int fIndex; 82*c8dee2aaSAndroid Build Coastguard Worker const int fParentIndex; 83*c8dee2aaSAndroid Build Coastguard Worker const int fType; 84*c8dee2aaSAndroid Build Coastguard Worker const bool fAutoOrient; 85*c8dee2aaSAndroid Build Coastguard Worker 86*c8dee2aaSAndroid Build Coastguard Worker AnimationBuilder::LayerInfo fInfo; 87*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::Transform> fLayerTransform; // this layer's transform node. 88*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::Transform> fTransformCache[2]; // cached 2D/3D chain for the local node 89*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::RenderNode> fContentTree; // render tree for layer content, 90*c8dee2aaSAndroid Build Coastguard Worker // excluding mask/matte and blending 91*c8dee2aaSAndroid Build Coastguard Worker 92*c8dee2aaSAndroid Build Coastguard Worker AnimatorScope fLayerScope; // layer-scoped animators 93*c8dee2aaSAndroid Build Coastguard Worker size_t fTransformAnimatorCount = 0; // transform-related animator count 94*c8dee2aaSAndroid Build Coastguard Worker uint32_t fFlags = 0; 95*c8dee2aaSAndroid Build Coastguard Worker }; 96*c8dee2aaSAndroid Build Coastguard Worker 97*c8dee2aaSAndroid Build Coastguard Worker } // namespace internal 98*c8dee2aaSAndroid Build Coastguard Worker } // namespace skottie 99*c8dee2aaSAndroid Build Coastguard Worker 100*c8dee2aaSAndroid Build Coastguard Worker #endif // SkottieLayer_DEFINED 101