1/*
2 * Copyright 2017 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 SkSGMerge_DEFINED
9#define SkSGMerge_DEFINED
10
11#include "SkSGGeometryNode.h"
12
13#include "SkPath.h"
14
15#include <vector>
16
17class SkCanvas;
18class SkPaint;
19
20namespace sksg {
21
22/**
23 * Concrete Geometry node, combining other geometries based on Mode.
24 */
25class Merge final : public GeometryNode {
26public:
27    enum class Mode {
28        // Append path mode.
29        kMerge,
30
31        // SkPathOp ops.
32        kUnion,
33        kIntersect,
34        kDifference,
35        kReverseDifference,
36        kXOR,
37    };
38
39    static sk_sp<Merge> Make(std::vector<sk_sp<GeometryNode>>&& geos, Mode mode) {
40        return sk_sp<Merge>(new Merge(std::move(geos), mode));
41    }
42
43    ~Merge() override;
44
45protected:
46    void onClip(SkCanvas*, bool antiAlias) const override;
47    void onDraw(SkCanvas*, const SkPaint&) const override;
48
49    SkRect onRevalidate(InvalidationController*, const SkMatrix&) override;
50    SkPath onAsPath() const override;
51
52private:
53    Merge(std::vector<sk_sp<GeometryNode>>&& geos, Mode);
54
55    std::vector<sk_sp<GeometryNode>> fGeos;
56    SkPath                           fMerged;
57    Mode                             fMode;
58
59    using INHERITED = GeometryNode;
60};
61
62} // namespace sksg
63
64#endif // SkSGMerge_DEFINED
65