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 SkSGMaskEffect_DEFINED
9#define SkSGMaskEffect_DEFINED
10
11#include "modules/sksg/include/SkSGEffectNode.h"
12
13namespace sksg {
14
15/**
16 * Concrete Effect node, applying a mask to its descendants.
17 *
18 */
19class MaskEffect final : public EffectNode {
20public:
21 enum class Mode : uint32_t {
22 kAlphaNormal,
23 kAlphaInvert,
24 kLumaNormal,
25 kLumaInvert,
26 };
27
28 static sk_sp<MaskEffect> Make(sk_sp<RenderNode> child, sk_sp<RenderNode> mask,
29 Mode mode = Mode::kAlphaNormal) {
30 return (child && mask)
31 ? sk_sp<MaskEffect>(new MaskEffect(std::move(child), std::move(mask), mode))
32 : nullptr;
33 }
34
35 ~MaskEffect() override;
36
37protected:
38 MaskEffect(sk_sp<RenderNode>, sk_sp<RenderNode> mask, Mode);
39
40 void onRender(SkCanvas*, const RenderContext*) const override;
41 const RenderNode* onNodeAt(const SkPoint&) const override;
42
43 SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
44
45private:
46 const sk_sp<RenderNode> fMaskNode;
47 const Mode fMaskMode;
48
49 typedef EffectNode INHERITED;
50};
51
52} // namespace sksg
53
54#endif // SkSGMaskEffect_DEFINED
55