blob: 08eb87d520ac9e8931cf8dbac95c19e34221dfb3 [file] [log] [blame]
Florin Malitadafd6522019-02-10 01:49:46 +00001/*
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 "SkSGEffectNode.h"
12
13#include "SkColor.h"
14
15#include <memory>
16#include <vector>
17
18// TODO: merge EffectNode.h with this header
19
20class SkImageFilter;
21
22namespace sksg {
23
24/**
25 * ImageFilter base class.
26 */
27class ImageFilter : public Node {
28public:
29 ~ImageFilter() override;
30
31 const sk_sp<SkImageFilter>& getFilter() const {
32 SkASSERT(!this->hasInval());
33 return fFilter;
34 }
35
36protected:
37 explicit ImageFilter(sk_sp<ImageFilter> input = 0);
38
39 using InputsT = std::vector<sk_sp<ImageFilter>>;
40 explicit ImageFilter(std::unique_ptr<InputsT> inputs);
41
42 SkRect onRevalidate(InvalidationController*, const SkMatrix&) final;
43
44 virtual sk_sp<SkImageFilter> onRevalidateFilter() = 0;
45
46 sk_sp<SkImageFilter> refInput(size_t) const;
47
48private:
49 const std::unique_ptr<InputsT> fInputs;
50
51 sk_sp<SkImageFilter> fFilter;
52
53 using INHERITED = Node;
54};
55
56/**
57 * Attaches an ImageFilter (chain) to the render DAG.
58 */
59class ImageFilterEffect final : public EffectNode {
60public:
61 ~ImageFilterEffect() override;
62
63 static sk_sp<RenderNode> Make(sk_sp<RenderNode> child, sk_sp<ImageFilter> filter);
64
65protected:
66 void onRender(SkCanvas*, const RenderContext*) const override;
Florin Malitaeb46bd82019-02-12 09:33:21 -050067 const RenderNode* onNodeAt(const SkPoint&) const override;
Florin Malitadafd6522019-02-10 01:49:46 +000068
69 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
70
71private:
72 ImageFilterEffect(sk_sp<RenderNode> child, sk_sp<ImageFilter> filter);
73
74 sk_sp<ImageFilter> fImageFilter;
75
76 using INHERITED = EffectNode;
77};
78
79/**
80 * SkDropShadowImageFilter node.
81 */
82class DropShadowImageFilter final : public ImageFilter {
83public:
84 ~DropShadowImageFilter() override;
85
86 static sk_sp<DropShadowImageFilter> Make(sk_sp<ImageFilter> input = nullptr);
87
88 enum class Mode { kShadowAndForeground, kShadowOnly };
89
90 SG_ATTRIBUTE(Offset, SkVector, fOffset)
91 SG_ATTRIBUTE(Sigma , SkVector, fSigma )
92 SG_ATTRIBUTE(Color , SkColor , fColor )
93 SG_ATTRIBUTE(Mode , Mode , fMode )
94
95protected:
96 sk_sp<SkImageFilter> onRevalidateFilter() override;
97
98private:
99 explicit DropShadowImageFilter(sk_sp<ImageFilter> input);
100
101 SkVector fOffset = { 0, 0 },
102 fSigma = { 0, 0 };
103 SkColor fColor = SK_ColorBLACK;
104 Mode fMode = Mode::kShadowAndForeground;
105
106 using INHERITED = ImageFilter;
107};
108
109} // namespace sksg
110
111#endif // SkSGRenderEffect_DEFINED