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 #include "include/core/SkColor.h"
9 #include "include/core/SkRefCnt.h"
10 #include "modules/skottie/src/SkottiePriv.h"
11 #include "modules/skottie/src/SkottieValue.h"
12 #include "modules/skottie/src/animator/Animator.h"
13 #include "modules/skottie/src/effects/Effects.h"
14 #include "modules/sksg/include/SkSGColorFilter.h"
15 #include "modules/sksg/include/SkSGPaint.h"
16 #include "modules/sksg/include/SkSGRenderNode.h"
17
18 #include <cstddef>
19 #include <utility>
20
21 namespace skjson {
22 class ArrayValue;
23 }
24
25 namespace skottie {
26 namespace internal {
27
28 namespace {
29
30 class TintAdapter final : public AnimatablePropertyContainer {
31 public:
Make(const skjson::ArrayValue & jprops,sk_sp<sksg::RenderNode> layer,const AnimationBuilder & abuilder)32 static sk_sp<TintAdapter> Make(const skjson::ArrayValue& jprops,
33 sk_sp<sksg::RenderNode> layer,
34 const AnimationBuilder& abuilder) {
35 return sk_sp<TintAdapter>(new TintAdapter(jprops, std::move(layer), abuilder));
36 }
37
node() const38 const auto& node() const { return fFilterNode; }
39
40 private:
TintAdapter(const skjson::ArrayValue & jprops,sk_sp<sksg::RenderNode> layer,const AnimationBuilder & abuilder)41 TintAdapter(const skjson::ArrayValue& jprops,
42 sk_sp<sksg::RenderNode> layer,
43 const AnimationBuilder& abuilder)
44 : fColorNode0(sksg::Color::Make(SK_ColorBLACK))
45 , fColorNode1(sksg::Color::Make(SK_ColorBLACK))
46 , fFilterNode(sksg::GradientColorFilter::Make(std::move(layer), fColorNode0, fColorNode1)) {
47
48 enum : size_t {
49 kMapBlackTo_Index = 0,
50 kMapWhiteTo_Index = 1,
51 kAmount_Index = 2,
52 // kOpacity_Index = 3, // currently unused (not exported)
53
54 kMax_Index = kAmount_Index,
55 };
56
57 EffectBinder(jprops, abuilder, this)
58 .bind(kMapBlackTo_Index, fMapBlackTo)
59 .bind(kMapWhiteTo_Index, fMapWhiteTo)
60 .bind( kAmount_Index, fAmount );
61 }
62
onSync()63 void onSync() override {
64 fColorNode0->setColor(fMapBlackTo);
65 fColorNode1->setColor(fMapWhiteTo);
66
67 fFilterNode->setWeight(fAmount / 100); // 100-based
68 }
69
70 const sk_sp<sksg::Color> fColorNode0,
71 fColorNode1;
72 const sk_sp<sksg::GradientColorFilter> fFilterNode;
73
74 ColorValue fMapBlackTo,
75 fMapWhiteTo;
76 ScalarValue fAmount = 0;
77 };
78
79 } // namespace
80
attachTintEffect(const skjson::ArrayValue & jprops,sk_sp<sksg::RenderNode> layer) const81 sk_sp<sksg::RenderNode> EffectBuilder::attachTintEffect(const skjson::ArrayValue& jprops,
82 sk_sp<sksg::RenderNode> layer) const {
83 return fBuilder->attachDiscardableAdapter<TintAdapter>(jprops, std::move(layer), *fBuilder);
84 }
85
86 } // namespace internal
87 } // namespace skottie
88