Coverage Report

Created: 2024-05-20 07:14

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