• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 SkSGRenderEffect_DEFINED
9 #define SkSGRenderEffect_DEFINED
10 
11 #include "modules/sksg/include/SkSGEffectNode.h"
12 
13 #include "include/core/SkBlendMode.h"
14 #include "include/core/SkColor.h"
15 #include "include/effects/SkImageFilters.h"
16 
17 #include <memory>
18 #include <vector>
19 
20 // TODO: merge EffectNode.h with this header
21 
22 class SkBlender;
23 class SkImageFilter;
24 class SkMaskFilter;
25 class SkShader;
26 
27 namespace sksg {
28 
29 /**
30  * Shader base class.
31  */
32 class Shader : public Node {
33 public:
34     ~Shader() override;
35 
getShader()36     const sk_sp<SkShader>& getShader() const {
37         SkASSERT(!this->hasInval());
38         return fShader;
39     }
40 
41 protected:
42     Shader();
43 
44     SkRect onRevalidate(InvalidationController*, const SkMatrix&) final;
45 
46     virtual sk_sp<SkShader> onRevalidateShader() = 0;
47 
48 private:
49     sk_sp<SkShader> fShader;
50 
51     using INHERITED = Node;
52 };
53 
54 /**
55  * Attaches a shader to the render DAG.
56  */
57 class ShaderEffect final : public EffectNode {
58 public:
59     ~ShaderEffect() override;
60 
61     static sk_sp<ShaderEffect> Make(sk_sp<RenderNode> child, sk_sp<Shader> shader = nullptr);
62 
63     void setShader(sk_sp<Shader>);
64 
65 protected:
66     void onRender(SkCanvas*, const RenderContext*) const override;
67 
68     SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
69 
70 private:
71     ShaderEffect(sk_sp<RenderNode> child, sk_sp<Shader> shader);
72 
73     sk_sp<Shader> fShader;
74 
75     using INHERITED = EffectNode;
76 };
77 
78 /**
79  * Attaches a mask shader to the render DAG.
80  */
81 class MaskShaderEffect final : public EffectNode {
82 public:
83     static sk_sp<MaskShaderEffect> Make(sk_sp<RenderNode>, sk_sp<SkShader> = nullptr);
84 
85     SG_ATTRIBUTE(Shader, sk_sp<SkShader>, fShader)
86 
87 protected:
88     void onRender(SkCanvas*, const RenderContext*) const override;
89 
90 private:
91     MaskShaderEffect(sk_sp<RenderNode>, sk_sp<SkShader>);
92 
93     sk_sp<SkShader> fShader;
94 
95     using INHERITED = EffectNode;
96 };
97 
98 /**
99  * ImageFilter base class.
100  */
101 class ImageFilter : public Node {
102 public:
103     ~ImageFilter() override;
104 
getFilter()105     const sk_sp<SkImageFilter>& getFilter() const {
106         SkASSERT(!this->hasInval());
107         return fFilter;
108     }
109 
110 protected:
111     explicit ImageFilter(sk_sp<ImageFilter> input = nullptr);
112 
113     using InputsT = std::vector<sk_sp<ImageFilter>>;
114     explicit ImageFilter(std::unique_ptr<InputsT> inputs);
115 
116     SkRect onRevalidate(InvalidationController*, const SkMatrix&) final;
117 
118     virtual sk_sp<SkImageFilter> onRevalidateFilter() = 0;
119 
120     sk_sp<SkImageFilter> refInput(size_t) const;
121 
122 private:
123     const std::unique_ptr<InputsT> fInputs;
124 
125     sk_sp<SkImageFilter>           fFilter;
126 
127     using INHERITED = Node;
128 };
129 
130 /**
131  * Attaches an ImageFilter (chain) to the render DAG.
132  */
133 class ImageFilterEffect final : public EffectNode {
134 public:
135     ~ImageFilterEffect() override;
136 
137     static sk_sp<RenderNode> Make(sk_sp<RenderNode> child, sk_sp<ImageFilter> filter);
138 
139 protected:
140     void onRender(SkCanvas*, const RenderContext*) const override;
141     const RenderNode* onNodeAt(const SkPoint&)     const override;
142 
143     SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
144 
145 private:
146     ImageFilterEffect(sk_sp<RenderNode> child, sk_sp<ImageFilter> filter);
147 
148     sk_sp<ImageFilter> fImageFilter;
149 
150     using INHERITED = EffectNode;
151 };
152 
153 /**
154  * Wrapper for externally-managed SkImageFilters.
155  */
156 class ExternalImageFilter final : public ImageFilter {
157 public:
158     ~ExternalImageFilter() override;
159 
Make()160     static sk_sp<ExternalImageFilter> Make() {
161         return sk_sp<ExternalImageFilter>(new ExternalImageFilter());
162     }
163 
164     SG_ATTRIBUTE(ImageFilter, sk_sp<SkImageFilter>, fImageFilter)
165 
166 private:
167     ExternalImageFilter();
168 
onRevalidateFilter()169     sk_sp<SkImageFilter> onRevalidateFilter() override { return fImageFilter; }
170 
171     sk_sp<SkImageFilter> fImageFilter;
172 };
173 
174 /**
175  * SkDropShadowImageFilter node.
176  */
177 class DropShadowImageFilter final : public ImageFilter {
178 public:
179     ~DropShadowImageFilter() override;
180 
181     static sk_sp<DropShadowImageFilter> Make(sk_sp<ImageFilter> input = nullptr);
182 
183     enum class Mode { kShadowAndForeground, kShadowOnly };
184 
185     SG_ATTRIBUTE(Offset, SkVector, fOffset)
186     SG_ATTRIBUTE(Sigma , SkVector, fSigma )
187     SG_ATTRIBUTE(Color , SkColor , fColor )
188     SG_ATTRIBUTE(Mode  , Mode    , fMode  )
189 
190 protected:
191     sk_sp<SkImageFilter> onRevalidateFilter() override;
192 
193 private:
194     explicit DropShadowImageFilter(sk_sp<ImageFilter> input);
195 
196     SkVector             fOffset = { 0, 0 },
197                          fSigma  = { 0, 0 };
198     SkColor              fColor  = SK_ColorBLACK;
199     Mode                 fMode   = Mode::kShadowAndForeground;
200 
201     using INHERITED = ImageFilter;
202 };
203 
204 /**
205  * SkBlurImageFilter node.
206  */
207 class BlurImageFilter final : public ImageFilter {
208 public:
209     ~BlurImageFilter() override;
210 
211     static sk_sp<BlurImageFilter> Make(sk_sp<ImageFilter> input = nullptr);
212 
213     SG_ATTRIBUTE(Sigma   , SkVector  , fSigma   )
214     SG_ATTRIBUTE(TileMode, SkTileMode, fTileMode)
215 
216 protected:
217     sk_sp<SkImageFilter> onRevalidateFilter() override;
218 
219 private:
220     explicit BlurImageFilter(sk_sp<ImageFilter> input);
221 
222     SkVector   fSigma    = { 0, 0 };
223     SkTileMode fTileMode = SkTileMode::kClamp;
224 
225     using INHERITED = ImageFilter;
226 };
227 
228 /**
229  * Applies an SkBlender to descendant render nodes.
230  */
231 class BlenderEffect final : public EffectNode {
232 public:
233     ~BlenderEffect() override;
234 
235     static sk_sp<BlenderEffect> Make(sk_sp<RenderNode> child, sk_sp<SkBlender> = nullptr);
236 
237     SG_ATTRIBUTE(Blender, sk_sp<SkBlender>, fBlender)
238 
239 protected:
240     void onRender(SkCanvas*, const RenderContext*) const override;
241     const RenderNode* onNodeAt(const SkPoint&)     const override;
242 
243 private:
244     BlenderEffect(sk_sp<RenderNode>, sk_sp<SkBlender>);
245 
246     sk_sp<SkBlender> fBlender;
247 
248     using INHERITED = EffectNode;
249 };
250 
251 class LayerEffect final : public EffectNode {
252 public:
253     ~LayerEffect() override;
254 
255     static sk_sp<LayerEffect> Make(sk_sp<RenderNode> child,
256                                    SkBlendMode mode = SkBlendMode::kSrcOver);
257 
258     SG_ATTRIBUTE(Mode, SkBlendMode, fMode)
259 
260 private:
261     LayerEffect(sk_sp<RenderNode> child, SkBlendMode mode);
262 
263     void onRender(SkCanvas*, const RenderContext*) const override;
264 
265     SkBlendMode fMode;
266 
267     using INHERITED = EffectNode;
268 };
269 
270 } // namespace sksg
271 
272 #endif // SkSGRenderEffect_DEFINED
273