1/*
2 * Copyright 2020 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 SkottieShapeLayer_DEFINED
9#define SkottieShapeLayer_DEFINED
10
11#include "include/private/SkNoncopyable.h"
12#include "modules/skottie/src/animator/Animator.h"
13#include "modules/sksg/include/SkSGMerge.h"
14
15#include <vector>
16
17namespace skjson {
18
19class ObjectValue;
20
21} // namespace skjson
22
23namespace sksg {
24
25class GeometryNode;
26class PaintNode;
27class RenderNode;
28
29} // namespace sksg
30
31namespace skottie {
32namespace internal {
33
34class AnimationBuilder;
35
36// TODO/TRANSITIONAL: not much state here yet, but will eventually hold ShapeLayer-related stuff.
37class ShapeBuilder final : SkNoncopyable {
38public:
39 static sk_sp<sksg::Merge> MergeGeometry(std::vector<sk_sp<sksg::GeometryNode>>&&,
40 sksg::Merge::Mode);
41
42 static sk_sp<sksg::GeometryNode> AttachPathGeometry(const skjson::ObjectValue&,
43 const AnimationBuilder*);
44 static sk_sp<sksg::GeometryNode> AttachRRectGeometry(const skjson::ObjectValue&,
45 const AnimationBuilder*);
46 static sk_sp<sksg::GeometryNode> AttachEllipseGeometry(const skjson::ObjectValue&,
47 const AnimationBuilder*);
48 static sk_sp<sksg::GeometryNode> AttachPolystarGeometry(const skjson::ObjectValue&,
49 const AnimationBuilder*);
50
51 static sk_sp<sksg::PaintNode> AttachColorFill(const skjson::ObjectValue&,
52 const AnimationBuilder*);
53 static sk_sp<sksg::PaintNode> AttachColorStroke(const skjson::ObjectValue&,
54 const AnimationBuilder*);
55 static sk_sp<sksg::PaintNode> AttachGradientFill(const skjson::ObjectValue&,
56 const AnimationBuilder*);
57 static sk_sp<sksg::PaintNode> AttachGradientStroke(const skjson::ObjectValue&,
58 const AnimationBuilder*);
59
60 static std::vector<sk_sp<sksg::GeometryNode>> AttachMergeGeometryEffect(
61 const skjson::ObjectValue&, const AnimationBuilder*,
62 std::vector<sk_sp<sksg::GeometryNode>>&&);
63 static std::vector<sk_sp<sksg::GeometryNode>> AttachTrimGeometryEffect(
64 const skjson::ObjectValue&,
65 const AnimationBuilder*,
66 std::vector<sk_sp<sksg::GeometryNode>>&&);
67 static std::vector<sk_sp<sksg::GeometryNode>> AttachRoundGeometryEffect(
68 const skjson::ObjectValue&, const AnimationBuilder*,
69 std::vector<sk_sp<sksg::GeometryNode>>&&);
70 static std::vector<sk_sp<sksg::GeometryNode>> AdjustStrokeGeometry(
71 const skjson::ObjectValue&, const AnimationBuilder*,
72 std::vector<sk_sp<sksg::GeometryNode>>&&);
73
74 static std::vector<sk_sp<sksg::RenderNode>> AttachRepeaterDrawEffect(
75 const skjson::ObjectValue&,
76 const AnimationBuilder*,
77 std::vector<sk_sp<sksg::RenderNode>>&&);
78
79private:
80 static sk_sp<sksg::PaintNode> AttachFill(const skjson::ObjectValue&,
81 const AnimationBuilder*,
82 sk_sp<sksg::PaintNode>,
83 sk_sp<AnimatablePropertyContainer> = nullptr);
84 static sk_sp<sksg::PaintNode> AttachStroke(const skjson::ObjectValue&,
85 const AnimationBuilder*,
86 sk_sp<sksg::PaintNode>,
87 sk_sp<AnimatablePropertyContainer> = nullptr);
88};
89
90} // namespace internal
91} // namespace skottie
92
93#endif // SkottieShapeLayer_DEFINED
94