/* * Copyright 2020 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/core/SkRefCnt.h" #include "modules/skottie/src/SkottieJson.h" #include "modules/skottie/src/layers/shapelayer/ShapeLayer.h" #include "modules/sksg/include/SkSGGeometryNode.h" #include "modules/sksg/include/SkSGMerge.h" #include "src/utils/SkJSON.h" #include #include #include #include namespace skottie { namespace internal { class AnimationBuilder; sk_sp ShapeBuilder::MergeGeometry(std::vector>&& geos, sksg::Merge::Mode mode) { std::vector merge_recs; merge_recs.reserve(geos.size()); for (auto& geo : geos) { merge_recs.push_back( {std::move(geo), merge_recs.empty() ? sksg::Merge::Mode::kMerge : mode}); } return sksg::Merge::Make(std::move(merge_recs)); } std::vector> ShapeBuilder::AttachMergeGeometryEffect( const skjson::ObjectValue& jmerge, const AnimationBuilder*, std::vector>&& geos) { static constexpr sksg::Merge::Mode gModes[] = { sksg::Merge::Mode::kMerge, // "mm": 1 sksg::Merge::Mode::kUnion, // "mm": 2 sksg::Merge::Mode::kDifference, // "mm": 3 sksg::Merge::Mode::kIntersect, // "mm": 4 sksg::Merge::Mode::kXOR , // "mm": 5 }; const auto mode = gModes[std::min(ParseDefault(jmerge["mm"], 1) - 1, std::size(gModes) - 1)]; std::vector> merged; merged.push_back(ShapeBuilder::MergeGeometry(std::move(geos), mode)); return merged; } } // namespace internal } // namespace skottie