Blender V4.3
COM_ComputeSummedAreaTableOperation_test.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "testing/testing.h"
6
8
10
11struct SatParams {
12 /* Input parameters. */
16
17 /* Expected output values. */
18 std::vector<std::vector<float>> values;
19};
20
21class SummedAreaTableTestP : public testing::TestWithParam<SatParams> {};
22
24{
25 SatParams params = GetParam();
26
28
29 sat.set_mode(params.mode);
30 const rcti area = params.area;
32
33 std::shared_ptr<MemoryBuffer> input = std::make_shared<MemoryBuffer>(DataType::Color, area);
34 input->fill(area, &params.fill_value.x);
35
36 sat.update_memory_buffer(&output, area, Span<MemoryBuffer *>{input.get()});
37
38 /* First row. */
39 EXPECT_FLOAT_EQ(output.get_elem(0, 0)[0], params.values[0][0]);
40 EXPECT_FLOAT_EQ(output.get_elem(1, 0)[1], params.values[0][1]);
41 EXPECT_FLOAT_EQ(output.get_elem(2, 0)[2], params.values[0][2]);
42
43 /* Second row. */
44 EXPECT_FLOAT_EQ(output.get_elem(0, 1)[3], params.values[1][0]);
45 EXPECT_FLOAT_EQ(output.get_elem(1, 1)[0], params.values[1][1]);
46 EXPECT_FLOAT_EQ(output.get_elem(2, 1)[1], params.values[1][2]);
47}
48
49INSTANTIATE_TEST_SUITE_P(FullFrame5x2_IdentityOnes,
51 testing::Values(SatParams{
53 rcti{0, 5, 0, 2}, /* Area. */
54 {1.0f, 1.0f, 1.0f, 1.0f}, /* Fill value. */
55
56 /* Expected output. */
57 {{1.0f, 2.0f, 3.0f, 4.0f, 5.0f}, {2.0f, 4.0f, 6.0f, 8.0f, 10.0f}}
58
59 }));
60
62 FullFrame5x2_SquaredOnes,
64 testing::Values(SatParams{
66 rcti{0, 5, 0, 2}, /* Area. */
67 {1.0f, 1.0f, 1.0f, 1.0f}, /* Fill value. */
68
69 /* Expect identical to when using Identity SAT, since all inputs are 1. */
70 {{1.0f, 2.0f, 3.0f, 4.0f, 5.0f}, {2.0f, 4.0f, 6.0f, 8.0f, 10.0f}}
71
72 }));
73
74INSTANTIATE_TEST_SUITE_P(FullFrame3x2_Squared,
77 rcti{0, 3, 0, 2}, /* Area. */
78 {2.0f, 2.0f, 1.5f, .1f}, /* Fill value. */
79
80 /* Expected output. */
81 {
82 {4.0f, 8.0f, 6.75f},
83 {0.02f, 16.0f, 24.0f},
84 }}));
85
86class SummedAreaTableSumTest : public ::testing::Test {
87 public:
89 {
90 operation_ = std::make_shared<SummedAreaTableOperation>();
91 }
92
93 protected:
94 void SetUp() override
95 {
97
98 area_ = rcti{0, 5, 0, 4};
99 sat_ = std::make_shared<MemoryBuffer>(DataType::Color, area_);
100
101 const float val[4] = {1.0f, 2.0f, 1.5f, 0.1f};
102 std::shared_ptr<MemoryBuffer> input = std::make_shared<MemoryBuffer>(DataType::Color, area_);
103 input->fill(area_, val);
104 std::shared_ptr<MemoryBuffer> offset = std::make_shared<MemoryBuffer>(
105 DataType::Value, area_, true);
106 offset->fill(area_, &offset_);
107
108 operation_->update_memory_buffer(
109 sat_.get(), area_, Span<MemoryBuffer *>{input.get(), offset.get()});
110 }
111
112 std::shared_ptr<SummedAreaTableOperation> operation_;
113 std::shared_ptr<MemoryBuffer> sat_;
115 float offset_ = 0.0f;
116};
117
119{
120 rcti area;
121 area.xmin = 1;
122 area.xmax = 3;
123 area.ymin = 1;
124 area.ymax = 3;
125 float4 sum = summed_area_table_sum(sat_.get(), area);
126 EXPECT_EQ(sum[0], 9);
127}
128
130{
131 rcti area;
132 area.xmin = 0;
133 area.xmax = 2;
134 area.ymin = 0;
135 area.ymax = 2;
136 float4 sum = summed_area_table_sum(sat_.get(), area);
137 EXPECT_EQ(sum[0], 9);
138}
139
141{
142 rcti area;
143 area.xmin = area_.xmax - 2;
144 area.xmax = area_.xmax;
145 area.ymin = 0;
146 area.ymax = 2;
147 float4 sum = summed_area_table_sum(sat_.get(), area);
148 EXPECT_EQ(sum[0], 6);
149}
150
152{
153 rcti area;
154 area.xmin = area_.xmax - 1;
155 area.xmax = area_.xmax;
156 area.ymin = area_.ymax - 1;
157 area.ymax = area_.ymax;
158 float4 sum = summed_area_table_sum(sat_.get(), area);
159 EXPECT_EQ(sum[0], 1);
160}
161
163{
164 rcti area;
165 area.xmin = 0;
166 area.xmax = 1;
167 area.ymin = 0;
168 area.ymax = 0;
169 float4 sum = summed_area_table_sum(sat_.get(), area);
170 EXPECT_EQ(sum[0], 2);
171}
172
174{
175 rcti area;
176 area.xmin = 0;
177 area.xmax = 4;
178 area.ymin = 3;
179 area.ymax = 3;
180 float4 sum = summed_area_table_sum(sat_.get(), area);
181 EXPECT_EQ(sum[0], 5);
182}
183
184} // namespace blender::compositor::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
#define output
static T sum(const btAlignedObjectArray< T > &items)
a MemoryBuffer contains access to the data
SummedAreaTableOperation class computes the summed area table.
void update_memory_buffer(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
uiWidgetBaseParameters params[MAX_WIDGET_BASE_BATCH]
INSTANTIATE_TEST_SUITE_P(FullFrame5x2_IdentityOnes, SummedAreaTableTestP, testing::Values(SatParams{ SummedAreaTableOperation::eMode::Identity, rcti{0, 5, 0, 2}, {1.0f, 1.0f, 1.0f, 1.0f}, {{1.0f, 2.0f, 3.0f, 4.0f, 5.0f}, {2.0f, 4.0f, 6.0f, 8.0f, 10.0f}} }))
TEST_F(BuffersIteratorTest, CoordinatesIterationWithNoInputs)
float4 summed_area_table_sum(MemoryBuffer *buffer, const rcti &area)
int xmin