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