Coverage Report

Created: 2024-05-20 07:14

/src/skia/modules/skottie/src/layers/shapelayer/MergePaths.cpp
Line
Count
Source
1
/*
2
 * Copyright 2020 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
#include "include/core/SkRefCnt.h"
9
#include "modules/skottie/src/SkottieJson.h"
10
#include "modules/skottie/src/layers/shapelayer/ShapeLayer.h"
11
#include "modules/sksg/include/SkSGGeometryNode.h"
12
#include "modules/sksg/include/SkSGMerge.h"
13
#include "src/utils/SkJSON.h"
14
15
#include <algorithm>
16
#include <cstddef>
17
#include <utility>
18
#include <vector>
19
20
namespace skottie {
21
namespace internal {
22
class AnimationBuilder;
23
24
sk_sp<sksg::Merge> ShapeBuilder::MergeGeometry(std::vector<sk_sp<sksg::GeometryNode>>&& geos,
25
242k
                                               sksg::Merge::Mode mode) {
26
242k
    std::vector<sksg::Merge::Rec> merge_recs;
27
242k
    merge_recs.reserve(geos.size());
28
29
772k
    for (auto& geo : geos) {
30
772k
        merge_recs.push_back(
31
772k
            {std::move(geo), merge_recs.empty() ? sksg::Merge::Mode::kMerge : mode});
32
772k
    }
33
34
242k
    return sksg::Merge::Make(std::move(merge_recs));
35
242k
}
36
37
std::vector<sk_sp<sksg::GeometryNode>> ShapeBuilder::AttachMergeGeometryEffect(
38
        const skjson::ObjectValue& jmerge, const AnimationBuilder*,
39
210k
        std::vector<sk_sp<sksg::GeometryNode>>&& geos) {
40
210k
    static constexpr sksg::Merge::Mode gModes[] = {
41
210k
        sksg::Merge::Mode::kMerge,      // "mm": 1
42
210k
        sksg::Merge::Mode::kUnion,      // "mm": 2
43
210k
        sksg::Merge::Mode::kDifference, // "mm": 3
44
210k
        sksg::Merge::Mode::kIntersect,  // "mm": 4
45
210k
        sksg::Merge::Mode::kXOR      ,  // "mm": 5
46
210k
    };
47
48
210k
    const auto mode = gModes[std::min<size_t>(ParseDefault<size_t>(jmerge["mm"], 1) - 1,
49
210k
                                            std::size(gModes) - 1)];
50
51
210k
    std::vector<sk_sp<sksg::GeometryNode>> merged;
52
210k
    merged.push_back(ShapeBuilder::MergeGeometry(std::move(geos), mode));
53
54
210k
    return merged;
55
210k
}
56
57
} // namespace internal
58
} // namespace skottie