42 for (
const float *elem : input->get_buffer_area(area)) {
47 lum.
max = std::max(lu, lum.
max);
48 lum.
min = std::min(lu, lum.
min);
72 join.
sum += chunk.sum;
73 add_v3_v3(join.color_sum, chunk.color_sum);
74 join.log_sum += chunk.log_sum;
75 join.max = std::max(join.max, chunk.max);
76 join.min = std::min(join.min, chunk.min);
77 join.num_pixels += chunk.num_pixels;
83 const float max_log =
log(
double(lum.
max) + 1
e-5);
84 const float min_log =
log(
double(lum.
min) + 1
e-5);
86 avg->auto_key = (max_log > min_log) ? ((max_log - avg_log) / (max_log - min_log)) : 1.0f;
87 const float al =
exp(
double(avg_log));
88 avg->al = (al == 0.0f) ? 0.0f : (
data_->
key / al);
105 const float igm = avg->
igm;
110 float dr = it.out[0] + offset;
111 float dg = it.out[1] + offset;
112 float db = it.out[2] + offset;
113 it.out[0] /= ((dr == 0.0f) ? 1.0f : dr);
114 it.out[1] /= ((dg == 0.0f) ? 1.0f : dg);
115 it.out[2] /= ((db == 0.0f) ? 1.0f : db);
117 it.out[0] =
powf(std::max(it.out[0], 0.0f), igm);
118 it.out[1] =
powf(std::max(it.out[1], 0.0f), igm);
119 it.out[2] =
powf(std::max(it.out[2], 0.0f), igm);
137 const float m = (ntm->
m > 0.0f) ? ntm->
m : (0.3f + 0.7f *
powf(avg->
auto_key, 1.4f));
138 const float ic = 1.0f - ntm->
c;
139 const float ia = 1.0f - ntm->
a;
143 float I_l = it.out[0] + ic * (
L - it.out[0]);
144 float I_g = avg->
cav[0] + ic * (avg->
lav - avg->
cav[0]);
145 float I_a = I_l + ia * (I_g - I_l);
146 it.out[0] /= (it.out[0] +
powf(f * I_a, m));
147 I_l = it.out[1] + ic * (
L - it.out[1]);
148 I_g = avg->
cav[1] + ic * (avg->
lav - avg->
cav[1]);
149 I_a = I_l + ia * (I_g - I_l);
150 it.out[1] /= (it.out[1] +
powf(f * I_a, m));
151 I_l = it.out[2] + ic * (
L - it.out[2]);
152 I_g = avg->
cav[2] + ic * (avg->
lav - avg->
cav[2]);
153 I_a = I_l + ia * (I_g - I_l);
154 it.out[2] /= (it.out[2] +
powf(f * I_a, m));
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void mul_v3_fl(float r[3], float f)
MINLINE void mul_v3_v3fl(float r[3], const float a[3], float f)
MINLINE void add_v3_v3(float r[3], const float a[3])
static void split(const char *text, const char *seps, char ***str, int *count)
BLI_INLINE float IMB_colormanagement_get_luminance(const float rgb[3])
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
void execute_work(const rcti &work_rect, std::function< void(const rcti &split_rect)> work_func)
a MemoryBuffer contains access to the data
bool is_a_single_elem() const
float * get_elem(int x, int y)
void add_output_socket(DataType datatype)
NodeOperationFlags flags_
const rcti & get_canvas() const
NodeOperation * get_input_operation(int index)
ExecutionSystem * exec_system_
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
const NodeTonemap * data_
settings of the Tone-map
void update_memory_buffer_started(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
AvgLogLum * cached_instance_
temporarily cache of the execution storage
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.
virtual void update_memory_buffer_partial(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
ccl_device_inline float3 exp(float3 v)
ccl_device_inline float3 log(float3 v)
struct blender::compositor::AvgLogLum AvgLogLum
temporarily storage during execution of Tone-map
static Luminance calc_area_luminance(const MemoryBuffer *input, const rcti &area)
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
temporarily storage during execution of Tone-map