5#include "testing/testing.h"
23 return (
float *)
MEM_callocN(
len *
sizeof(
float),
"COM_BuffersIteratorTest");
31 for (
int i = 0; i <
len; i++) {
32 buf[i] = input_idx * 1.5f * (i + 1) + i * 0.9f;
44 bool use_single_elem_inputs_;
47 static rcti buffer_area;
48 static rcti buffer_offset_area;
60 use_single_elem_inputs_ =
false;
61 validate_iteration(iter_func, validate_elem_func);
63 use_single_elem_inputs_ =
true;
64 validate_iteration(iter_func, validate_elem_func);
87 single_elem_inputs[i] =
nullptr;
89 full_buffer_inputs[i] =
nullptr;
96 use_single_elem_inputs_ =
false;
110 use_offsets_ =
false;
112 iter_func(it, buffer_area);
113 validate_result(buffer_area, validate_elem_func);
118 iter_func(it, buffer_offset_area);
119 validate_result(buffer_offset_area, validate_elem_func);
123 rcti area = buffer_offset_area;
130 validate_result(area, validate_elem_func);
136 Span<const float *>
inputs = get_inputs();
137 Array<const float *> ins(
inputs.size());
142 float *out = &output_[out_offset];
144 const int in_offset = use_single_elem_inputs_ ? 0 : out_offset;
145 for (
int i = 0; i <
inputs.size(); i++) {
146 ins[i] = &
inputs[i][in_offset];
149 if (validate_elem_func) {
150 validate_elem_func(out, ins,
x,
y);
156 Span<const float *> get_inputs()
159 return use_single_elem_inputs_ ? single_elem_inputs : full_buffer_inputs;
164 int get_buffer_relative_x(
int x)
168 int get_buffer_relative_y(
int y)
179 const int input_stride = use_single_elem_inputs_ ? 0 :
NUM_CHANNELS;
180 for (
const float *input : get_inputs()) {
184 return builder.build();
191 const rcti &buf_area = buffer_offset_area;
192 BuffersIteratorBuilder<float> builder(output_, buf_area, area,
NUM_CHANNELS);
194 const int input_stride = use_single_elem_inputs_ ? 0 :
NUM_CHANNELS;
195 for (
const float *input : get_inputs()) {
196 builder.add_input(input, buf_area, input_stride);
199 return builder.build();
203rcti BuffersIteratorTest::buffer_area;
204rcti BuffersIteratorTest::buffer_offset_area;
205Array<const float *, NUM_INPUTS> BuffersIteratorTest::single_elem_inputs(
NUM_INPUTS);
206Array<const float *, NUM_INPUTS> BuffersIteratorTest::full_buffer_inputs(
NUM_INPUTS);
212 for (; !it.is_end(); ++it) {
216 if (
x == area.
xmax) {
227 set_inputs_enabled(
false);
233 set_inputs_enabled(
true);
239 set_inputs_enabled(
false);
243 for (; !it.is_end(); ++it) {
245 it.out[0] = dummy + 1.0f;
246 it.out[1] = dummy + 2.0f;
247 it.out[2] = dummy + 3.0f;
248 it.out[3] = dummy + 4.0f;
253 EXPECT_NEAR(out[0], dummy + 1.0f, FLT_EPSILON);
254 EXPECT_NEAR(out[1], dummy + 2.0f, FLT_EPSILON);
255 EXPECT_NEAR(out[2], dummy + 3.0f, FLT_EPSILON);
256 EXPECT_NEAR(out[3], dummy + 4.0f, FLT_EPSILON);
262 set_inputs_enabled(
true);
266 for (; !it.is_end(); ++it) {
267 const float *in1 = it.in(0);
268 const float *in2 = it.in(1);
269 it.out[0] = in1[0] + in2[0];
270 it.out[1] = in1[1] + in2[3];
271 it.out[2] = in1[2] - in2[2];
272 it.out[3] = in1[3] - in2[1];
276 const float *in1 = ins[0];
277 const float *in2 = ins[1];
278 EXPECT_NEAR(out[0], in1[0] + in2[0], FLT_EPSILON);
279 EXPECT_NEAR(out[1], in1[1] + in2[3], FLT_EPSILON);
280 EXPECT_NEAR(out[2], in1[2] - in2[2], FLT_EPSILON);
281 EXPECT_NEAR(out[3], in1[3] - in2[1], FLT_EPSILON);
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
void set_inputs_enabled(bool value)
static void TearDownTestCase()
void test_iteration(IterFunc iter_func, ValidateElemFunc validate_elem_func={})
static void SetUpTestCase()
void MEM_freeN(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
static float * create_buffer(int len)
constexpr int BUFFER_OFFSET_Y
std::function< void(BuffersIterator< float > &it, const rcti &area)> IterFunc
constexpr int BUFFER_HEIGHT
std::function< void(float *out, Span< const float * > ins, int x, int y)> ValidateElemFunc
constexpr int NUM_CHANNELS
constexpr int BUFFER_WIDTH
constexpr int FULL_BUFFER_LEN
TEST_F(BuffersIteratorTest, CoordinatesIterationWithNoInputs)
constexpr int SINGLE_ELEM_BUFFER_LEN
static void iterate_coordinates(BuffersIterator< float > &it, const rcti &area)
constexpr int BUFFER_OFFSET_X
static const float * create_input_buffer(int input_idx, bool is_a_single_elem)
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
static blender::bke::bNodeSocketTemplate inputs[]