/* * 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 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 Make(std::vector>&& geos, Mode mode) { return sk_sp(new Merge(std::move(geos), mode)); } ~Merge() override; protected: void onClip(SkCanvas*, bool antiAlias) const override; void onDraw(SkCanvas*, const SkPaint&) const override; SkRect onRevalidate(InvalidationController*, const SkMatrix&) override; SkPath onAsPath() const override; private: Merge(std::vector>&& geos, Mode); std::vector> fGeos; SkPath fMerged; Mode fMode; using INHERITED = GeometryNode; }; } // namespace sksg #endif // SkSGMerge_DEFINED