107 return _(
"_highlight reconstruction");
113 _(
"corrective"), _(
"linear, raw, scene-referred"), _(
"reconstruction, raw"),
114 _(
"linear, raw, scene-referred"));
144 const float *
const restrict in = (
const float *)input;
145 float max_RGB[3] = { 0.0f };
148 for(
size_t i = 0;
i < roi_out->
height;
i++)
149 for(
size_t j = 0; j < roi_out->
width; j++)
155 max_RGB[channel] =
MAX(max_RGB[channel], pixel_max);
158 p->clip =
MIN(
MIN(max_RGB[0], max_RGB[1]), max_RGB[2]);
162 const int new_version)
164 if(old_version == 1 && new_version == 4)
172 memcpy(new_params, old_params,
177 n->noise_level = 0.0f;
178 n->reconstructing = 0.4f;
183 n->solid_color = 0.f;
186 if(old_version == 2 && new_version == 4)
198 memcpy(new_params, old_params,
203 n->reconstructing = 0.4f;
208 n->solid_color = 0.f;
211 if(old_version == 3 && new_version == 4)
252 for(
int c = 0; c < 3; c++) thresholds[c] = (
factor > 0.f) ?
factor * user_clip * pmax[c] : clip;
253 thresholds[3] = clip;
269 const float *
const restrict in = (
const float *
const restrict)ivoid;
270 const size_t n_pixels = (size_t)roi_out->
width * roi_out->
height;
275 const float raw_threshold = fminf(fminf(thresholds[0], thresholds[1]), thresholds[2]);
277 for(
size_t k = 0;
k < n_pixels;
k++) clipped += (in[
k] > raw_threshold);
282 const size_t n_colours =
MIN(
ch, (
size_t)3);
284 for(
size_t k = 0;
k < n_pixels;
k++)
287 for(
size_t c = 0; c < n_colours; c++) over |= (in[
k *
ch + c] > thresholds[c]);
288 clipped += (over != 0);
312 const dt_iop_roi_t *
const roi_out,
const uint32_t filters,
335 size_t *
const clipped)
337 const int local_size = 64, n_groups = 256;
341 (
float *)thresholds);
350 size_t sizes[3] = { (size_t)n_groups * local_size, 1, 1 };
351 size_t local[3] = { local_size, 1, 1 };
361 if(err == CL_SUCCESS)
363 uint32_t partial_host[256];
366 if(err == CL_SUCCESS)
367 for(
int group = 0; group < n_groups; group++) *clipped += (
size_t)partial_host[group];
378 const uint32_t filters,
const int mode,
const float clip)
405 const dt_iop_roi_t *
const roi_out,
const uint32_t filters,
const float clip)
425 int blocksizex, blocksizey;
430 .cellsize =
sizeof(float),
436 blocksizex = locopt.
sizex;
437 blocksizey = locopt.
sizey;
440 blocksizex = blocksizey = 1;
447 size_t local[] = { blocksizex, blocksizey, 1 };
457 sizeof(
float) * (blocksizex + 4) * (blocksizey + 4), NULL);
465 cl_mem dev_in, cl_mem dev_out)
474 const int devid = pipe->
devid;
494 if(err != CL_SUCCESS)
goto error;
507 for(
int c = 0; c < 4; c++)
509 const float clip =
d->clip * fminf(pmax[0], fminf(pmax[1], pmax[2]));
511 = { 0.995f *
d->clip * pmax[0], 0.995f *
d->clip * pmax[1], 0.995f *
d->clip * pmax[2], clip };
519 size_t n_clipped = 0;
521 if(err != CL_SUCCESS)
goto error;
524 size_t origin[] = { 0, 0, 0 };
527 if(err != CL_SUCCESS)
goto error;
568 if(err != CL_SUCCESS)
goto error;
590 const float final_radius = (float)((
int)(1 <<
d->scales)) / scale;
591 const int scales = CLAMP((
int)ceilf(log2f(final_radius)), 1,
MAX_NUM_SCALES);
592 const int max_filter_radius = (1 << scales);
614 tiling->xalign = (filters == 9u) ? 6 : 2;
615 tiling->yalign = (filters == 9u) ? 6 : 2;
663 return N_(
"unknown");
674 if(filters)
return TRUE;
681 const void *
const ivoid,
void *
const ovoid)
719 for(
int c = 0; c < 4; c++)
721 const float clip = data->
clip * fminf(pmax[0], fminf(pmax[1], pmax[2]));
740 const float clips[4] = { 0.987f * data->
clip * pmax[0], 0.987f * data->
clip * pmax[1],
741 0.987f * data->
clip * pmax[2], clip };
766 0.995f * data->
clip * pmax[2], clip };
774 0.995f * data->
clip * pmax[2], clip };
797 memcpy(
d,
p,
sizeof(*
p));
805 dt_iop_fmt_log(self,
"commit: class=%s filters=%u mode=%d -> enabled=%d",
819 "[highlights] mode \"%s\" has no reconstruction path for this image; falling back to clipping\n",
822 dt_control_log(_(
"highlight reconstruction: \"%s\" is not available for this image type; clipping instead"),
853 const float m = (m0 > 0.f) ? m0 : 1.0f;
891 const gboolean
state = current_state && active;
892 dt_iop_fmt_log(self,
"force_enable: class=%s supported=%d current=%d -> %d",
900 const int program = 2;
906 const int harmonic_program = 38;
907 const int sparse_program = 37;
1047 const int wavelets = 35;
1224 gtk_widget_set_visible(
g->noise_level,
1228 gtk_widget_set_visible(
g->solid_color,
1246 gtk_stack_set_visible_child_name(GTK_STACK(self->
gui->
widget),
supported ?
"default" :
"monochrome");
1258 g->show_visualize =
FALSE;
1270 module->default_enabled = enable(&module->dev->image_storage);
1271 module->hide_enable_button = !_highlights_image_supported(&module->dev->image_storage);
1272 dt_iop_fmt_log(module,
"reload_defaults: class=%s default_enabled=%d hidden=%d",
1302 const gboolean was_visualize =
g->show_visualize;
1304 g->show_visualize =
FALSE;
1315 gtk_widget_set_tooltip_text(
g->mode, _(
"highlight reconstruction method"));
1319 gtk_widget_set_tooltip_text(
g->clip, _(
"manually adjust the clipping threshold against "
1320 "magenta highlights\nthe mask icon shows the clipped area\n"
1321 "(you shouldn't ever need to touch this)"));
1328 gtk_widget_set_tooltip_text(
g->noise_level, _(
"add noise to visually blend the reconstructed areas\n"
1329 "into the rest of the noisy image. useful at high ISO."));
1333 gtk_widget_set_tooltip_text(
g->iterations, _(
"increase if magenta highlights don't get fully corrected\n"
1334 "each new iteration brings a performance penalty."));
1338 gtk_widget_set_tooltip_text(
g->solid_color,
1339 _(
"increase if magenta highlights don't get fully corrected.\n"
1340 "this may produce non-smooth boundaries between valid and clipped regions."));
1343 gtk_widget_set_tooltip_text(
g->scales, _(
"increase to correct larger clipped areas.\n"
1344 "large values bring huge performance penalties"));
1347 gtk_widget_set_tooltip_text(monochromes, _(
"no highlights reconstruction for monochrome images"));
1352 gtk_stack_add_named(GTK_STACK(self->
gui->
widget), monochromes,
"monochrome");
1353 gtk_stack_add_named(GTK_STACK(self->
gui->
widget), box_raw,
"default");
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_widget_set_quad_toggle(GtkWidget *widget, int toggle)
int dt_bauhaus_combobox_length(GtkWidget *widget)
void dt_bauhaus_widget_set_quad_active(GtkWidget *widget, int active)
void dt_bauhaus_combobox_add_full(GtkWidget *widget, const char *text, dt_bauhaus_combobox_alignment_t align, gpointer data, void(free_func)(void *data), gboolean sensitive)
int dt_bauhaus_widget_get_quad_active(GtkWidget *widget)
void dt_bauhaus_widget_set_quad_visibility(GtkWidget *widget, const gboolean visible)
void dt_bauhaus_slider_set_format(GtkWidget *widget, const char *format)
void dt_bauhaus_widget_set_quad_paint(GtkWidget *widget, dt_bauhaus_quad_paint_f f, int paint_flags, void *paint_data)
@ DT_BAUHAUS_COMBOBOX_ALIGN_RIGHT
__DT_CLONE_TARGETS__ void process_visualize(const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const uint32_t filters, dt_iop_highlights_data_t *data)
__DT_CLONE_TARGETS__ void process_clip(const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const float clip)
struct _GtkWidget GtkWidget
GtkWidget, opaque, spelled exactly as GTK spells it.
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_is_monochrome(const dt_image_t *img)
gboolean dt_image_needs_rawprepare(const dt_image_t *img)
gboolean dt_image_is_mosaiced(const dt_image_t *img)
void dt_control_log(const char *msg,...)
static int FCxtrans(const int row, const int col, global const unsigned char(*const xtrans)[6])
static int FC(const int row, const int col, const unsigned int filters)
#define dt_dev_pixelpipe_update_history_main(dev)
@ DT_DEV_PIXELPIPE_DISPLAY_MASK
@ DT_DEV_PIXELPIPE_DISPLAY_PASSTHRU
@ DT_DEV_PIXELPIPE_DISPLAY_NONE
int supported(struct dt_imageio_module_storage_t *storage, struct dt_imageio_module_format_t *format)
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)
const char ** description(struct dt_iop_module_t *self)
__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 ivoid, void *const ovoid)
static void _hl_copy_input(const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_out)
static cl_int _hl_cl_visualize(dt_iop_highlights_global_data_t *gd, const int devid, cl_mem dev_in, cl_mem dev_out, const int width, const int height, const dt_iop_roi_t *const roi_out, const uint32_t filters, const dt_aligned_pixel_t clips)
static gboolean _highlights_image_supported(const dt_image_t *image)
void reload_defaults(dt_iop_module_t *module)
static void _hl_count_thresholds(const int mode, const float user_clip, const dt_aligned_pixel_t pmax, const float clip, dt_aligned_pixel_t thresholds)
static cl_int _hl_cl_lch_xtrans(dt_iop_highlights_global_data_t *gd, const int devid, cl_mem dev_in, cl_mem dev_out, const int width, const int height, const dt_iop_roi_t *const roi_out, const dt_dev_pixelpipe_iop_t *piece, const float clip)
static gboolean enable(const dt_image_t *image)
void gui_focus(struct dt_iop_module_t *self, gboolean in)
void init_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static cl_int _hl_cl_lch_bayer(dt_iop_highlights_global_data_t *gd, const int devid, cl_mem dev_in, cl_mem dev_out, const int width, const int height, const dt_iop_roi_t *const roi_out, const uint32_t filters, const float clip)
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_update(struct dt_iop_module_t *self)
Refresh GUI controls from current params and configuration.
static cl_int _hl_cl_clip(dt_iop_highlights_global_data_t *gd, const int devid, cl_mem dev_in, cl_mem dev_out, const int width, const int height, const dt_iop_roi_t *const roi_out, const uint32_t filters, const int mode, const float clip)
void gui_init(struct dt_iop_module_t *self)
void gui_changed(dt_iop_module_t *self, GtkWidget *w, void *previous)
void tiling_callback(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, const struct dt_dev_pixelpipe_iop_t *piece, struct dt_develop_tiling_t *tiling)
static gboolean _highlights_mode_supported(const dt_iop_highlights_mode_t mode, const uint32_t filters)
void cleanup_global(dt_iop_module_so_t *module)
int default_colorspace(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
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 *input)
gboolean force_enable(struct dt_iop_module_t *self, const gboolean current_state)
void cleanup_pipe(struct dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static void _visualize_callback(GtkWidget *quad, gpointer user_data)
static cl_int _hl_cl_count_clipped(dt_iop_highlights_global_data_t *gd, const int devid, cl_mem dev_in, const int width, const int height, const dt_aligned_pixel_t thresholds, const int is_raw, size_t *const clipped)
void init_global(dt_iop_module_so_t *module)
static size_t _hl_count_clipped(const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t thresholds)
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 const char * _highlights_mode_name(const dt_iop_highlights_mode_t mode)
int legacy_params(dt_iop_module_t *self, const void *const old_params, const int old_version, void *new_params, const int new_version)
static void dt_iop_image_copy_by_size(float *const __restrict__ out, const float *const __restrict__ in, const size_t width, const size_t height, const size_t ch)
uint32_t dt_dev_get_roi_filters(const dt_dev_pixelpipe_iop_t *const piece, const dt_iop_roi_t *const roi_in)
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)
float dt_dev_get_module_scale(const dt_dev_pixelpipe_t *const pipe, const dt_iop_roi_t *const roi_in)
void dt_iop_set_cache_bypass(dt_iop_module_t *module, gboolean state)
#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
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)
static dt_iop_gui_data_t * dt_iop_gui_data(const struct dt_iop_module_t *m)
The module's GUI data blob, NULL-safe for headless callers: IOP process() implementations read it for...
#define IOP_GUI_ALLOC(module)
__DT_CLONE_TARGETS__ void process_inpaint_bayer(const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_out, const float clips[4], const uint32_t filters)
__DT_CLONE_TARGETS__ void process_inpaint_xtrans(const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const float clips[4], const uint8_t(*const xtrans)[6])
static float kernel(const float *x, const float *y)
GtkWidget * dt_ui_label_new(const gchar *str)
cl_int process_laplacian_bayer_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, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
cl_int process_laplacian_xtrans_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, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
cl_int process_laplacian_passthrough_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, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
__DT_CLONE_TARGETS__ int process_laplacian(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const void *const restrict ivoid, void *const restrict ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
__DT_CLONE_TARGETS__ void process_lch_bayer(dt_iop_module_t *self, const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const float clip)
__DT_CLONE_TARGETS__ void process_lch_xtrans(dt_iop_module_t *self, const dt_dev_pixelpipe_iop_t *piece, const void *const ivoid, void *const ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const float clip)
void dt_print(dt_debug_thread_t thread, const char *msg,...) __attribute__((format(printf
Print to stdout when thread is enabled, prefixed with seconds since startup.
float *const restrict const size_t k
float *const restrict const size_t const size_t ch
#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_free_align(ptr)
Release memory from dt_alloc_align() and set ptr to NULL.
static void * dt_calloc_align(size_t size)
dt_alloc_align() followed by a zero fill.
#define dt_free(ptr)
g_free() ptr and set it to NULL, skipping both if it is already NULL.
#define DT_MODULE_INTROSPECTION(MODVER, PARAMSTYPE)
DT_MODULE() for a module whose params struct is introspected.
int dt_opencl_local_buffer_opt(const int devid, const int kernel, dt_opencl_local_buffer_t *factors)
int dt_opencl_enqueue_kernel_2d(const int dev, const int kernel, const size_t *sizes)
void * dt_opencl_alloc_device_buffer(const int devid, const size_t size)
int dt_opencl_create_kernel(const int prog, const char *name)
void * dt_opencl_copy_host_to_device_constant(const int devid, const size_t size, void *host)
int dt_opencl_enqueue_copy_image(const int devid, cl_mem src, cl_mem dst, size_t *orig_src, size_t *orig_dst, size_t *region)
int dt_opencl_read_buffer_from_device(const int devid, void *host, void *device, const size_t offset, const size_t size, const int blocking)
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)
int dt_opencl_enqueue_kernel_2d_with_local(const int dev, const int kernel, const size_t *sizes, const size_t *local)
void dt_opencl_release_mem_object(cl_mem mem)
#define DT_OPENCL_DEFAULT_ERROR
#define __OMP_PARALLEL_FOR__(...)
#define __OMP_PARALLEL_FOR_SIMD__(...)
cl_int process_harmonic_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, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
__DT_CLONE_TARGETS__ int process_harmonic(struct dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const void *const restrict ivoid, void *const restrict ovoid, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out, const dt_aligned_pixel_t clips)
DT_ALIGNED_PIXEL float dt_aligned_pixel_t[4]
@ DT_IOP_HIGHLIGHTS_HARMONIC
@ DT_IOP_HIGHLIGHTS_INPAINT
@ DT_IOP_HIGHLIGHTS_LAPLACIAN
dt_atrous_wavelets_scales_t
#define DT_HL_MIN_CLIPPED_PIXELS
dt_iop_highlights_params_t dt_iop_highlights_data_t
const float uint32_t state[4]
dt_iop_buffer_dsc_t dsc_out
dt_iop_buffer_dsc_t dsc_in
struct dt_iop_module_t *void * data
gboolean cache_output_on_ram
struct dt_dev_pixelpipe_t * pipe
dt_aligned_pixel_t processed_maximum
int kernel_highlights_diffuse_color
int kernel_hl_cf_eval_pair
int kernel_hl_cf_pack_joint
int kernel_highlights_1f_clip
int kernel_highlights_bilinear_and_mask_passthrough
int kernel_sparse_chol_final_level
int kernel_hl_cf_fit_pair
int kernel_hl_aniso_splat
int kernel_hl_window_unpack
int kernel_hl_ring_vote_finalize
int kernel_hl_cgrad_write1c
int kernel_hl_aniso_reassemble
int kernel_hl_cf_fit_joint
int kernel_hl_aniso_pyr_down
int kernel_hl_aniso_obs_flags
int kernel_hl_aniso_obs_full
int kernel_hl_knee_apply_interp
int kernel_highlights_guide_laplacians
int kernel_hl_pyr_project
int kernel_hl_knee_joint_reg
int kernel_highlights_normalize_reduce_first_passthrough
int kernel_highlights_count_clipped
int kernel_hl_grad_reduce
int kernel_hl_cg_beta_step
int kernel_hl_vote_reduce
int kernel_hl_pde_scatter
int kernel_hl_cgrad_plateau
int kernel_hl_cg_alpha_step
int kernel_highlights_1f_lch_xtrans
int kernel_hl_cmean_finalize
int kernel_hl_region_benefit
int kernel_hl_fill_jacobi_block
int kernel_highlights_1f_lch_bayer
int kernel_hl_cf_pack_pair
int kernel_hl_cgrad_store
int kernel_highlights_remosaic_and_replace
int kernel_hl_cf_eval_deep
int kernel_sparse_chol_fwd_level
int kernel_hl_cfa_jacobi_block
int kernel_hl_region_gather
int kernel_filmic_bspline_horizontal_local
int kernel_hl_ratio_plane
int kernel_highlights_normalize_reduce_first
int kernel_hl_fill_seed_up
int kernel_hl_region_stats
int kernel_hl_knee_pair_reg
int kernel_hl_ratio_cmean_blend
int kernel_hl_cf_pack_deepmask
int kernel_highlights_remosaic_and_replace_passthrough
int kernel_hl_cf_lref_partials
int kernel_highlights_4f_clip
int kernel_highlights_bilinear_and_mask_xtrans
int kernel_hl_aniso_scatter
int kernel_highlights_normalize_reduce_first_xtrans
int kernel_hl_aniso_iter_block
int kernel_interpolate_bilinear
int kernel_hl_region_worth_finalize
int kernel_filmic_bspline_horizontal
int kernel_hl_aniso_tensor
int kernel_hl_fill_jacobi
int kernel_highlights_box_blur
int kernel_hl_cmean_reduce
int kernel_filmic_bspline_vertical
int kernel_hl_reduce_finalize
int kernel_sparse_chol_bwd_level
int kernel_hl_cgrad_guard
int kernel_hl_window_pack
int kernel_hl_mask_to_img1
int kernel_hl_cgrad_reproject
int kernel_highlights_normalize_reduce_second
int kernel_sparse_chol_update_level
int kernel_hl_region_scatter
int kernel_highlights_remosaic_and_replace_xtrans
int kernel_highlights_false_color
int kernel_hl_clip0_rehue
int kernel_highlights_bilinear_and_mask
int kernel_hl_cgrad_share
int kernel_hl_cf_eval_joint
int kernel_hl_cgrad_anchor
int kernel_hl_aniso_weights
int kernel_filmic_bspline_vertical_local
int kernel_hl_cgrad_hole1c
int kernel_hl_cfa_weights
dt_iop_highlights_mode_t mode
dt_iop_global_data_t * data
int32_t hide_enable_button
struct dt_iop_module_gui_t * gui
struct dt_develop_t * dev
dt_iop_global_data_t * global_data
Region of interest passed through the pixelpipe.
#define __DT_CLONE_TARGETS__
Telling the user something happened.