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

Reply via email to