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