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());
138 for (
int y = area.ymin; y < area.ymax; y++) {
139 for (
int x = area.xmin; x < area.xmax; x++) {
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();
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)