2 * Copyright 2018 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
8 #ifndef SkSGColorFilter_DEFINED
9 #define SkSGColorFilter_DEFINED
11 #include "modules/sksg/include/SkSGEffectNode.h"
13 #include "include/core/SkBlendMode.h"
24 * Base class for nodes which apply a color filter when rendering their descendants.
26 class ColorFilter : public EffectNode {
28 explicit ColorFilter(sk_sp<RenderNode>);
30 void onRender(SkCanvas*, const RenderContext*) const final;
31 const RenderNode* onNodeAt(const SkPoint&) const final;
33 SkRect onRevalidate(InvalidationController*, const SkMatrix&) final;
35 virtual sk_sp<SkColorFilter> onRevalidateFilter() = 0;
38 sk_sp<SkColorFilter> fColorFilter;
40 using INHERITED = EffectNode;
44 * Wrapper for externally-managed SkColorFilters.
46 * Allows attaching non-sksg color filters to the render tree.
48 class ExternalColorFilter final : public EffectNode {
50 static sk_sp<ExternalColorFilter> Make(sk_sp<RenderNode> child);
52 ~ExternalColorFilter() override;
54 SG_ATTRIBUTE(ColorFilter, sk_sp<SkColorFilter>, fColorFilter)
57 void onRender(SkCanvas*, const RenderContext*) const override;
60 explicit ExternalColorFilter(sk_sp<RenderNode>);
62 sk_sp<SkColorFilter> fColorFilter;
64 using INHERITED = EffectNode;
68 * Concrete SkModeColorFilter Effect node.
70 class ModeColorFilter final : public ColorFilter {
72 ~ModeColorFilter() override;
74 static sk_sp<ModeColorFilter> Make(sk_sp<RenderNode> child,
79 sk_sp<SkColorFilter> onRevalidateFilter() override;
82 ModeColorFilter(sk_sp<RenderNode>, sk_sp<Color>, SkBlendMode);
84 const sk_sp<Color> fColor;
85 const SkBlendMode fMode;
87 using INHERITED = ColorFilter;
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.
95 class GradientColorFilter final : public ColorFilter {
97 ~GradientColorFilter() override;
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>>);
104 SG_ATTRIBUTE(Weight, float, fWeight)
107 sk_sp<SkColorFilter> onRevalidateFilter() override;
110 GradientColorFilter(sk_sp<RenderNode>, std::vector<sk_sp<Color>>);
112 const std::vector<sk_sp<Color>> fColors;
116 using INHERITED = ColorFilter;
121 #endif // SkSGColorFilter_DEFINED