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