blob: 4397cc4b7d7f8d24fcbffd05b96a251d443e1dbb [file] [log] [blame]
/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkSGColorFilter_DEFINED
#define SkSGColorFilter_DEFINED
#include "SkSGEffectNode.h"
#include "SkBlendMode.h"
class SkColorFilter;
namespace sksg {
class Color;
/**
* Base class for nodes which apply a color filter when rendering their descendants.
*/
class ColorFilter : public EffectNode {
protected:
explicit ColorFilter(sk_sp<RenderNode>);
void onRender(SkCanvas*, const RenderContext*) const final;
const RenderNode* onNodeAt(const SkPoint&) const final;
SkRect onRevalidate(InvalidationController*, const SkMatrix&) final;
virtual sk_sp<SkColorFilter> onRevalidateFilter() = 0;
private:
sk_sp<SkColorFilter> fColorFilter;
typedef EffectNode INHERITED;
};
/**
* Concrete SkModeColorFilter Effect node.
*/
class ModeColorFilter final : public ColorFilter {
public:
~ModeColorFilter() override;
static sk_sp<ModeColorFilter> Make(sk_sp<RenderNode> child,
sk_sp<Color> color,
SkBlendMode mode);
protected:
sk_sp<SkColorFilter> onRevalidateFilter() override;
private:
ModeColorFilter(sk_sp<RenderNode>, sk_sp<Color>, SkBlendMode);
const sk_sp<Color> fColor;
const SkBlendMode fMode;
typedef ColorFilter INHERITED;
};
/**
* Tint color effect: maps RGB colors to the [c0,c1] gradient based on input luminance
* (while leaving the alpha channel unchanged), then mixes with the input based on weight.
*/
class TintColorFilter final : public ColorFilter {
public:
~TintColorFilter() override;
static sk_sp<TintColorFilter> Make(sk_sp<RenderNode> child,
sk_sp<Color> color0,
sk_sp<Color> color1);
SG_ATTRIBUTE(Weight, float, fWeight)
protected:
sk_sp<SkColorFilter> onRevalidateFilter() override;
private:
TintColorFilter(sk_sp<RenderNode>, sk_sp<Color>, sk_sp<Color>);
const sk_sp<Color> fColor0,
fColor1;
float fWeight = 0;
typedef ColorFilter INHERITED;
};
} // namespace sksg
#endif // SkSGColorFilter_DEFINED