124
123
#ifdef HAVE_OPENCL
126
125
process_cl (struct dt_iop_module_t *self, dt_dev_pixelpipe_iop_t *piece, cl_mem dev_in, cl_mem dev_out, const dt_iop_roi_t *roi_in, const dt_iop_roi_t *roi_out)
128
127
dt_iop_colorin_data_t *d = (dt_iop_colorin_data_t *)piece->data;
129
128
dt_iop_colorin_global_data_t *gd = (dt_iop_colorin_global_data_t *)self->data;
129
cl_mem dev_m = NULL, dev_r = NULL, dev_g = NULL, dev_b = NULL;
132
const int map_blues = self->dev->image->flags & DT_IMAGE_RAW;
132
133
const int devid = piece->pipe->devid;
133
134
size_t sizes[] = {roi_in->width, roi_in->height, 1};
134
cl_mem dev_m = dt_opencl_copy_host_to_device_constant(sizeof(float)*9, devid, d->cmatrix);
135
cl_mem dev_r = dt_opencl_copy_host_to_device(d->lut[0], 256, 256, devid, sizeof(float));
136
cl_mem dev_g = dt_opencl_copy_host_to_device(d->lut[1], 256, 256, devid, sizeof(float));
137
cl_mem dev_b = dt_opencl_copy_host_to_device(d->lut[2], 256, 256, devid, sizeof(float));
135
dev_m = dt_opencl_copy_host_to_device_constant(sizeof(float)*9, devid, d->cmatrix);
136
if (dev_m == NULL) goto error;
137
dev_r = dt_opencl_copy_host_to_device(d->lut[0], 256, 256, devid, sizeof(float));
138
if (dev_r == NULL) goto error;
139
dev_g = dt_opencl_copy_host_to_device(d->lut[1], 256, 256, devid, sizeof(float));
140
if (dev_g == NULL) goto error;
141
dev_b = dt_opencl_copy_host_to_device(d->lut[2], 256, 256, devid, sizeof(float));
142
if (dev_b == NULL) goto error;
138
143
dt_opencl_set_kernel_arg(darktable.opencl, devid, gd->kernel_colorin, 0, sizeof(cl_mem), (void *)&dev_in);
139
144
dt_opencl_set_kernel_arg(darktable.opencl, devid, gd->kernel_colorin, 1, sizeof(cl_mem), (void *)&dev_out);
140
145
dt_opencl_set_kernel_arg(darktable.opencl, devid, gd->kernel_colorin, 2, sizeof(cl_mem), (void *)&dev_m);
141
146
dt_opencl_set_kernel_arg(darktable.opencl, devid, gd->kernel_colorin, 3, sizeof(cl_mem), (void *)&dev_r);
142
147
dt_opencl_set_kernel_arg(darktable.opencl, devid, gd->kernel_colorin, 4, sizeof(cl_mem), (void *)&dev_g);
143
148
dt_opencl_set_kernel_arg(darktable.opencl, devid, gd->kernel_colorin, 5, sizeof(cl_mem), (void *)&dev_b);
149
dt_opencl_set_kernel_arg(darktable.opencl, devid, gd->kernel_colorin, 6, sizeof(cl_int), (void *)&map_blues);
144
150
err = dt_opencl_enqueue_kernel_2d(darktable.opencl, devid, gd->kernel_colorin, sizes);
145
if(err != CL_SUCCESS) fprintf(stderr, "couldn't enqueue colorin kernel! %d\n", err);
146
clReleaseMemObject(dev_m);
147
clReleaseMemObject(dev_r);
148
clReleaseMemObject(dev_g);
149
clReleaseMemObject(dev_b);
151
if(err != CL_SUCCESS) goto error;
152
dt_opencl_release_mem_object(dev_m);
153
dt_opencl_release_mem_object(dev_r);
154
dt_opencl_release_mem_object(dev_g);
155
dt_opencl_release_mem_object(dev_b);
159
if (dev_m != NULL) dt_opencl_release_mem_object(dev_m);
160
if (dev_r != NULL) dt_opencl_release_mem_object(dev_r);
161
if (dev_g != NULL) dt_opencl_release_mem_object(dev_g);
162
if (dev_b != NULL) dt_opencl_release_mem_object(dev_b);
163
dt_print(DT_DEBUG_OPENCL, "[opencl_colorin] couldn't enqueue kernel! %d\n", err);
173
189
// memcpy(cam, buf_in, sizeof(float)*3);
174
190
// TODO: avoid calling this for linear profiles? doesn't seem to impact performance much.
175
191
for(int i=0; i<3; i++) cam[i] = lerp_lut(d->lut[i], buf_in[i]);
176
// manual gamut mapping. these values cause trouble when converting back from Lab to sRGB:
177
const float YY = cam[0]+cam[1]+cam[2];
178
const float zz = cam[2]/YY;
179
// lower amount and higher bound_z make the effect smaller.
180
// the effect is weakened the darker input values are, saturating at bound_Y
181
const float bound_z = 0.5f, bound_Y = 0.5f;
182
const float amount = 0.11f;
185
const float t = (zz - bound_z)/(1.0f-bound_z) * fminf(1.0, YY/bound_Y);
195
// manual gamut mapping. these values cause trouble when converting back from Lab to sRGB.
196
// deeply saturated blues turn into purple fringes, so dampen them before conversion.
197
// this is off for non-raw images, which don't seem to have this problem.
198
// might be caused by too loose clipping bounds during highlight clipping?
199
const float YY = cam[0]+cam[1]+cam[2];
200
const float zz = cam[2]/YY;
201
// lower amount and higher bound_z make the effect smaller.
202
// the effect is weakened the darker input values are, saturating at bound_Y
203
const float bound_z = 0.5f, bound_Y = 0.8f;
204
const float amount = 0.11f;
207
const float t = (zz - bound_z)/(1.0f-bound_z) * fminf(1.0, YY/bound_Y);
189
212
// now convert camera to XYZ using the color matrix
190
213
for(int j=0; j<3; j++)
277
296
if(!strcmp(p->iccprofile, "cmatrix"))
281
299
dt_image_full_path(self->dev->image->id, filename, 1024);
282
libraw_data_t *raw = libraw_init(0);
283
ret = libraw_open_file(raw, filename);
287
for(int k=0; k<4; k++) for(int i=0; i<3; i++)
289
// d->cmatrix[i][k] = raw->color.rgb_cam[i][k];
290
cmat[i][k] = raw->color.rgb_cam[i][k];
292
d->input = dt_colorspaces_create_cmatrix_profile(cmat);
300
char makermodel[1024];
301
dt_colorspaces_get_makermodel(makermodel, 1024, self->dev->image->exif_maker, self->dev->image->exif_model);
303
dt_dcraw_adobe_coeff(makermodel, "", (float (*)[12])cam_xyz);
304
d->input = dt_colorspaces_create_xyzimatrix_profile((float (*)[3])cam_xyz);
296
306
else if(!strcmp(p->iccprofile, "sRGB"))
412
421
if(strcmp(p->iccprofile, "darktable")) fprintf(stderr, "[colorin] could not find requested profile `%s'!\n", p->iccprofile);
424
void reload_defaults(dt_iop_module_t *module)
426
dt_iop_colorin_params_t tmp = (dt_iop_colorin_params_t)
428
"darktable", DT_INTENT_PERCEPTUAL
430
if(dt_image_is_ldr(module->dev->image)) g_strlcpy(tmp.iccprofile, "sRGB", sizeof(tmp.iccprofile));
431
memcpy(module->params, &tmp, sizeof(dt_iop_colorin_params_t));
432
memcpy(module->default_params, &tmp, sizeof(dt_iop_colorin_params_t));
415
435
void init(dt_iop_module_t *module)
417
437
// module->data = malloc(sizeof(dt_iop_colorin_data_t));
419
439
module->default_params = malloc(sizeof(dt_iop_colorin_params_t));
420
440
module->params_size = sizeof(dt_iop_colorin_params_t);
421
441
module->gui_data = NULL;
422
module->priority = 300;
442
module->priority = 333; // module order created by iop_dependencies.py, do not edit!
423
443
module->hide_enable_button = 1;
424
dt_iop_colorin_params_t tmp = (dt_iop_colorin_params_t)
425
{"darktable", DT_INTENT_PERCEPTUAL
427
if(dt_image_is_ldr(module->dev->image)) strcpy(tmp.iccprofile, "sRGB");
428
memcpy(module->params, &tmp, sizeof(dt_iop_colorin_params_t));
429
memcpy(module->default_params, &tmp, sizeof(dt_iop_colorin_params_t));
432
446
void cleanup(dt_iop_module_t *module)
472
486
// sRGB for ldr image input
473
487
prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t));
474
strcpy(prof->filename, "sRGB");
475
strcpy(prof->name, "sRGB");
488
g_strlcpy(prof->filename, "sRGB", sizeof(prof->filename));
489
g_strlcpy(prof->name, "sRGB", sizeof(prof->name));
476
490
g->profiles = g_list_append(g->profiles, prof);
477
491
prof->pos = ++pos;
479
493
// adobe rgb built-in
480
494
prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t));
481
strcpy(prof->filename, "adobergb");
482
strcpy(prof->name, "adobergb");
495
g_strlcpy(prof->filename, "adobergb", sizeof(prof->filename));
496
g_strlcpy(prof->name, "adobergb", sizeof(prof->name));
483
497
g->profiles = g_list_append(g->profiles, prof);
484
498
prof->pos = ++pos;
486
500
// add std RGB profile:
487
501
prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t));
488
strcpy(prof->filename, "linear_rgb");
489
strcpy(prof->name, "linear_rgb");
502
g_strlcpy(prof->filename, "linear_rgb", sizeof(prof->filename));
503
g_strlcpy(prof->name, "linear_rgb", sizeof(prof->name));
490
504
g->profiles = g_list_append(g->profiles, prof);
491
505
prof->pos = ++pos;
494
508
prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t));
495
strcpy(prof->filename, "XYZ");
496
strcpy(prof->name, "XYZ");
509
g_strlcpy(prof->filename, "XYZ", sizeof(prof->filename));
510
g_strlcpy(prof->name, "XYZ", sizeof(prof->name));
497
511
g->profiles = g_list_append(g->profiles, prof);
498
512
prof->pos = ++pos;
500
514
// infrared built-in
501
515
prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t));
502
strcpy(prof->filename, "infrared");
503
strcpy(prof->name, "infrared");
516
g_strlcpy(prof->filename, "infrared", sizeof(prof->filename));
517
g_strlcpy(prof->name, "infrared", sizeof(prof->name));
504
518
g->profiles = g_list_append(g->profiles, prof);
505
519
prof->pos = ++pos;
526
540
dt_iop_color_profile_t *prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t));
528
542
cmsGetProfileInfoASCII(tmpprof, cmsInfoDescription, getenv("LANG"), getenv("LANG")+3, name, 1024);
529
strcpy(prof->name, name);
543
g_strlcpy(prof->name, name, sizeof(prof->name));
531
strcpy(prof->filename, d_name);
545
g_strlcpy(prof->filename, d_name, sizeof(prof->filename));
532
546
cmsCloseProfile(tmpprof);
533
547
g->profiles = g_list_append(g->profiles, prof);
534
548
prof->pos = ++pos;
554
568
else if(!strcmp(prof->name, "darktable"))
555
569
gtk_combo_box_append_text(g->cbox2, _("enhanced color matrix"));
556
570
else if(!strcmp(prof->name, "sRGB"))
557
gtk_combo_box_append_text(g->cbox2, _("srgb (e.g. jpg)"));
571
gtk_combo_box_append_text(g->cbox2, _("sRGB (e.g. jpg)"));
558
572
else if(!strcmp(prof->name, "adobergb"))
559
gtk_combo_box_append_text(g->cbox2, _("adobe rgb"));
573
gtk_combo_box_append_text(g->cbox2, _("Adobe RGB"));
560
574
else if(!strcmp(prof->name, "linear_rgb"))
561
gtk_combo_box_append_text(g->cbox2, _("linear rgb"));
575
gtk_combo_box_append_text(g->cbox2, _("linear RGB"));
562
576
else if(!strcmp(prof->name, "infrared"))
563
gtk_combo_box_append_text(g->cbox2, _("linear infrared bgr"));
577
gtk_combo_box_append_text(g->cbox2, _("linear infrared BGR"));
564
578
else if(!strcmp(prof->name, "XYZ"))
565
gtk_combo_box_append_text(g->cbox2, _("linear xyz"));
579
gtk_combo_box_append_text(g->cbox2, _("linear XYZ"));
567
581
gtk_combo_box_append_text(g->cbox2, prof->name);
568
582
l = g_list_next(l);