Author: abrander
Date: 2010-01-30 23:24:34 +0100 (Sat, 30 Jan 2010)
New Revision: 3123
Modified:
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform.c
branches/rawstudio-ng-color/plugins/colorspace-transform/rs-cmm.c
branches/rawstudio-ng-color/plugins/colorspace-transform/rs-cmm.h
Log:
Enabled RSColorspaceTransform to correct whie balance before ICC transformation.
Modified:
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform.c
===================================================================
---
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform.c
2010-01-30 21:00:38 UTC (rev 3122)
+++
branches/rawstudio-ng-color/plugins/colorspace-transform/colorspace_transform.c
2010-01-30 22:24:34 UTC (rev 3123)
@@ -100,6 +100,10 @@
if (input_space && output_space && (input_space != output_space))
{
+ gfloat premul[4] = { 1.0, 1.0, 1.0, 1.0 };
+ rs_filter_param_get_float4(RS_FILTER_PARAM(request), "premul",
premul);
+ rs_cmm_set_premul(colorspace_transform->cmm, premul);
+
output = rs_image16_copy(input, FALSE);
if (convert_colorspace16(colorspace_transform, input, output,
input_space, output_space))
Modified: branches/rawstudio-ng-color/plugins/colorspace-transform/rs-cmm.c
===================================================================
--- branches/rawstudio-ng-color/plugins/colorspace-transform/rs-cmm.c
2010-01-30 21:00:38 UTC (rev 3122)
+++ branches/rawstudio-ng-color/plugins/colorspace-transform/rs-cmm.c
2010-01-30 22:24:34 UTC (rev 3123)
@@ -32,6 +32,9 @@
gboolean dirty8;
gboolean dirty16;
+ gfloat premul[3];
+ gushort clip[3];
+
cmsHPROFILE lcms_input_profile;
cmsHPROFILE lcms_output_profile;
@@ -112,11 +115,26 @@
cmm->num_threads = MAX(1, num_threads);
}
+void
+rs_cmm_set_premul(RSCmm *cmm, const gfloat premul[3])
+{
+ g_assert(RS_IS_CMM(cmm));
+
+ cmm->premul[R] = CLAMP(premul[R], 0.0001, 100.0);
+ cmm->premul[G] = CLAMP(premul[G], 0.0001, 100.0);
+ cmm->premul[B] = CLAMP(premul[B], 0.0001, 100.0);
+
+ cmm->clip[R] = (gushort) 65535.0 / cmm->premul[R];
+ cmm->clip[G] = (gushort) 65535.0 / cmm->premul[G];
+ cmm->clip[B] = (gushort) 65535.0 / cmm->premul[B];
+}
+
gboolean
rs_cmm_transform16(RSCmm *cmm, RS_IMAGE16 *input, RS_IMAGE16 *output)
{
+ gushort *buffer;
printf("rs_cms_transform16()\n");
- gint y;
+ gint y, x;
g_assert(RS_IS_CMM(cmm));
g_assert(RS_IS_IMAGE16(input));
g_assert(RS_IS_IMAGE16(output));
@@ -128,12 +146,39 @@
if (cmm->dirty16)
prepare16(cmm);
+ buffer = g_new(gushort, input->w * 4);
for(y=0;y<input->h;y++)
{
gushort *in = GET_PIXEL(input, 0, y);
gushort *out = GET_PIXEL(output, 0, y);
- cmsDoTransform(cmm->lcms_transform16, in, out, input->w);
+ gushort *buffer_pointer = buffer;
+ for(x=0;x<input->w;x++)
+ {
+ register gfloat r = (gfloat) MIN(*in, cmm->clip[R]);
in++;
+ register gfloat g = (gfloat) MIN(*in, cmm->clip[G]);
in++;
+ register gfloat b = (gfloat) MIN(*in, cmm->clip[B]);
in++;
+ in++;
+
+ r = MIN(r, cmm->clip[R]);
+ g = MIN(g, cmm->clip[G]);
+ b = MIN(b, cmm->clip[B]);
+
+ r = r * cmm->premul[R];
+ g = g * cmm->premul[G];
+ b = b * cmm->premul[B];
+
+ r = MIN(r, 65535.0);
+ g = MIN(g, 65535.0);
+ b = MIN(b, 65535.0);
+
+ *(buffer_pointer++) = (gushort) r;
+ *(buffer_pointer++) = (gushort) g;
+ *(buffer_pointer++) = (gushort) b;
+ buffer_pointer++;
+ }
+ cmsDoTransform(cmm->lcms_transform16, buffer, out, input->w);
}
+ g_free(buffer);
return TRUE;
}
Modified: branches/rawstudio-ng-color/plugins/colorspace-transform/rs-cmm.h
===================================================================
--- branches/rawstudio-ng-color/plugins/colorspace-transform/rs-cmm.h
2010-01-30 21:00:38 UTC (rev 3122)
+++ branches/rawstudio-ng-color/plugins/colorspace-transform/rs-cmm.h
2010-01-30 22:24:34 UTC (rev 3123)
@@ -48,6 +48,8 @@
void rs_cmm_set_num_threads(RSCmm *cmm, const gint num_threads);
+void rs_cmm_set_premul(RSCmm *cmm, const gfloat premul[3]);
+
gboolean rs_cmm_transform16(RSCmm *cmm, RS_IMAGE16 *input, RS_IMAGE16 *output);
gboolean rs_cmm_transform8(RSCmm *cmm, RS_IMAGE16 *input, GdkPixbuf *output);
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit