Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | |||
4 | #include <openvdb/openvdb.h> | ||
5 | #include <openvdb/math/Maps.h> // for math::NonlinearFrustumMap | ||
6 | #include <openvdb/tools/Clip.h> | ||
7 | |||
8 | #include <gtest/gtest.h> | ||
9 | |||
10 | // See also TestGrid::testClipping() | ||
11 | class TestClip: public ::testing::Test | ||
12 | { | ||
13 | public: | ||
14 | static const openvdb::CoordBBox kCubeBBox, kInnerBBox; | ||
15 | |||
16 | 7 | TestClip(): mCube{ | |
17 | 7 | []() { | |
18 | 7 | auto cube = openvdb::FloatGrid{0.0f}; | |
19 |
1/2✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
|
7 | cube.fill(kCubeBBox, /*value=*/5.0f, /*active=*/true); |
20 | 7 | return cube; | |
21 |
1/2✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
|
7 | }()} |
22 | 7 | {} | |
23 | |||
24 | 7 | void SetUp() override { openvdb::initialize(); } | |
25 | 7 | void TearDown() override { openvdb::initialize(); } | |
26 | |||
27 | protected: | ||
28 | void validate(const openvdb::FloatGrid&); | ||
29 | |||
30 | const openvdb::FloatGrid mCube; | ||
31 | }; | ||
32 | |||
33 | const openvdb::CoordBBox | ||
34 | // The volume to be clipped is a 21 x 21 x 21 solid cube. | ||
35 | TestClip::kCubeBBox{openvdb::Coord{-10}, openvdb::Coord{10}}, | ||
36 | // The clipping mask is a 1 x 1 x 13 segment extending along the Z axis inside the cube. | ||
37 | TestClip::kInnerBBox{openvdb::Coord{4, 4, -6}, openvdb::Coord{4, 4, 6}}; | ||
38 | |||
39 | |||
40 | //////////////////////////////////////// | ||
41 | |||
42 | |||
43 | void | ||
44 | 6 | TestClip::validate(const openvdb::FloatGrid& clipped) | |
45 | { | ||
46 | using namespace openvdb; | ||
47 | |||
48 | 6 | const CoordBBox bbox = clipped.evalActiveVoxelBoundingBox(); | |
49 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
6 | EXPECT_EQ(kInnerBBox.min().x(), bbox.min().x()); |
50 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
6 | EXPECT_EQ(kInnerBBox.min().y(), bbox.min().y()); |
51 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
6 | EXPECT_EQ(kInnerBBox.min().z(), bbox.min().z()); |
52 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
6 | EXPECT_EQ(kInnerBBox.max().x(), bbox.max().x()); |
53 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
6 | EXPECT_EQ(kInnerBBox.max().y(), bbox.max().y()); |
54 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
6 | EXPECT_EQ(kInnerBBox.max().z(), bbox.max().z()); |
55 |
1/14✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
6 | EXPECT_EQ(6 + 6 + 1, int(clipped.activeVoxelCount())); |
56 |
1/14✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
|
6 | EXPECT_EQ(2, int(clipped.constTree().leafCount())); |
57 | |||
58 | FloatGrid::ConstAccessor acc = clipped.getConstAccessor(); | ||
59 | 6 | const float bg = clipped.background(); | |
60 | Coord xyz; | ||
61 | int &x = xyz[0], &y = xyz[1], &z = xyz[2]; | ||
62 |
2/2✓ Branch 0 taken 126 times.
✓ Branch 1 taken 6 times.
|
132 | for (x = kCubeBBox.min().x(); x <= kCubeBBox.max().x(); ++x) { |
63 |
2/2✓ Branch 0 taken 2646 times.
✓ Branch 1 taken 126 times.
|
2772 | for (y = kCubeBBox.min().y(); y <= kCubeBBox.max().y(); ++y) { |
64 |
2/2✓ Branch 0 taken 55566 times.
✓ Branch 1 taken 2646 times.
|
58212 | for (z = kCubeBBox.min().z(); z <= kCubeBBox.max().z(); ++z) { |
65 |
8/8✓ Branch 0 taken 2646 times.
✓ Branch 1 taken 52920 times.
✓ Branch 2 taken 126 times.
✓ Branch 3 taken 2520 times.
✓ Branch 4 taken 102 times.
✓ Branch 5 taken 24 times.
✓ Branch 6 taken 78 times.
✓ Branch 7 taken 24 times.
|
55566 | if (x == 4 && y == 4 && z >= -6 && z <= 6) { |
66 |
3/18✓ Branch 1 taken 78 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
156 | EXPECT_EQ(5.f, acc.getValue(Coord(4, 4, z))); |
67 | } else { | ||
68 |
2/16✓ Branch 1 taken 55488 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 55488 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
110976 | EXPECT_EQ(bg, acc.getValue(Coord(x, y, z))); |
69 | } | ||
70 | } | ||
71 | } | ||
72 | } | ||
73 | 6 | } | |
74 | |||
75 | |||
76 | //////////////////////////////////////// | ||
77 | |||
78 | |||
79 | // Test clipping against a bounding box. | ||
80 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestClip, testBBox) |
81 | { | ||
82 | using namespace openvdb; | ||
83 | 1 | BBoxd clipBox(Vec3d(4.0, 4.0, -6.0), Vec3d(4.9, 4.9, 6.0)); | |
84 | 1 | FloatGrid::Ptr clipped = tools::clip(mCube, clipBox); | |
85 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | validate(*clipped); |
86 | 1 | } | |
87 | |||
88 | |||
89 | // Test clipping against a camera frustum. | ||
90 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestClip, testFrustum) |
91 | { | ||
92 | using namespace openvdb; | ||
93 | |||
94 | 1 | const auto d = double(kCubeBBox.max().z()); | |
95 | const math::NonlinearFrustumMap frustum{ | ||
96 | 1 | /*position=*/Vec3d{0.0, 0.0, 5.0 * d}, | |
97 | 1 | /*direction=*/Vec3d{0.0, 0.0, -1.0}, | |
98 | 2 | /*up=*/Vec3d{0.0, d / 2.0, 0.0}, | |
99 | /*aspect=*/1.0, | ||
100 | 1 | /*near=*/4.0 * d + 1.0, | |
101 | 3 | /*depth=*/kCubeBBox.dim().z() - 2.0, | |
102 | /*x_count=*/100, | ||
103 | 1 | /*z_count=*/100}; | |
104 | 1 | const auto frustumIndexBBox = frustum.getBBox(); | |
105 | |||
106 | { | ||
107 | 1 | auto clipped = tools::clip(mCube, frustum); | |
108 | |||
109 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto bbox = clipped->evalActiveVoxelBoundingBox(); |
110 | 1 | const auto cubeDim = kCubeBBox.dim(); | |
111 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(kCubeBBox.min().z() + 1, bbox.min().z()); |
112 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(kCubeBBox.max().z() - 1, bbox.max().z()); |
113 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(int(bbox.volume()) < int(cubeDim.x() * cubeDim.y() * (cubeDim.z() - 2))); |
114 | |||
115 | // Note: mCube index space corresponds to world space. | ||
116 |
2/2✓ Branch 0 taken 2870 times.
✓ Branch 1 taken 1 times.
|
2871 | for (auto it = clipped->beginValueOn(); it; ++it) { |
117 | 2870 | const auto xyz = frustum.applyInverseMap(it.getCoord().asVec3d()); | |
118 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 2870 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
2870 | EXPECT_TRUE(frustumIndexBBox.isInside(xyz)); |
119 | } | ||
120 | } | ||
121 | { | ||
122 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
2 | auto tile = openvdb::FloatGrid{0.0f}; |
123 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tile.tree().addTile(/*level=*/2, Coord{0}, /*value=*/5.0f, /*active=*/true); |
124 | |||
125 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | auto clipped = tools::clip(tile, frustum); |
126 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!clipped->empty()); |
127 |
2/2✓ Branch 0 taken 367 times.
✓ Branch 1 taken 1 times.
|
368 | for (auto it = clipped->beginValueOn(); it; ++it) { |
128 | 367 | const auto xyz = frustum.applyInverseMap(it.getCoord().asVec3d()); | |
129 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 367 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
367 | EXPECT_TRUE(frustumIndexBBox.isInside(xyz)); |
130 | } | ||
131 | |||
132 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | clipped = tools::clip(tile, frustum, /*keepInterior=*/false); |
133 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!clipped->empty()); |
134 |
2/2✓ Branch 0 taken 4751 times.
✓ Branch 1 taken 1 times.
|
4752 | for (auto it = clipped->beginValueOn(); it; ++it) { |
135 | 4751 | const auto xyz = frustum.applyInverseMap(it.getCoord().asVec3d()); | |
136 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 4751 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
4751 | EXPECT_TRUE(!frustumIndexBBox.isInside(xyz)); |
137 | } | ||
138 | } | ||
139 | 1 | } | |
140 | |||
141 | |||
142 | // Test clipping against a MaskGrid. | ||
143 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestClip, testMaskGrid) |
144 | { | ||
145 | using namespace openvdb; | ||
146 | 2 | MaskGrid mask(false); | |
147 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mask.fill(kInnerBBox, true, true); |
148 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | FloatGrid::Ptr clipped = tools::clip(mCube, mask); |
149 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | validate(*clipped); |
150 | 1 | } | |
151 | |||
152 | |||
153 | // Test clipping against a boolean mask grid. | ||
154 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestClip, testBoolMask) |
155 | { | ||
156 | using namespace openvdb; | ||
157 | 2 | BoolGrid mask(false); | |
158 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mask.fill(kInnerBBox, true, true); |
159 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | FloatGrid::Ptr clipped = tools::clip(mCube, mask); |
160 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | validate(*clipped); |
161 | 1 | } | |
162 | |||
163 | |||
164 | // Test clipping against a boolean mask grid with mask inversion. | ||
165 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestClip, testInvertedBoolMask) |
166 | { | ||
167 | using namespace openvdb; | ||
168 | // Construct a mask grid that is the "inverse" of the mask used in the other tests. | ||
169 | // (This is not a true inverse, since the mask's active voxel bounds are finite.) | ||
170 | 2 | BoolGrid mask(false); | |
171 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mask.fill(kCubeBBox, true, true); |
172 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mask.fill(kInnerBBox, false, false); |
173 | // Clipping against the "inverted" mask with mask inversion enabled | ||
174 | // should give the same results as clipping normally against the normal mask. | ||
175 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | FloatGrid::Ptr clipped = tools::clip(mCube, mask, /*keepInterior=*/false); |
176 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | clipped->pruneGrid(); |
177 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | validate(*clipped); |
178 | 1 | } | |
179 | |||
180 | |||
181 | // Test clipping against a non-boolean mask grid. | ||
182 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestClip, testNonBoolMask) |
183 | { | ||
184 | using namespace openvdb; | ||
185 | 2 | Int32Grid mask(0); | |
186 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mask.fill(kInnerBBox, -5, true); |
187 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | FloatGrid::Ptr clipped = tools::clip(mCube, mask); |
188 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | validate(*clipped); |
189 | 1 | } | |
190 | |||
191 | |||
192 | // Test clipping against a non-boolean mask grid with mask inversion. | ||
193 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestClip, testInvertedNonBoolMask) |
194 | { | ||
195 | using namespace openvdb; | ||
196 | // Construct a mask grid that is the "inverse" of the mask used in the other tests. | ||
197 | // (This is not a true inverse, since the mask's active voxel bounds are finite.) | ||
198 | 2 | Grid<UInt32Tree> mask(0); | |
199 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | auto paddedCubeBBox = kCubeBBox; |
200 | paddedCubeBBox.expand(2); | ||
201 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mask.fill(paddedCubeBBox, 99, true); |
202 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mask.fill(kInnerBBox, 0, false); |
203 | // Clipping against the "inverted" mask with mask inversion enabled | ||
204 | // should give the same results as clipping normally against the normal mask. | ||
205 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | FloatGrid::Ptr clipped = tools::clip(mCube, mask, /*keepInterior=*/false); |
206 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | clipped->pruneGrid(); |
207 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | validate(*clipped); |
208 | 1 | } | |
209 |