Blender V4.3
COM_NormalizeOperation.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2012 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
6
7namespace blender::compositor {
8
16
22
23/* The code below assumes all data is inside range +- this, and that input buffer is single channel
24 */
25#define BLENDER_ZMAX 10000.0f
26
27void NormalizeOperation::get_area_of_interest(const int /*input_idx*/,
28 const rcti & /*output_area*/,
29 rcti &r_input_area)
30{
31 r_input_area = get_input_operation(0)->get_canvas();
32}
33
35 const rcti & /*area*/,
37{
38 if (cached_instance_ == nullptr) {
39 MemoryBuffer *input = inputs[0];
40
41 /* Using generic two floats struct to store `x: min`, `y: multiply`. */
42 NodeTwoFloats *minmult = new NodeTwoFloats();
43
44 float minv = 1.0f + BLENDER_ZMAX;
45 float maxv = -1.0f - BLENDER_ZMAX;
46 for (const float *elem : input->as_range()) {
47 const float value = *elem;
48 if ((value > maxv) && (value <= BLENDER_ZMAX)) {
49 maxv = value;
50 }
51 if ((value < minv) && (value >= -BLENDER_ZMAX)) {
52 minv = value;
53 }
54 }
55
56 minmult->x = minv;
57 /* The case of a flat buffer would cause a divide by 0. */
58 minmult->y = ((maxv != minv) ? 1.0f / (maxv - minv) : 0.0f);
59
60 cached_instance_ = minmult;
61 }
62}
63
65 const rcti &area,
67{
69 for (BuffersIterator<float> it = output->iterate_with(inputs, area); !it.is_end(); ++it) {
70 const float input_value = *it.in(0);
71
72 *it.out = (input_value - minmult->x) * minmult->y;
73
74 /* Clamp infinities. */
75 CLAMP(*it.out, 0.0f, 1.0f);
76 }
77}
78
79} // namespace blender::compositor
#define CLAMP(a, b, c)
#define BLENDER_ZMAX
struct NodeTwoFloats NodeTwoFloats
a MemoryBuffer contains access to the data
void add_output_socket(DataType datatype)
NodeOperation * get_input_operation(int index)
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
void update_memory_buffer_started(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
NodeTwoFloats * cached_instance_
temporarily cache of the execution storage it stores x->min and y->multiply.
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator