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/SkPoint.h" 16 #include "include/core/SkRect.h" 17 #include "include/core/SkRefCnt.h" 18 #include "include/core/SkShader.h" 19 #include "include/core/SkTileMode.h" 20 #include "include/effects/SkImageFilters.h" 21 #include "include/private/base/SkAssert.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 getShader()43 const sk_sp<SkShader>& getShader() const { 44 SkASSERT(!this->hasInval()); 45 return fShader; 46 } 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 getFilter()112 const sk_sp<SkImageFilter>& getFilter() const { 113 SkASSERT(!this->hasInval()); 114 return fFilter; 115 } 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 Make()171 static sk_sp<ExternalImageFilter> Make() { 172 return sk_sp<ExternalImageFilter>(new ExternalImageFilter()); 173 } 174 175 SG_ATTRIBUTE(ImageFilter, sk_sp<SkImageFilter>, fImageFilter) 176 177 private: 178 ExternalImageFilter(); 179 onRevalidateFilter()180 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 284