xref: /aosp_15_r20/external/skia/modules/skottie/src/Layer.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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