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
13namespace skottie {
14namespace internal {
15
16class CompositionBuilder;
17
18class LayerBuilder final {
19public:
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
34private:
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