Update rive-cpp to 2.0 version
[platform/core/uifw/rive-tizen.git] / submodule / skia / modules / sksg / include / SkSGColorFilter.h
1 /*
2  * Copyright 2018 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 SkSGColorFilter_DEFINED
9 #define SkSGColorFilter_DEFINED
10
11 #include "modules/sksg/include/SkSGEffectNode.h"
12
13 #include "include/core/SkBlendMode.h"
14
15 #include <vector>
16
17 class SkColorFilter;
18
19 namespace sksg {
20
21 class Color;
22
23 /**
24  * Base class for nodes which apply a color filter when rendering their descendants.
25  */
26 class ColorFilter : public EffectNode {
27 protected:
28     explicit ColorFilter(sk_sp<RenderNode>);
29
30     void onRender(SkCanvas*, const RenderContext*) const final;
31     const RenderNode* onNodeAt(const SkPoint&)     const final;
32
33     SkRect onRevalidate(InvalidationController*, const SkMatrix&) final;
34
35     virtual sk_sp<SkColorFilter> onRevalidateFilter() = 0;
36
37 private:
38     sk_sp<SkColorFilter> fColorFilter;
39
40     using INHERITED = EffectNode;
41 };
42
43 /**
44  * Wrapper for externally-managed SkColorFilters.
45  *
46  * Allows attaching non-sksg color filters to the render tree.
47  */
48 class ExternalColorFilter final : public EffectNode {
49 public:
50     static sk_sp<ExternalColorFilter> Make(sk_sp<RenderNode> child);
51
52     ~ExternalColorFilter() override;
53
54     SG_ATTRIBUTE(ColorFilter, sk_sp<SkColorFilter>, fColorFilter)
55
56 protected:
57     void onRender(SkCanvas*, const RenderContext*) const override;
58
59 private:
60     explicit ExternalColorFilter(sk_sp<RenderNode>);
61
62     sk_sp<SkColorFilter> fColorFilter;
63
64     using INHERITED = EffectNode;
65 };
66
67 /**
68  * Concrete SkModeColorFilter Effect node.
69  */
70 class ModeColorFilter final : public ColorFilter {
71 public:
72     ~ModeColorFilter() override;
73
74     static sk_sp<ModeColorFilter> Make(sk_sp<RenderNode> child,
75                                        sk_sp<Color> color,
76                                        SkBlendMode mode);
77
78 protected:
79     sk_sp<SkColorFilter> onRevalidateFilter() override;
80
81 private:
82     ModeColorFilter(sk_sp<RenderNode>, sk_sp<Color>, SkBlendMode);
83
84     const sk_sp<Color> fColor;
85     const SkBlendMode  fMode;
86
87     using INHERITED = ColorFilter;
88 };
89
90 /**
91  * Tint/multi-tone color effect: maps RGB colors to the [C0,C1][C1,C2]..[Cn-1,Cn] gradient
92  * based on input luminance (where the colors are evenly distributed across the luminance domain),
93  * then mixes with the input based on weight.  Leaves alpha unchanged.
94  */
95 class GradientColorFilter final : public ColorFilter {
96 public:
97     ~GradientColorFilter() override;
98
99     static sk_sp<GradientColorFilter> Make(sk_sp<RenderNode> child,
100                                            sk_sp<Color> c0, sk_sp<Color> c1);
101     static sk_sp<GradientColorFilter> Make(sk_sp<RenderNode> child,
102                                            std::vector<sk_sp<Color>>);
103
104     SG_ATTRIBUTE(Weight, float, fWeight)
105
106 protected:
107     sk_sp<SkColorFilter> onRevalidateFilter() override;
108
109 private:
110     GradientColorFilter(sk_sp<RenderNode>, std::vector<sk_sp<Color>>);
111
112     const std::vector<sk_sp<Color>> fColors;
113
114     float                           fWeight = 0;
115
116     using INHERITED = ColorFilter;
117 };
118
119 } // namespace sksg
120
121 #endif // SkSGColorFilter_DEFINED