86#define exposure2white(x) exp2f(-(x))
87#define white2exposure(x) -dt_log2f(fmaxf(1e-20f, x))
106#define DEFLICKER_BINS_COUNT (UINT16_MAX + 1)
159 return _(
"exp_osure");
165 _(
"redo the exposure of the shot as if you were still in-camera\n"
166 "using a color-safe brightening similar to increasing ISO setting"),
167 _(
"corrective and creative"),
168 _(
"linear, RGB, scene-referred"),
170 _(
"linear, RGB, scene-referred"));
201 void *new_params,
const int new_version)
203 if(old_version == 2 && new_version == 6)
205 typedef struct dt_iop_exposure_params_v2_t
207 float black, exposure, gain;
208 } dt_iop_exposure_params_v2_t;
210 dt_iop_exposure_params_v2_t *o = (dt_iop_exposure_params_v2_t *)old_params;
217 n->exposure = o->exposure;
218 n->compensate_exposure_bias =
FALSE;
221 if(old_version == 3 && new_version == 6)
223 typedef struct dt_iop_exposure_params_v3_t
225 float black, exposure;
227 float deflicker_percentile, deflicker_target_level;
228 } dt_iop_exposure_params_v3_t;
230 dt_iop_exposure_params_v3_t *o = (dt_iop_exposure_params_v3_t *)old_params;
238 n->exposure = o->exposure;
239 n->deflicker_percentile = o->deflicker_percentile;
240 n->deflicker_target_level = o->deflicker_target_level;
241 n->compensate_exposure_bias =
FALSE;
244 if(old_version == 4 && new_version == 6)
246 typedef enum dt_iop_exposure_deflicker_histogram_source_t {
247 DEFLICKER_HISTOGRAM_SOURCE_THUMBNAIL,
248 DEFLICKER_HISTOGRAM_SOURCE_SOURCEFILE
249 } dt_iop_exposure_deflicker_histogram_source_t;
251 typedef struct dt_iop_exposure_params_v4_t
256 float deflicker_percentile, deflicker_target_level;
257 dt_iop_exposure_deflicker_histogram_source_t deflicker_histogram_source;
258 } dt_iop_exposure_params_v4_t;
260 dt_iop_exposure_params_v4_t *o = (dt_iop_exposure_params_v4_t *)old_params;
268 n->exposure = o->exposure;
269 n->deflicker_percentile = o->deflicker_percentile;
270 n->deflicker_target_level = o->deflicker_target_level;
273 n->compensate_exposure_bias =
FALSE;
276 if(old_version == 5 && new_version == 6)
278 typedef struct dt_iop_exposure_params_v5_t
283 float deflicker_percentile, deflicker_target_level;
284 } dt_iop_exposure_params_v5_t;
286 dt_iop_exposure_params_v5_t *o = (dt_iop_exposure_params_v5_t *)old_params;
294 n->exposure = o->exposure;
295 n->deflicker_percentile = o->deflicker_percentile;
296 n->deflicker_target_level = o->deflicker_target_level;
297 n->compensate_exposure_bias =
FALSE;
310 .deflicker_percentile = 50.0f,
311 .deflicker_target_level = -4.0f,
312 .compensate_exposure_bias = FALSE},
321 .black = -0.000244140625f,
323 .deflicker_percentile = 50.0f,
324 .deflicker_target_level = -4.0f,
325 .compensate_exposure_bias = TRUE},
362 histogram_params.
roi = &histogram_roi;
367 histogram_stats->
ch = 1u;
374static double _raw_to_ev(uint32_t raw, uint32_t black_level, uint32_t white_level)
376 const uint32_t raw_max = white_level - black_level;
380 const int64_t raw_val =
MAX((int64_t)raw - (int64_t)black_level, 1);
382 const double raw_ev = -log2(raw_max) + log2(raw_val);
389 const uint32_t *
const histogram,
398 const size_t total = (size_t)histogram_stats->
ch * histogram_stats->
pixels;
401 = CLAMP(((
double)total * (
double)
p->deflicker_percentile / (
double)100.0), 0.0, (
double)total);
408 for(uint32_t
k = 0;
k < histogram_stats->
ch;
k++)
409 n += histogram[4 *
i +
k];
422 *correction =
p->deflicker_target_level - ev;
432 float exposure =
d->params.exposure;
444 uint32_t *histogram = NULL;
455 g->deflicker_computed_exposure = exposure;
461 d->scale = 1.0 / (white -
d->black);
472 const int devid = pipe->
devid;
484 if(err != CL_SUCCESS)
goto error;
502 const float *
const restrict in = (
float*)
i;
503 float *
const restrict
out = (
float*)o;
504 const float black =
d->black;
505 const float scale =
d->scale;
506 const size_t npixels = (size_t)roi_out->
width * roi_out->
height;
507 const gboolean use_stream = (
ch == 4);
511 const dt_aligned_pixel_simd_t black_v =
dt_simd_set1(black);
512 const dt_aligned_pixel_simd_t scale_v =
dt_simd_set1(scale);
514 for(
size_t k = 0;
k < npixels;
k++)
516 const size_t p = 4 *
k;
517 const dt_aligned_pixel_simd_t in_v = dt_load_simd_aligned(in +
p);
518 dt_store_simd_nontemporal(
out +
p, (in_v - black_v) * scale_v);
524 for(
size_t k = 0;
k <
ch * npixels;
k++)
526 out[
k] = (in[
k] - black) * scale;
533 dt_iop_alpha_copy(
i, o, roi_out->
width, roi_out->
height);
548 return CLAMP(bias, -5.0f, 5.0f);
562 const float *
const restrict in = (
float*)
i;
563 float average_luminance = 0.f;
564 const float norm = 1.f / (float)(roi_out->
width * roi_out->
height);
567 for(
size_t k = 0;
k < roi_out->
width * roi_out->
height * 4;
k += 4)
572 input_profile->unbounded_coeffs_in, input_profile->
lutsize,
574 average_luminance +=
XYZ[1] * norm;
578 const float target_lightness =
dt_conf_get_float(
"darkroom/modules/exposure/lightness");
582 const float target_luminance =
XYZ[1];
583 const float white =
p->black + fmaxf(average_luminance -
p->black, 1e-6f) / target_luminance;
586 p->exposure = exposure;
588 if(
p->compensate_exposure_bias)
599 d->params.black =
p->black;
600 d->params.exposure =
p->exposure;
601 d->params.deflicker_percentile =
p->deflicker_percentile;
602 d->params.deflicker_target_level =
p->deflicker_target_level;
605 if(
p->compensate_exposure_bias)
617 dt_iop_fmt_log(self,
"commit: class=%s needs_rawprepare=%d channels=%i datatype=%i mode=%d -> deflicker=%d",
621 p->mode,
d->deflicker);
653 gtk_widget_set_sensitive(GTK_WIDGET(
g->mode),
FALSE);
657 gtk_widget_set_sensitive(GTK_WIDGET(
g->mode),
TRUE);
662 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
g->compensate_exposure_bias),
p->compensate_exposure_bias);
664 gchar *label = g_strdup_printf(_(
"compensate camera exposure (%+.1f EV)"),
_get_exposure_bias(self));
665 gtk_button_set_label(GTK_BUTTON(
g->compensate_exposure_bias), label);
666 gtk_label_set_ellipsize(GTK_LABEL(gtk_bin_get_child(GTK_BIN(
g->compensate_exposure_bias))), PANGO_ELLIPSIZE_MIDDLE);
669 g->spot_RGB[0] = 0.f;
670 g->spot_RGB[1] = 0.f;
671 g->spot_RGB[2] = 0.f;
672 g->spot_RGB[3] = 0.f;
677 const float lightness =
dt_conf_get_float(
"darkroom/modules/exposure/lightness");
684 gtk_label_set_text(
g->deflicker_used_EC,
"");
686 g->deflicker_computed_exposure = NAN;
693 gtk_stack_set_visible_child_name(GTK_STACK(
g->mode_stack),
"deflicker");
698 gtk_stack_set_visible_child_name(GTK_STACK(
g->mode_stack),
"manual");
707 const int program = 2;
726 if(
p->exposure == exposure)
return;
728 p->exposure = exposure;
743 if(
p->black == black)
return;
797 gtk_label_set_text(GTK_LABEL(
g->Lch_origin),
798 g_strdup_printf(_(
"L : \t%.1f %%"),
Lch[0]));
799 gtk_widget_queue_draw(
g->origin_spot);
807 float expo =
p->exposure;
810 if(
p->compensate_exposure_bias)
817 for(
int c = 0; c < 3; c++)
818 XYZ_out[c] =
XYZ[c] * white;
823 Lab_out[1] = Lab_out[2] = 0.f;
842 dt_LCH_2_Lab(Lch_target, Lab_target);
848 float white =
XYZ[1] / XYZ_target[1];
852 if(
p->compensate_exposure_bias)
866 dt_print(
DT_DEBUG_DEV,
"[picker/exposure] apply picker=%p pipe=%p\n", (
void *)picker, (
void *)pipe);
890 gtk_widget_set_sensitive(GTK_WIDGET(
g->mode),
FALSE);
893 gtk_stack_set_visible_child_name(GTK_STACK(
g->mode_stack),
"deflicker");
898 gtk_stack_set_visible_child_name(GTK_STACK(
g->mode_stack),
"manual");
902 else if(w ==
g->exposure)
905 if(
p->black >= white)
908 else if(w ==
g->black)
911 if(
p->black >= white)
924 if(!isnan(
g->deflicker_computed_exposure))
926 gchar *str = g_strdup_printf(_(
"%.2f EV"),
g->deflicker_computed_exposure);
929 gtk_label_set_text(
g->deflicker_used_EC, str);
945 GtkAllocation allocation;
946 gtk_widget_get_allocation(widget, &allocation);
947 int width = allocation.width,
height = allocation.height;
949 cairo_t *cr = cairo_create(cst);
968 cairo_set_source_rgb(cr,
RGB[0],
RGB[1],
RGB[2]);
975 cairo_set_source_surface(crf, cst, 0, 0);
977 cairo_surface_destroy(cst);
988 GtkAllocation allocation;
989 gtk_widget_get_allocation(widget, &allocation);
990 int width = allocation.width;
991 int height = allocation.height;
993 cairo_t *cr = cairo_create(cst);
1000 cairo_set_source_rgb(cr,
g->spot_RGB[0],
g->spot_RGB[1],
g->spot_RGB[2]);
1007 cairo_set_source_surface(crf, cst, 0, 0);
1009 cairo_surface_destroy(cst);
1021 const float lightness_range = lightness_max - lightness_min;
1026 const float x = lightness_min + stop * lightness_range;
1039 gtk_widget_queue_draw(
g->lightness_spot);
1040 gtk_widget_queue_draw(
g->target_spot);
1078 g->deflicker_histogram = NULL;
1090 g->mode_stack = GTK_STACK(gtk_stack_new());
1091 gtk_stack_set_homogeneous(GTK_STACK(
g->mode_stack),
FALSE);
1092 gtk_box_pack_start(GTK_BOX(self->
widget), GTK_WIDGET(
g->mode_stack),
TRUE,
TRUE, 0);
1095 gtk_stack_add_named(GTK_STACK(
g->mode_stack), vbox_manual,
"manual");
1098 gtk_widget_set_tooltip_text(
g->compensate_exposure_bias, _(
"automatically remove the camera exposure bias\n"
1099 "this is useful if you exposed the image to the right."));
1103 gtk_widget_set_tooltip_text(
g->exposure, _(
"adjust the exposure correction"));
1109 gtk_widget_set_tooltip_text(
g->black, _(
"adjust the black level to unclip negative RGB values.\n"
1110 "you should never use it to add more density in blacks!\n"
1111 "if poorly set, it will clip near-black colors out of gamut\n"
1112 "by pushing RGB values into negatives."));
1117 gtk_stack_add_named(GTK_STACK(
g->mode_stack), vbox_deflicker,
"deflicker");
1121 gtk_widget_set_tooltip_text(
g->deflicker_percentile,
1123 _(
"where in the histogram to meter for deflicking. E.g. 50% is median"));
1127 gtk_widget_set_tooltip_text(
g->deflicker_target_level,
1128 _(
"where to place the exposure level for processed pics, EV below overexposure."));
1130 GtkBox *hbox1 = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL,
DT_GUI_BOX_SPACING));
1133 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->deflicker_used_EC), _(
"what exposure correction has actually been used"));
1134 gtk_box_pack_start(GTK_BOX(hbox1), GTK_WIDGET(
g->deflicker_used_EC),
FALSE,
FALSE, 0);
1137 g->deflicker_computed_exposure = NAN;
1140 self->
widget = main_widget;
1144 "plugins/darkroom/exposure/mapping",
1145 _(
"spot exposure mapping"),
1146 GTK_BOX(self->
widget), GTK_PACK_END);
1149 _(
"\"correction\" automatically adjust exposure\n"
1150 "such that the input lightness is mapped to the target.\n"
1151 "\"measure\" simply shows how an input color is mapped by the exposure compensation\n"
1152 "and can be used to define a target."),
1156 gtk_box_pack_start(GTK_BOX(
g->cs.container), GTK_WIDGET(
g->spot_mode),
TRUE,
TRUE, 0);
1164 g->origin_spot = GTK_WIDGET(gtk_drawing_area_new());
1167 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->origin_spot),
1168 _(
"the input color that should be mapped to the target"));
1171 gtk_box_pack_start(GTK_BOX(vvbox),
g->origin_spot,
TRUE,
TRUE, 0);
1173 g->Lch_origin = gtk_label_new(_(
"L : \tN/A"));
1174 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->Lch_origin),
1175 _(
"these LCh coordinates are computed from CIE Lab 1976 coordinates"));
1176 gtk_box_pack_start(GTK_BOX(vvbox), GTK_WIDGET(
g->Lch_origin),
FALSE,
FALSE, 0);
1184 g->target_spot = GTK_WIDGET(gtk_drawing_area_new());
1187 gtk_widget_set_tooltip_text(GTK_WIDGET(
g->target_spot),
1188 _(
"the desired target exposure after mapping"));
1191 gtk_box_pack_start(GTK_BOX(vvbox),
g->target_spot,
TRUE,
TRUE, 0);
1197 gtk_box_pack_start(GTK_BOX(vvbox), GTK_WIDGET(
g->lightness_spot),
TRUE,
TRUE, 0);
1202 gtk_box_pack_start(GTK_BOX(
g->cs.container), GTK_WIDGET(hhbox),
FALSE,
FALSE, 0);
1204 g_signal_connect(G_OBJECT(self->
widget),
"draw", G_CALLBACK(
_draw), self);
static void error(char *msg)
void dt_bauhaus_slider_set_soft_range(GtkWidget *widget, float soft_min, float soft_max)
void dt_bauhaus_slider_set_digits(GtkWidget *widget, int val)
void dt_bauhaus_slider_set_default(GtkWidget *widget, float def)
void dt_bauhaus_slider_set_stop(GtkWidget *widget, float stop, float r, float g, float b)
float dt_bauhaus_slider_get(GtkWidget *widget)
int dt_bauhaus_combobox_get(GtkWidget *widget)
float dt_bauhaus_slider_get_hard_min(GtkWidget *widget)
void dt_bauhaus_slider_set(GtkWidget *widget, float pos)
void dt_bauhaus_combobox_set(GtkWidget *widget, const int pos)
void dt_bauhaus_widget_set_label(GtkWidget *widget, const char *label)
GtkWidget * dt_bauhaus_slider_new_with_range(dt_bauhaus_t *bh, dt_gui_module_t *self, float min, float max, float step, float defval, int digits)
void dt_bauhaus_slider_set_format(GtkWidget *widget, const char *format)
float dt_bauhaus_slider_get_hard_max(GtkWidget *widget)
#define DT_BAUHAUS_COMBOBOX_NEW_FULL(bauhaus, widget, action, label, tip, pos, callback, data,...)
#define DT_BAUHAUS_SLIDER_MAX_STOPS
@ DEVELOP_BLEND_CS_RGB_SCENE
@ DEVELOP_BLEND_CS_RGB_DISPLAY
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
return vector dt_simd_set1(valid ?(scaling+NORM_MIN) :NORM_MIN)
void dt_iop_color_picker_reset(dt_iop_module_t *module, gboolean keep)
gboolean dt_iop_color_picker_is_active_module(const dt_iop_module_t *module)
Tell whether one module currently owns the active darkroom picker.
GtkWidget * dt_color_picker_new(dt_iop_module_t *module, dt_iop_color_picker_kind_t kind, GtkWidget *w)
dt_XYZ_to_sRGB(XYZ, result)
static dt_aligned_pixel_t XYZ
static dt_aligned_pixel_t Lab
const dt_colormatrix_t dt_aligned_pixel_t out
static dt_aligned_pixel_t RGB
static dt_aligned_pixel_t Lch
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
void dt_histogram_worker(dt_dev_histogram_collection_params_t *const histogram_params, dt_dev_histogram_stats_t *histogram_stats, const void *const pixel, uint32_t **histogram, const dt_worker Worker, const dt_iop_order_iccprofile_info_t *const profile_info)
void dt_histogram_helper_cs_RAW_uint16(const dt_dev_histogram_collection_params_t *const histogram_params, const void *pixel, uint32_t *histogram, int j, const dt_iop_order_iccprofile_info_t *const profile_info)
dt_image_pipe_class_t dt_image_pipe_class(const dt_image_t *img)
const char * dt_image_pipe_class_name(const dt_image_pipe_class_t klass)
gboolean dt_image_needs_rawprepare(const dt_image_t *img)
void dt_conf_set_float(const char *name, float val)
float dt_conf_get_float(const char *name)
void dt_control_log(const char *msg,...)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
#define dt_free_align(ptr)
static void * dt_calloc_align(size_t size)
#define DT_MODULE_INTROSPECTION(MODVER, PARAMSTYPE)
#define __DT_CLONE_TARGETS__
#define __OMP_PARALLEL_FOR__(...)
#define __OMP_PARALLEL_FOR_SIMD__(...)
#define IS_NULL_PTR(p)
C is way too permissive with !=, == and if(var) checks, which can mean too many things depending on w...
#define dt_dev_add_history_item(dev, module, enable, redraw)
gboolean dt_dev_pixelpipe_has_preview_output(const dt_develop_t *dev, const dt_dev_pixelpipe_t *pipe, const dt_iop_roi_t *roi)
@ DT_DEV_PIXELPIPE_DISPLAY_MASK
static float _get_exposure_bias(const struct dt_iop_module_t *self)
void commit_params(struct dt_iop_module_t *self, dt_iop_params_t *p1, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static gboolean _draw(GtkWidget *widget, cairo_t *cr, dt_iop_module_t *self)
const char ** description(struct dt_iop_module_t *self)
static void _spot_settings_changed_callback(GtkWidget *slider, dt_iop_module_t *self)
static gboolean _origin_color_draw(GtkWidget *widget, cairo_t *crf, gpointer user_data)
#define DEFLICKER_BINS_COUNT
static double _raw_to_ev(uint32_t raw, uint32_t black_level, uint32_t white_level)
#define exposure2white(x)
static void _auto_set_exposure(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe)
void init_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static void _exposure_set_black(struct dt_iop_module_t *self, const float black)
void output_format(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, dt_iop_buffer_dsc_t *dsc)
void gui_reset(struct dt_iop_module_t *self)
void gui_update(struct dt_iop_module_t *self)
Refresh GUI controls from current params and configuration.
static void _exposure_set_white(struct dt_iop_module_t *self, const float white)
void gui_init(struct dt_iop_module_t *self)
void gui_changed(dt_iop_module_t *self, GtkWidget *w, void *previous)
static void _autoexp_disable(dt_iop_module_t *self)
#define white2exposure(x)
void cleanup_global(dt_iop_module_so_t *module)
static void _compute_correction(dt_iop_module_t *self, dt_iop_params_t *p1, const dt_dev_pixelpipe_iop_t *piece, const uint32_t *const histogram, const dt_dev_histogram_stats_t *const histogram_stats, float *correction)
int default_colorspace(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
static void _process_common_setup(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
void gui_cleanup(struct dt_iop_module_t *self)
void init_presets(dt_iop_module_so_t *self)
static void _deflicker_prepare_histogram(dt_iop_module_t *self, uint32_t **histogram, dt_dev_histogram_stats_t *histogram_stats)
__DT_CLONE_TARGETS__ int process(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const void *const i, void *const o)
static void _paint_hue(dt_iop_module_t *self)
void cleanup_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
void init_global(dt_iop_module_so_t *module)
@ EXPOSURE_MODE_DEFLICKER
void autoset(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, const struct dt_dev_pixelpipe_iop_t *piece, const void *i)
int process_cl(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, cl_mem dev_in, cl_mem dev_out)
static gboolean _target_color_draw(GtkWidget *widget, cairo_t *crf, gpointer user_data)
void color_picker_apply(dt_iop_module_t *self, GtkWidget *picker, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
int legacy_params(dt_iop_module_t *self, const void *const old_params, const int old_version, void *new_params, const int new_version)
void dt_gui_new_collapsible_section(dt_gui_collapsible_section_t *cs, const char *confname, const char *label, GtkBox *parent, GtkPackType pack)
Create a collapsible section and pack it into the parent box.
void dt_gui_update_collapsible_section(dt_gui_collapsible_section_t *cs)
static cairo_surface_t * dt_cairo_image_surface_create(cairo_format_t format, int width, int height)
static GtkWidget * dt_ui_section_label_new(const gchar *str)
#define DT_GUI_BOX_SPACING
#define DT_PIXEL_APPLY_DPI(value)
static GtkWidget * dt_ui_label_new(const gchar *str)
void dt_gui_presets_update_ldr(const char *name, dt_dev_operation_t op, const int32_t version, const int ldrflag)
void dt_gui_presets_add_generic(const char *name, dt_dev_operation_t op, const int32_t version, const void *params, const int32_t params_size, const int32_t enabled, const dt_develop_blend_colorspace_t blend_cst)
void dt_image_cache_read_release(dt_image_cache_t *cache, const dt_image_t *img)
dt_image_t * dt_image_cache_get(dt_image_cache_t *cache, const int32_t imgid, char mode)
const char ** dt_iop_set_description(dt_iop_module_t *module, const char *main_text, const char *purpose, const char *input, const char *process, const char *output)
#define dt_omploop_sfence()
static void dt_iop_gui_enter_critical_section(dt_iop_module_t *const module) ACQUIRE(&module -> gui_lock)
#define dt_iop_fmt_log(module, fmt,...)
Debug helper to trace a module's input-format-driven decisions on the -d pipe channel (DT_DEBUG_PIPE)...
@ IOP_FLAGS_SUPPORTS_BLENDING
static void dt_iop_gui_leave_critical_section(dt_iop_module_t *const module) RELEASE(&module -> gui_lock)
#define IOP_GUI_ALLOC(module)
GtkWidget * dt_bauhaus_toggle_from_params(dt_iop_module_t *self, const char *param)
GtkWidget * dt_bauhaus_slider_from_params(dt_iop_module_t *self, const char *param)
GtkWidget * dt_bauhaus_combobox_from_params(dt_iop_module_t *self, const char *param)
dt_iop_order_iccprofile_info_t * dt_ioppr_get_pipe_input_profile_info(const struct dt_dev_pixelpipe_t *pipe)
float *const restrict const size_t k
float *const restrict const size_t const size_t ch
#define dt_mipmap_cache_get(A, B, C, D, E, F)
#define dt_mipmap_cache_release(A, B)
float dt_aligned_pixel_t[4]
int dt_opencl_enqueue_kernel_2d(const int dev, const int kernel, const size_t *sizes)
int dt_opencl_create_kernel(const int prog, const char *name)
void dt_opencl_free_kernel(const int kernel)
int dt_opencl_set_kernel_arg(const int dev, const int kernel, const int num, const size_t size, const void *arg)
struct _GtkWidget GtkWidget
struct dt_gui_gtk_t * gui
struct dt_mipmap_cache_t * mipmap_cache
struct dt_bauhaus_t * bauhaus
struct dt_image_cache_t * image_cache
struct dt_develop_t * develop
const struct dt_histogram_roi_t * roi
dt_iop_buffer_dsc_t dsc_out
dt_iop_buffer_dsc_t dsc_in
struct dt_iop_module_t *void * data
struct dt_dev_pixelpipe_t * pipe
char filename[DT_MAX_FILENAME_LEN]
struct dt_iop_buffer_dsc_t::@29 rawprepare
dt_iop_buffer_type_t datatype
dt_aligned_pixel_t processed_maximum
dt_iop_exposure_params_t params
GtkWidget * compensate_exposure_bias
GtkWidget * deflicker_percentile
dt_gui_collapsible_section_t cs
dt_dev_histogram_stats_t deflicker_histogram_stats
uint32_t * deflicker_histogram
dt_aligned_pixel_t spot_RGB
GtkWidget * deflicker_target_level
GtkWidget * lightness_spot
float deflicker_computed_exposure
GtkLabel * deflicker_used_EC
float deflicker_target_level
dt_iop_exposure_mode_t mode
float deflicker_percentile
gboolean compensate_exposure_bias
GModule *dt_dev_operation_t op
dt_iop_global_data_t * data
dt_iop_params_t * default_params
struct dt_develop_t * dev
dt_iop_gui_data_t * gui_data
dt_iop_global_data_t * global_data
dt_aligned_pixel_t picked_color_min
dt_aligned_pixel_t picked_color_max
dt_aligned_pixel_t picked_color
dt_colormatrix_t matrix_in_transposed
dt_colormatrix_t matrix_in
Region of interest passed through the pixelpipe.