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
122