| 1 | /* | 
|---|
| 2 | * Copyright 2019 Google Inc. | 
|---|
| 3 | * | 
|---|
| 4 | * Use of this source code is governed by a BSD-style license that can be | 
|---|
| 5 | * found in the LICENSE file. | 
|---|
| 6 | */ | 
|---|
| 7 |  | 
|---|
| 8 | #ifndef SkottieLayer_DEFINED | 
|---|
| 9 | #define SkottieLayer_DEFINED | 
|---|
| 10 |  | 
|---|
| 11 | #include "modules/skottie/src/SkottiePriv.h" | 
|---|
| 12 |  | 
|---|
| 13 | namespace skottie { | 
|---|
| 14 | namespace internal { | 
|---|
| 15 |  | 
|---|
| 16 | class CompositionBuilder; | 
|---|
| 17 |  | 
|---|
| 18 | class LayerBuilder final { | 
|---|
| 19 | public: | 
|---|
| 20 | explicit LayerBuilder(const skjson::ObjectValue& jlayer); | 
|---|
| 21 | ~LayerBuilder(); | 
|---|
| 22 |  | 
|---|
| 23 | int index() const { return fIndex; } | 
|---|
| 24 |  | 
|---|
| 25 | bool isCamera() const; | 
|---|
| 26 |  | 
|---|
| 27 | // Attaches the local and ancestor transform chain for the layer "native" type. | 
|---|
| 28 | sk_sp<sksg::Transform> buildTransform(const AnimationBuilder&, CompositionBuilder*); | 
|---|
| 29 |  | 
|---|
| 30 | // Attaches the actual layer content and finalizes its render tree.  Called once per layer. | 
|---|
| 31 | sk_sp<sksg::RenderNode> buildRenderTree(const AnimationBuilder&, CompositionBuilder*, | 
|---|
| 32 | const LayerBuilder* prev_layer); | 
|---|
| 33 |  | 
|---|
| 34 | private: | 
|---|
| 35 | enum TransformType : uint8_t { | 
|---|
| 36 | k2D = 0, | 
|---|
| 37 | k3D = 1, | 
|---|
| 38 | }; | 
|---|
| 39 |  | 
|---|
| 40 | enum Flags { | 
|---|
| 41 | // k2DTransformValid = 0x01,  // reserved for cache tracking | 
|---|
| 42 | // k3DTransformValie = 0x02,  // reserved for cache tracking | 
|---|
| 43 | kIs3D                = 0x04,  // 3D layer ("ddd": 1) or camera layer | 
|---|
| 44 | }; | 
|---|
| 45 |  | 
|---|
| 46 | bool is3D() const { return fFlags & Flags::kIs3D; } | 
|---|
| 47 |  | 
|---|
| 48 | bool hasMotionBlur(const CompositionBuilder*) const; | 
|---|
| 49 |  | 
|---|
| 50 | // Attaches (if needed) and caches the transform chain for a given layer, | 
|---|
| 51 | // as either a 2D or 3D chain type. | 
|---|
| 52 | // Called transitively (and possibly repeatedly) to resolve layer parenting. | 
|---|
| 53 | sk_sp<sksg::Transform> getTransform(const AnimationBuilder&, CompositionBuilder*, | 
|---|
| 54 | TransformType); | 
|---|
| 55 |  | 
|---|
| 56 | sk_sp<sksg::Transform> getParentTransform(const AnimationBuilder&, CompositionBuilder*, | 
|---|
| 57 | TransformType); | 
|---|
| 58 |  | 
|---|
| 59 | sk_sp<sksg::Transform> doAttachTransform(const AnimationBuilder&, CompositionBuilder*, | 
|---|
| 60 | TransformType); | 
|---|
| 61 |  | 
|---|
| 62 | const skjson::ObjectValue& fJlayer; | 
|---|
| 63 | const int                  fIndex; | 
|---|
| 64 | const int                  fParentIndex; | 
|---|
| 65 | const int                  fType; | 
|---|
| 66 |  | 
|---|
| 67 | sk_sp<sksg::Transform>     fLayerTransform;             // this layer's transform node. | 
|---|
| 68 | sk_sp<sksg::Transform>     fTransformCache[2];          // cached 2D/3D chain for the local node | 
|---|
| 69 | sk_sp<sksg::RenderNode>    fContentTree;                // render tree for layer content, | 
|---|
| 70 | // excluding mask/matte and blending | 
|---|
| 71 |  | 
|---|
| 72 | AnimatorScope              fLayerScope;                 // layer-scoped animators | 
|---|
| 73 | size_t                     fTransformAnimatorCount = 0; // transform-related animator count | 
|---|
| 74 | uint32_t                   fFlags                  = 0; | 
|---|
| 75 | }; | 
|---|
| 76 |  | 
|---|
| 77 | } // namespace internal | 
|---|
| 78 | } // namespace skottie | 
|---|
| 79 |  | 
|---|
| 80 | #endif // SkottieLayer_DEFINED | 
|---|
| 81 |  | 
|---|