diff options
Diffstat (limited to 'experimental/sksg/geometry/SkSGMerge.h')
-rw-r--r-- | experimental/sksg/geometry/SkSGMerge.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/experimental/sksg/geometry/SkSGMerge.h b/experimental/sksg/geometry/SkSGMerge.h new file mode 100644 index 0000000000..b0cb40de9c --- /dev/null +++ b/experimental/sksg/geometry/SkSGMerge.h @@ -0,0 +1,61 @@ +/* + * Copyright 2017 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkSGMerge_DEFINED +#define SkSGMerge_DEFINED + +#include "SkSGGeometryNode.h" + +#include "SkPath.h" + +#include <vector> + +class SkCanvas; +class SkPaint; + +namespace sksg { + +/** + * Concrete Geometry node, combining other geometries based on Mode. + */ +class Merge final : public GeometryNode { +public: + enum class Mode { + // Append path mode. + kMerge, + + // SkPathOp ops. + kUnion, + kIntersect, + kDifference, + kReverseDifference, + kXOR, + }; + + static sk_sp<Merge> Make(std::vector<sk_sp<GeometryNode>>&& geos, Mode mode) { + return sk_sp<Merge>(new Merge(std::move(geos), mode)); + } + + ~Merge() override; + +protected: + void onDraw(SkCanvas*, const SkPaint&) const override; + + SkRect onRevalidate(InvalidationController*, const SkMatrix&) override; + SkPath onAsPath() const override; + +private: + Merge(std::vector<sk_sp<GeometryNode>>&& geos, Mode); + + std::vector<sk_sp<GeometryNode>> fGeos; + SkPath fMerged; + Mode fMode; +}; + +} // namespace sksg + +#endif // SkSGMerge_DEFINED |