118 return C_(
"modulename",
"Raw settings");
145 void *new_params,
const int new_version)
148 typedef struct dt_iop_rawprepare_params_v1_t
154 uint16_t raw_black_level_separate[4];
155 uint16_t raw_white_point;
156 } dt_iop_rawprepare_params_v1_t;
158 if(old_version == 1 && new_version == 2)
160 dt_iop_rawprepare_params_v1_t *o = (dt_iop_rawprepare_params_v1_t *)old_params;
161 dt_iop_rawprepare_params_v2_t *
n = (dt_iop_rawprepare_params_v2_t *)new_params;
162 memcpy(
n, o,
sizeof *o);
173 "touch with great care!"),
175 _(
"linear, raw, scene-referred"),
177 _(
"linear, raw, scene-referred"));
189 .raw_black_level_separate[0] = 0,
190 .raw_black_level_separate[1] = 0,
191 .raw_black_level_separate[2] = 0,
192 .raw_black_level_separate[3] = 0,
193 .raw_white_point = UINT16_MAX },
201 const double scale = roi_in->
scale;
202 return (
int)roundf((
double)
value * scale);
231 const uint32_t crop_x = compute_proper_crop(piece, roi_in,
d->
x);
232 const uint32_t crop_y = compute_proper_crop(piece, roi_in,
d->
y);
237 "[rawprepare] pipe %p (%s) thread %lu piece %p dsc %p roi_in=(%d,%d) scale=%f d->x,y=(%d,%d) -> crop=(%u,%u) filters=0x%x -> 0x%x\n",
242 (
unsigned long)pthread_self(), (
void *)piece, (
void *)dsc,
243 roi_in->
x, roi_in->
y, roi_in->
scale,
d->x,
d->y, crop_x, crop_y,
256 for(
int i = 0;
i < 6; ++
i)
258 for(
int j = 0; j < 6; ++j)
266 float *
const restrict points,
size_t points_count)
273 if (
d->x == 0 &&
d->y == 0)
return 1;
276 const double x = (
double)
d->x * scale;
277 const double y = (
double)
d->y * scale;
279 for(
size_t i = 0;
i < points_count * 2;
i += 2)
290 float *
const restrict points,
size_t points_count)
297 if (
d->x == 0 &&
d->y == 0)
return 1;
300 const double x = (
double)
d->x * scale;
301 const double y = (
double)
d->y * scale;
303 for(
size_t i = 0;
i < points_count * 2;
i += 2)
332 roi_out->
x = roi_out->
y = 0;
334 const double x =
d->x +
d->width;
335 const double y =
d->y +
d->height;
336 const double scale = roi_in->
scale;
337 roi_out->
width = (int)round((
double)roi_out->
width -
x * scale);
338 roi_out->
height = (int)round((
double)roi_out->
height - y * scale);
354 const double x =
d->x +
d->width;
355 const double y =
d->y +
d->height;
356 const double scale = roi_in->
scale;
357 roi_in->
width = (int)round((
double)roi_in->
width +
x * scale);
358 roi_in->
height = (int)round((
double)roi_in->
height + y * scale);
381 const int row,
const int col,
382 const int32_t
x,
const int32_t y)
384 return ((((
row + roi_out->
y + y) & 1) << 1) + ((col + roi_out->
x +
x) & 1));
405 const int csx = compute_proper_crop(piece, roi_in,
p->
x);
406 const int csy = compute_proper_crop(piece, roi_in,
p->
y);
410 const uint16_t *
const restrict in = (
const uint16_t *
const restrict)input;
412 int max_RGB[4] = { 0 };
416 for(
int j = 0; j < roi_out->
width; j++)
418 const size_t channel = BL(roi_out,
i, j,
p->
x,
p->y);
419 const size_t pin = roi_in->
width * (
i + csy) + j + csx;
420 const int pixel = in[pin];
421 max_RGB[channel] =
MAX(max_RGB[channel], pixel);
435 const void *
const ivoid,
void *
const ovoid)
442 const int input_width = roi_in->
width;
443 const int roi_x = roi_out->
x;
444 const int roi_y = roi_out->
y;
445 const int cfa_x = roi_x +
d->x;
446 const int cfa_y = roi_y +
d->y;
450 const int csx = compute_proper_crop(piece, roi_in,
d->
x);
451 const int csy = compute_proper_crop(piece, roi_in,
d->
y);
457 const uint16_t *
const in = (
const uint16_t *
const)ivoid;
458 float *
const out = (
float *
const)
ovoid;
459 const int x_phase = cfa_x & 1;
461 for(
int k = 0;
k < 4;
k++) inv_div[
k] = 1.0f /
d->div[
k];
463 for(
int j = 0; j <
height; j++)
467 const size_t pin = (size_t)input_width * (j + csy) + csx;
468 const size_t pout = (size_t)j *
width;
469 const int row_phase = ((j + cfa_y) & 1) << 1;
470 const int id0 = row_phase + x_phase;
471 const int id1 = row_phase + (x_phase ^ 1);
472 const float sub0 =
d->sub[id0];
473 const float sub1 =
d->sub[id1];
474 const float inv0 = inv_div[id0];
475 const float inv1 = inv_div[id1];
480 out[pout +
i + 0] = ((float)in[pin +
i + 0] - sub0) * inv0;
481 out[pout +
i + 1] = ((float)in[pin +
i + 1] - sub1) * inv1;
486 const int id = row_phase + ((x_phase +
i) & 1);
487 out[pout +
i] = ((float)in[pin +
i] -
d->sub[
id]) * inv_div[id];
496 const float *
const in = (
const float *
const)ivoid;
497 float *
const out = (
float *
const)
ovoid;
498 const int x_phase = cfa_x & 1;
500 for(
int k = 0;
k < 4;
k++) inv_div[
k] = 1.0f /
d->div[
k];
503 for(
int j = 0; j <
height; j++)
507 const size_t pin = (size_t)input_width * (j + csy) + csx;
508 const size_t pout = (size_t)j *
width;
509 const int row_phase = ((j + cfa_y) & 1) << 1;
510 const int id0 = row_phase + x_phase;
511 const int id1 = row_phase + (x_phase ^ 1);
512 const float sub0 =
d->sub[id0];
513 const float sub1 =
d->sub[id1];
514 const float inv0 = inv_div[id0];
515 const float inv1 = inv_div[id1];
520 out[pout +
i + 0] = (in[pin +
i + 0] - sub0) * inv0;
521 out[pout +
i + 1] = (in[pin +
i + 1] - sub1) * inv1;
526 const int id = row_phase + ((x_phase +
i) & 1);
527 out[pout +
i] = (in[pin +
i] -
d->sub[id]) * inv_div[
id];
535 const float *
const in = (
const float *
const)ivoid;
536 float *
const out = (
float *
const)
ovoid;
538 const float sub =
d->sub[0];
539 const float div =
d->div[0];
543 for(
int j = 0; j <
height; j++)
547 for(
int c = 0; c <
ch; c++)
549 const size_t pin = (size_t)
ch * (input_width * (j + csy) + csx +
i) + c;
550 const size_t pout = (size_t)
ch * (j *
width +
i) + c;
552 out[pout] = (in[pin] - sub) / div;
561 const uint32_t map_w =
d->gainmaps[0]->map_points_h;
562 const uint32_t map_h =
d->gainmaps[0]->map_points_v;
563 const float im_to_rel_x = 1.0f / piece->
buf_in.
width;
565 const float rel_to_map_x = 1.0f /
d->gainmaps[0]->map_spacing_h;
566 const float rel_to_map_y = 1.0f /
d->gainmaps[0]->map_spacing_v;
567 const float map_origin_h =
d->gainmaps[0]->map_origin_h;
568 const float map_origin_v =
d->gainmaps[0]->map_origin_v;
569 float *
const out = (
float *
const)
ovoid;
571 for(
int j = 0; j <
height; j++)
573 const float y_map = CLAMP(((roi_y + csy + j) * im_to_rel_y - map_origin_v) * rel_to_map_y, 0, map_h);
574 const uint32_t y_i0 =
MIN(y_map, map_h - 1);
575 const uint32_t y_i1 =
MIN(y_i0 + 1, map_h - 1);
576 const float y_frac = y_map - y_i0;
577 const float * restrict map_row0[4];
578 const float * restrict map_row1[4];
579 for(
int f = 0;
f < 4;
f++)
581 map_row0[
f] = &
d->gainmaps[
f]->map_gain[y_i0 * map_w];
582 map_row1[
f] = &
d->gainmaps[
f]->map_gain[y_i1 * map_w];
586 const int id = BL(roi_out, j,
i,
d->
x,
d->y);
587 const float x_map = CLAMP(((roi_x + csx +
i) * im_to_rel_x - map_origin_h) * rel_to_map_x, 0, map_w);
588 const uint32_t x_i0 =
MIN(x_map, map_w - 1);
589 const uint32_t x_i1 =
MIN(x_i0 + 1, map_w - 1);
590 const float x_frac = x_map - x_i0;
591 const float gain_top = (1.0f - x_frac) * map_row0[
id][x_i0] + x_frac * map_row0[
id][x_i1];
592 const float gain_bottom = (1.0f - x_frac) * map_row1[
id][x_i0] + x_frac * map_row1[
id][x_i1];
593 out[j *
width +
i] *= (1.0f - y_frac) * gain_top + y_frac * gain_bottom;
604 cl_mem dev_in, cl_mem dev_out)
614 const int devid = pipe->
devid;
615 cl_mem dev_sub = NULL;
616 cl_mem dev_div = NULL;
617 cl_mem dev_gainmap[4] = {0};
621 gboolean gainmap_args =
FALSE;
626 if(
d->apply_gainmaps)
638 if(
d->apply_gainmaps)
653 const int csx = compute_proper_crop(piece, roi_in,
d->
x), csy = compute_proper_crop(piece, roi_in,
d->
y);
677 const int map_size[2] = {
d->gainmaps[0]->map_points_h,
d->gainmaps[0]->map_points_v };
679 const float rel_to_map[2] = { 1.0 /
d->gainmaps[0]->map_spacing_h, 1.0 /
d->gainmaps[0]->map_spacing_v };
680 const float map_origin[2] = {
d->gainmaps[0]->map_origin_h,
d->gainmaps[0]->map_origin_v };
682 for(
int i = 0;
i < 4;
i++)
685 if(dev_gainmap[
i] == NULL)
goto error;
687 map_size[0], map_size[1],
sizeof(
float));
688 if(err != CL_SUCCESS)
goto error;
701 if(err != CL_SUCCESS)
goto error;
739 if(imgid <= 0)
return FALSE;
748 if(test)
return FALSE;
768 for(
int i = 0;
i < 4;
i++)
774 g->plane != 0 ||
g->planes != 1 ||
g->map_planes != 1 ||
775 g->row_pitch != 2 ||
g->col_pitch != 2 ||
776 g->map_points_v < 2 ||
g->map_points_h < 2 ||
777 g->top > 1 ||
g->left > 1 ||
780 uint32_t filter = ((
g->top & 1) << 1) + (
g->left & 1);
781 gainmaps[filter] =
g;
785 if(gainmaps[0] == NULL || gainmaps[1] == NULL || gainmaps[2] == NULL || gainmaps[3] == NULL)
789 for(
int i = 1;
i < 4;
i++)
791 if(gainmaps[
i]->map_points_h != gainmaps[0]->map_points_h ||
792 gainmaps[
i]->map_points_v != gainmaps[0]->map_points_v ||
793 gainmaps[
i]->map_spacing_h != gainmaps[0]->map_spacing_h ||
794 gainmaps[
i]->map_spacing_v != gainmaps[0]->map_spacing_v ||
795 gainmaps[
i]->map_origin_h != gainmaps[0]->map_origin_h ||
796 gainmaps[
i]->map_origin_v != gainmaps[0]->map_origin_v)
801 memcpy(gainmaps_out, gainmaps,
sizeof(gainmaps));
809 for(
int i = 0;
i < 4;
i++)
811 g_free(
d->gainmaps[
i]);
812 d->gainmaps[
i] = NULL;
828 for(
int i = 0;
i < 4;
i++)
834 d->gainmaps[
i] = g_malloc(sz);
840 memcpy(
d->gainmaps[
i], src[
i], sz);
855 d->height =
p->height;
859 const float white = (float)
p->raw_white_point;
861 for(
int i = 0;
i < 4;
i++)
863 d->sub[
i] = (float)
p->raw_black_level_separate[
i];
864 d->div[
i] = (white -
d->sub[
i]);
869 const float normalizer
871 const float white = (float)
p->raw_white_point / normalizer;
873 for(
int i = 0;
i < 4;
i++)
875 black +=
p->raw_black_level_separate[
i] / normalizer;
879 for(
int i = 0;
i < 4;
i++)
882 d->div[
i] = (white - black);
887 for(uint8_t
i = 0;
i < 4;
i++)
889 black += (float)
p->raw_black_level_separate[
i];
891 d->rawprepare.raw_black_level = (uint16_t)(black / 4.0f);
892 d->rawprepare.raw_white_point =
p->raw_white_point;
912 dt_iop_fmt_log(self,
"commit: class=%s needs_rawprepare=%d normalized=%d cl_ok=%d -> enabled=%d",
945 const gboolean
state = active && current_state;
946 dt_iop_fmt_log(self,
"force_enable: class=%s supported=%d current=%d -> %d",
948 active, current_state,
state);
981 const int program = 2;
1011 for(
int i = 0;
i < 4;
i++)
1012 av +=
p->raw_black_level_separate[
i];
1014 for(
int i = 0;
i < 4;
i++)
1019 for(
int i = 1;
i < 4;
i++)
1020 gtk_widget_set_visible(
g->black_level_separate[
i], !is_monochrome);
1026 gtk_stack_set_visible_child_name(GTK_STACK(self->
widget), self->
default_enabled ?
"raw" :
"non_raw");
1037 if(w ==
g->black_level_separate[0])
1039 const int val =
p->raw_black_level_separate[0];
1040 for(
int i = 1;
i < 4;
i++)
1047 = { N_(
"black level 0"),
1048 N_(
"black level 1"),
1049 N_(
"black level 2"),
1050 N_(
"black level 3") };
1058 for(
int i = 0;
i < 4;
i++)
1060 gchar *par = g_strdup_printf(
"raw_black_level_separate[%i]",
i);
1064 gtk_widget_set_tooltip_text(
g->black_level_separate[
i], _(
black_label[
i]));
1071 gtk_widget_set_tooltip_text(
g->white_point, _(
"white point"));
1075 gtk_widget_set_tooltip_text(
g->flat_field, _(
"flat field correction to compensate for lens shading"));
1077 gtk_box_pack_start(GTK_BOX(self->
widget),
1081 gtk_widget_set_tooltip_text(
g->x, _(
"crop from left border"));
1085 gtk_widget_set_tooltip_text(
g->y, _(
"crop from top"));
1089 gtk_widget_set_tooltip_text(
g->width, _(
"crop from right border"));
1093 gtk_widget_set_tooltip_text(
g->height, _(
"crop from bottom"));
1097 self->
widget = gtk_stack_new();
1098 gtk_stack_set_homogeneous(GTK_STACK(self->
widget),
FALSE);
1100 GtkWidget *label_non_raw =
dt_ui_label_new(_(
"raw black/white point correction\nonly works for the sensors that need it."));
1102 gtk_stack_add_named(GTK_STACK(self->
widget), label_non_raw,
"non_raw");
1103 gtk_stack_add_named(GTK_STACK(self->
widget), box_raw,
"raw");
static void error(char *msg)
void dt_bauhaus_slider_set_soft_max(GtkWidget *widget, float val)
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)
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
const dt_aligned_pixel_t f
const dt_colormatrix_t dt_aligned_pixel_t out
typedef void((*dt_cache_allocate_t)(void *userdata, dt_cache_entry_t *entry))
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_hdr(const dt_image_t *img)
void dt_image_print_debug_info(const dt_image_t *img, const char *context)
gboolean dt_image_needs_rawprepare(const dt_image_t *img)
void dt_print(dt_debug_thread_t thread, const char *msg,...)
#define dt_free_align(ptr)
static void * dt_calloc_align(size_t size)
float dt_aligned_pixel_simd_t __attribute__((vector_size(16), aligned(16)))
Enable aggressive floating-point arithmetic optimizations, in denormals handling. Set through user pr...
#define DT_MODULE_INTROSPECTION(MODVER, PARAMSTYPE)
#define __DT_CLONE_TARGETS__
#define __OMP_PARALLEL_FOR__(...)
static const dt_aligned_pixel_simd_t value
#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_database_start_transaction(db)
#define dt_database_release_transaction(db)
static GtkWidget * dt_ui_section_label_new(const gchar *str)
#define DT_GUI_BOX_SPACING
static GtkWidget * dt_ui_label_new(const gchar *str)
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)
@ DT_IMAGE_MONOCHROME_BAYER
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)
void dt_image_cache_write_release(dt_image_cache_t *cache, dt_image_t *img, dt_image_cache_write_mode_t mode)
void dt_iop_copy_image_roi(float *const __restrict__ out, const float *const __restrict__ in, const size_t ch, const dt_iop_roi_t *const __restrict__ roi_in, const dt_iop_roi_t *const __restrict__ roi_out, const int zero_pad)
uint32_t dt_rawspeed_crop_dcraw_filters(uint32_t filters, uint32_t crop_x, uint32_t crop_y)
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_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_TILING_FULL_ROI
#define IOP_GUI_ALLOC(module)
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 float kernel(const float *x, const float *y)
float *const restrict const size_t k
float *const restrict const size_t const size_t ch
int dt_opencl_enqueue_kernel_2d(const int dev, const int kernel, const size_t *sizes)
void * dt_opencl_alloc_device(const int devid, const int width, const int height, const int bpp)
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)
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)
void dt_opencl_release_mem_object(cl_mem mem)
int dt_opencl_write_host_to_device(const int devid, void *host, void *device, const int width, const int height, const int bpp)
@ DT_DEV_PIXELPIPE_THUMBNAIL
@ DT_DEV_PIXELPIPE_EXPORT
@ DT_DEV_PIXELPIPE_PREVIEW
void distort_mask(struct dt_iop_module_t *self, const struct dt_dev_pixelpipe_t *pipe, struct dt_dev_pixelpipe_iop_t *piece, const float *const in, float *const out, const dt_iop_roi_t *const roi_in, const dt_iop_roi_t *const roi_out)
const char ** description(struct dt_iop_module_t *self)
void modify_roi_out(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, dt_iop_roi_t *roi_out, const dt_iop_roi_t *const roi_in)
int distort_backtransform(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, float *const restrict points, size_t points_count)
__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)
int distort_transform(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, float *const restrict points, size_t points_count)
void gui_update(dt_iop_module_t *self)
Refresh GUI controls from current params and configuration.
static void _free_owned_gainmaps(dt_iop_rawprepare_data_t *d)
dt_iop_rawprepare_flat_field_t
void modify_roi_in(dt_iop_module_t *self, const dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, const dt_iop_roi_t *const roi_out, dt_iop_roi_t *roi_in)
static gboolean enable(const dt_image_t *image)
int process_cl(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)
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 cleanup_global(dt_iop_module_so_t *self)
void gui_init(dt_iop_module_t *self)
void gui_changed(dt_iop_module_t *self, GtkWidget *w, void *previous)
void reload_defaults(dt_iop_module_t *self)
void cleanup_pipe(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
int default_colorspace(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece)
void input_format(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece, dt_iop_buffer_dsc_t *dsc)
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)
RawSpeed tends to under-evaluate the white point of RAW images, which leads to RGB values > 1 after n...
void init_presets(dt_iop_module_so_t *self)
gboolean check_gain_maps(dt_iop_module_t *self, dt_dng_gain_map_t **gainmaps_out)
void commit_params(dt_iop_module_t *self, dt_iop_params_t *params, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static gboolean _own_gainmaps(dt_iop_module_t *self, dt_iop_rawprepare_data_t *d)
gboolean force_enable(struct dt_iop_module_t *self, const gboolean current_state)
void init_pipe(dt_iop_module_t *self, dt_dev_pixelpipe_t *pipe, dt_dev_pixelpipe_iop_t *piece)
static void _update_output_cfa_descriptor(const dt_dev_pixelpipe_t *pipe, const dt_dev_pixelpipe_iop_t *piece, const dt_iop_roi_t *const roi_in, dt_iop_buffer_dsc_t *dsc)
static gboolean image_set_rawcrops(const int32_t imgid, int dx, int dy)
static int image_is_normalized(const dt_image_t *const image)
const gchar * black_label[]
void init_global(dt_iop_module_so_t *self)
int legacy_params(dt_iop_module_t *self, const void *const old_params, const int old_version, void *new_params, const int new_version)
#define DT_DEBUG_CONTROL_SIGNAL_RAISE(ctlsig, signal,...)
@ DT_SIGNAL_METADATA_UPDATE
struct _GtkWidget GtkWidget
const float uint32_t state[4]
const struct dt_database_t * db
struct dt_control_signal_t * signals
struct dt_image_cache_t * image_cache
dt_iop_buffer_dsc_t dsc_out
dt_iop_buffer_dsc_t dsc_in
struct dt_iop_module_t *void * data
dt_dev_pixelpipe_type_t type
struct dt_develop_t * dev
uint16_t raw_black_level_separate[4]
struct dt_iop_buffer_dsc_t::@32 rawprepare
dt_iop_buffer_type_t datatype
dt_aligned_pixel_t processed_maximum
GModule *dt_dev_operation_t op
dt_iop_global_data_t * data
int32_t hide_enable_button
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_dng_gain_map_t * gainmaps[4]
struct dt_iop_rawprepare_data_t::@61 rawprepare
int kernel_rawprepare_1f_gainmap
int kernel_rawprepare_1f_unnormalized
int kernel_rawprepare_1f_unnormalized_gainmap
GtkWidget * black_level_separate[4]
uint16_t raw_black_level_separate[4]
dt_iop_rawprepare_flat_field_t flat_field
Region of interest passed through the pixelpipe.
typedef double((*spd)(unsigned long int wavelength, double TempK))