Author: post
Date: 2011-03-06 15:29:08 +0100 (Sun, 06 Mar 2011)
New Revision: 3838

Modified:
   trunk/librawstudio/rs-filter.c
   trunk/librawstudio/rs-settings.c
   trunk/librawstudio/rs-settings.h
   trunk/plugins/dcp/dcp-sse2.c
   trunk/plugins/dcp/dcp.c
   trunk/plugins/dcp/dcp.h
   trunk/src/application.c
   trunk/src/gtk-interface.c
   trunk/src/rs-actions.c
   trunk/src/rs-batch.c
   trunk/src/rs-cache.c
   trunk/src/rs-external-editor.c
   trunk/src/rs-photo.c
   trunk/src/rs-photo.h
   trunk/src/rs-preview-widget.c
   trunk/src/rs-preview-widget.h
   trunk/src/rs-toolbox.c
Log:
Change to use Kelvin temperatures for whitebalance adjustments in Rawstudio. 
Should be backwards compatible. 

Modified: trunk/librawstudio/rs-filter.c
===================================================================
--- trunk/librawstudio/rs-filter.c      2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/librawstudio/rs-filter.c      2011-03-06 14:29:08 UTC (rev 3838)
@@ -517,6 +517,12 @@
                                        }
                                }
                } while (RS_IS_FILTER(current_filter = 
current_filter->previous));
+               if (!table)
+               {
+//                     g_warning("Property: %s could not be found in filter 
chain. Skipping further properties", property_name);
+                       va_end(ap);
+                       return;
+               }
        }
 
        va_end(ap);

Modified: trunk/librawstudio/rs-settings.c
===================================================================
--- trunk/librawstudio/rs-settings.c    2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/librawstudio/rs-settings.c    2011-03-06 14:29:08 UTC (rev 3838)
@@ -50,6 +50,8 @@
        PROP_CONTRAST,
        PROP_WARMTH,
        PROP_TINT,
+       PROP_DCP_TEMP,
+       PROP_DCP_TINT,
        PROP_WB_ASCII,
        PROP_SHARPEN,
        PROP_DENOISE_LUMA,
@@ -59,7 +61,8 @@
        PROP_VIGNETTING,
        PROP_CHANNELMIXER_RED,
        PROP_CHANNELMIXER_GREEN,
-       PROP_CHANNELMIXER_BLUE
+       PROP_CHANNELMIXER_BLUE,
+       PROP_RECALC_TEMP
 };
 
 static void
@@ -107,6 +110,18 @@
                        -2.0, 2.0, 0.0, G_PARAM_READWRITE)
        );
        g_object_class_install_property(object_class,
+               PROP_DCP_TEMP, g_param_spec_float(
+                       /* @TRANSLATORS: "Temp" is short version of 
"Temperature". You cannot use more than 5 characters for this! */
+                       "dcp-temp", _("Temp"), _("Temperature"),
+                       2300.0, 12000.0, 5000.0, G_PARAM_READWRITE)
+       );
+       g_object_class_install_property(object_class,
+               PROP_DCP_TINT, g_param_spec_float(
+                       /* @TRANSLATORS: You cannot use more than 5 characters 
for "Tint" */
+                       "dcp-tint", _("Tint"), _("Tint Shift"),
+                       -100.0, 100.0, 0.0, G_PARAM_READWRITE)
+       );
+       g_object_class_install_property(object_class,
                PROP_WB_ASCII, g_param_spec_string(
                        "wb_ascii", _("WBAscii"), _("WBAscii"),
                        NULL, G_PARAM_READWRITE)
@@ -165,6 +180,11 @@
                        "channelmixer_blue", _("Blue"), _("Blue Amount 
Adjustment"),
                        0.0, 300.0, 100.0, G_PARAM_READWRITE)
        );
+       g_object_class_install_property(object_class,
+               PROP_RECALC_TEMP, g_param_spec_boolean(
+                       "recalc-temp", "recalc-temp", "Recalculate Temperature",
+                       FALSE, G_PARAM_READWRITE)
+       );
 
        signals[SETTINGS_CHANGED] = g_signal_new ("settings-changed",
                G_TYPE_FROM_CLASS (klass),
@@ -182,6 +202,7 @@
        self->commit = 0;
        self->commit_todo = 0;
        self->curve_knots = NULL;
+       self->wb_ascii = NULL;
        rs_settings_reset(self, MASK_ALL);
 }
 
@@ -208,6 +229,8 @@
                CASE(CONTRAST, contrast);
                CASE(WARMTH, warmth);
                CASE(TINT, tint);
+               CASE(DCP_TEMP, dcp_temp);
+               CASE(DCP_TINT, dcp_tint);
        case PROP_WB_ASCII:
                g_value_set_string(value, settings->wb_ascii);
                break;
@@ -220,6 +243,9 @@
                CASE(CHANNELMIXER_RED, channelmixer_red);
                CASE(CHANNELMIXER_GREEN, channelmixer_green);
                CASE(CHANNELMIXER_BLUE, channelmixer_blue);
+       case PROP_RECALC_TEMP:
+               g_value_set_boolean(value, settings->recalc_temp);
+               break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, 
pspec);
        }
@@ -262,6 +288,22 @@
                        g_object_set(settings, "wb_ascii", NULL, NULL);
                }
                break;
+       case PROP_DCP_TEMP:
+               if (settings->dcp_temp != g_value_get_float(value))
+               {
+                       settings->dcp_temp = g_value_get_float(value);
+                       changed_mask |= MASK_WARMTH;
+                       g_object_set(settings, "wb_ascii", NULL, NULL);
+               }
+               break;
+       case PROP_DCP_TINT:
+               if (settings->dcp_tint != g_value_get_float(value))
+               {
+                       settings->dcp_tint = g_value_get_float(value);
+                       changed_mask |= MASK_TINT;
+                       g_object_set(settings, "wb_ascii", NULL, NULL);
+               }
+               break;
        case PROP_WB_ASCII:
                if (settings->wb_ascii)
                        g_free(settings->wb_ascii);
@@ -277,6 +319,11 @@
                CASE(CHANNELMIXER_RED, channelmixer_red);
                CASE(CHANNELMIXER_GREEN, channelmixer_green);
                CASE(CHANNELMIXER_BLUE, channelmixer_blue);
+               case PROP_RECALC_TEMP:
+                       settings->recalc_temp = g_value_get_boolean(value);
+                       if (settings->recalc_temp)
+                               changed_mask |= MASK_WB;
+                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, 
pspec);
        }
@@ -322,6 +369,12 @@
        if (mask & MASK_TINT)
                rs_object_class_property_reset(object, "tint");
 
+       if (mask & MASK_WARMTH)
+               rs_object_class_property_reset(object, "dcp-temp");
+
+       if (mask & MASK_TINT)
+               rs_object_class_property_reset(object, "dcp-tint");
+
        if (mask & MASK_SHARPEN)
                rs_object_class_property_reset(object, "sharpen");
 
@@ -443,6 +496,8 @@
        SETTINGS_COPY(CONTRAST, contrast);
        SETTINGS_COPY(WARMTH, warmth);
        SETTINGS_COPY(TINT, tint);
+       SETTINGS_COPY(DCP_TEMP, dcp_temp);
+       SETTINGS_COPY(DCP_TINT, dcp_tint);
        SETTINGS_COPY(SHARPEN, sharpen);
        SETTINGS_COPY(DENOISE_LUMA, denoise_luma);
        SETTINGS_COPY(DENOISE_CHROMA, denoise_chroma);
@@ -513,7 +568,7 @@
        g_assert(RS_IS_SETTINGS(settings));
 
        rs_settings_commit_start(settings);
-       g_object_set(settings, "warmth", warmth, "tint", tint, "wb_ascii", 
ascii, NULL);
+       g_object_set(settings, "warmth", warmth, "tint", tint, "wb_ascii", 
ascii, "recalc-temp", TRUE, NULL);
        rs_settings_commit_stop(settings);
 }
 

Modified: trunk/librawstudio/rs-settings.h
===================================================================
--- trunk/librawstudio/rs-settings.h    2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/librawstudio/rs-settings.h    2011-03-06 14:29:08 UTC (rev 3838)
@@ -43,7 +43,9 @@
        MASK_CONTRAST       = (1<<3),
        MASK_WARMTH         = (1<<4),
        MASK_TINT           = (1<<5),
-       MASK_WB             = MASK_WARMTH | MASK_TINT,
+       MASK_DCP_TEMP       = (1<<4),
+       MASK_DCP_TINT       = (1<<5),
+       MASK_WB             = MASK_WARMTH | MASK_TINT | MASK_DCP_TEMP | 
MASK_DCP_TINT,
        MASK_CURVE          = (1<<6),
        MASK_SHARPEN        = (1<<7),
        MASK_DENOISE_LUMA   = (1<<8),
@@ -70,6 +72,8 @@
        gfloat contrast;
        gfloat warmth;
        gfloat tint;
+       gfloat dcp_temp;
+       gfloat dcp_tint;
        gchar *wb_ascii;
        gfloat sharpen;
        gfloat denoise_luma;
@@ -82,6 +86,7 @@
        gfloat channelmixer_blue;
        gint curve_nknots;
        gfloat *curve_knots;
+       gboolean recalc_temp;
 } RSSettings;
 
 typedef struct {

Modified: trunk/plugins/dcp/dcp-sse2.c
===================================================================
--- trunk/plugins/dcp/dcp-sse2.c        2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/plugins/dcp/dcp-sse2.c        2011-03-06 14:29:08 UTC (rev 3838)
@@ -624,18 +624,7 @@
                _min_cam[2] = dcp->camera_white.z;
                _min_cam[3] = 0.0;
        }
-       else if (!t->dcp->is_premultiplied)
-       {
-               _min_cam[0] = 1.0 / MAX(dcp->pre_mul.R, 0.1);
-               _min_cam[1] = 1.0 / MAX(dcp->pre_mul.G, 0.1);
-               _min_cam[2] = 1.0 / MAX(dcp->pre_mul.B, 0.1);
-               _min_cam[3] = 0.0;
 
-               _cm_r[0] = _cm_r[1] = _cm_r[2] = _cm_r[3] *= dcp->pre_mul.R;
-               _cm_g[0] = _cm_g[1] = _cm_g[2] = _cm_g[3] *= dcp->pre_mul.G;
-               _cm_b[0] = _cm_b[1] = _cm_b[2] = _cm_b[3] *= dcp->pre_mul.B;
-       }
-
        float cam_prof[4*4*3] __attribute__ ((aligned (16)));
        for (x = 0; x < 4; x++ ) {
                cam_prof[x] = dcp->camera_to_prophoto.coeff[0][0] * 
dcp->channelmixer_red;
@@ -689,37 +678,22 @@
                                p2f = _mm_min_ps(p2f, min_cam);
                                p3f = _mm_min_ps(p3f, min_cam);
                                p4f = _mm_min_ps(p4f, min_cam);
+                       }
 
-                               /* Convert to planar */
-                               __m128 g1g0r1r0 = _mm_unpacklo_ps(p1f, p2f);
-                               __m128 b1b0 = _mm_unpackhi_ps(p1f, p2f);
-                               __m128 g3g2r3r2 = _mm_unpacklo_ps(p3f, p4f);
-                               __m128 b3b2 = _mm_unpackhi_ps(p3f, p4f);
-                               r = _mm_movelh_ps(g1g0r1r0, g3g2r3r2);
-                               g = _mm_movehl_ps(g3g2r3r2, g1g0r1r0);
-                               b = _mm_movelh_ps(b1b0, b3b2);
+                       /* Convert to planar */
+                       __m128 g1g0r1r0 = _mm_unpacklo_ps(p1f, p2f);
+                       __m128 b1b0 = _mm_unpackhi_ps(p1f, p2f);
+                       __m128 g3g2r3r2 = _mm_unpacklo_ps(p3f, p4f);
+                       __m128 b3b2 = _mm_unpackhi_ps(p3f, p4f);
+                       r = _mm_movelh_ps(g1g0r1r0, g3g2r3r2);
+                       g = _mm_movehl_ps(g3g2r3r2, g1g0r1r0);
+                       b = _mm_movelh_ps(b1b0, b3b2);
 
-                               /* Convert to Prophoto */
-                               r2 = sse_matrix3_mul(cam_prof, r, g, b);
-                               g2 = sse_matrix3_mul(&cam_prof[12], r, g, b);
-                               b2 = sse_matrix3_mul(&cam_prof[24], r, g, b);
-                       } else
-                       {
-                               /* Convert to planar */
-                               __m128 g1g0r1r0 = _mm_unpacklo_ps(p1f, p2f);
-                               __m128 b1b0 = _mm_unpackhi_ps(p1f, p2f);
-                               __m128 g3g2r3r2 = _mm_unpacklo_ps(p3f, p4f);
-                               __m128 b3b2 = _mm_unpackhi_ps(p3f, p4f);
-                               r = _mm_movelh_ps(g1g0r1r0, g3g2r3r2);
-                               g = _mm_movehl_ps(g3g2r3r2, g1g0r1r0);
-                               b = _mm_movelh_ps(b1b0, b3b2);
+                       /* Convert to Prophoto */
+                       r2 = sse_matrix3_mul(cam_prof, r, g, b);
+                       g2 = sse_matrix3_mul(&cam_prof[12], r, g, b);
+                       b2 = sse_matrix3_mul(&cam_prof[24], r, g, b);
 
-                               /* Multiply channel mixer */
-                               r2 = _mm_mul_ps(_mm_load_ps(_cm_r), r);
-                               g2 = _mm_mul_ps(_mm_load_ps(_cm_g), g);
-                               b2 = _mm_mul_ps(_mm_load_ps(_cm_b), b);
-                       }
-                       
                        RGBtoHSV_SSE2(&r2, &g2, &b2);
                        h = r2; s = g2; v = b2;
 

Modified: trunk/plugins/dcp/dcp.c
===================================================================
--- trunk/plugins/dcp/dcp.c     2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/plugins/dcp/dcp.c     2011-03-06 14:29:08 UTC (rev 3838)
@@ -49,6 +49,8 @@
 static void render(ThreadInfo* t);
 static void read_profile(RSDcp *dcp, RSDcpFile *dcp_file);
 static void free_dcp_profile(RSDcp *dcp);
+static void set_prophoto_wb(RSDcp *dcp, gfloat warmth, gfloat tint);
+static void calculate_huesat_maps(RSDcp *dcp, gfloat temp);
 
 G_MODULE_EXPORT void
 rs_plugin_load(RSPlugin *plugin)
@@ -164,31 +166,53 @@
 
        if (mask & MASK_WB)
        {
-               const gfloat warmth;
-               gfloat tint;
+               dcp->warmth = -1.0;
+               dcp->tint = -1.0;
+               gfloat premul_warmth = -1.0;
+               gfloat pre_mul_tint = -1.0;
+               gboolean recalc = FALSE;
 
                g_object_get(settings,
-                       "warmth", &warmth,
-                       "tint", &tint,
+                       "dcp-temp", &dcp->warmth,
+                       "dcp-tint", &dcp->tint,
+                       "warmth", &premul_warmth,
+                       "tint", &pre_mul_tint,
+                       "recalc-temp", &recalc,
                        NULL);
 
                RS_xy_COORD whitepoint;
-               /* This is messy, but we're essentially converting from 
warmth/tint to cameraneutral */
-        dcp->pre_mul.x = (1.0+warmth)*(2.0-tint);
-        dcp->pre_mul.y = 1.0;
-        dcp->pre_mul.z = (1.0-warmth)*(2.0-tint);
-               RS_VECTOR3 neutral;
-               neutral.x = 1.0 / CLAMP(dcp->pre_mul.x, 0.001, 100.00);
-               neutral.y = 1.0 / CLAMP(dcp->pre_mul.y, 0.001, 100.00);
-               neutral.z = 1.0 / CLAMP(dcp->pre_mul.z, 0.001, 100.00);
-               gfloat max = vector3_max(&neutral);
-               neutral.x = neutral.x / max;
-               neutral.y = neutral.y / max;
-               neutral.z = neutral.z / max;
-               whitepoint = neutral_to_xy(dcp, &neutral);
-
-               set_white_xy(dcp, &whitepoint);
-               precalc(dcp);
+               if (recalc)
+               {
+                       RS_VECTOR3 neutral;
+                       /* This is messy, but we're essentially converting from 
warmth/tint to cameraneutral */
+                       dcp->pre_mul.x = (1.0+premul_warmth)*(2.0-pre_mul_tint);
+                       dcp->pre_mul.y = 1.0;
+                       dcp->pre_mul.z = (1.0-premul_warmth)*(2.0-pre_mul_tint);
+                       neutral.x = 1.0 / CLAMP(dcp->pre_mul.x, 0.001, 100.00);
+                       neutral.y = 1.0 / CLAMP(dcp->pre_mul.y, 0.001, 100.00);
+                       neutral.z = 1.0 / CLAMP(dcp->pre_mul.z, 0.001, 100.00);
+                       gfloat max = vector3_max(&neutral);
+                       neutral.x = neutral.x / max;
+                       neutral.y = neutral.y / max;
+                       neutral.z = neutral.z / max;
+                       whitepoint = neutral_to_xy(dcp, &neutral);
+                       rs_color_whitepoint_to_temp(&whitepoint, &dcp->warmth, 
&dcp->tint);
+                       g_object_set(settings,
+                               "dcp-temp", dcp->warmth,
+                               "dcp-tint", dcp->tint,
+                               "recalc-temp", FALSE,
+                               NULL);
+               }
+               if (dcp->use_profile)
+               {
+                       whitepoint = rs_color_temp_to_whitepoint(dcp->warmth, 
dcp->tint);
+                       set_white_xy(dcp, &whitepoint);
+                       precalc(dcp);
+               }
+               else
+               {
+                       set_prophoto_wb(dcp, dcp->warmth, dcp->tint);
+               }
                changed = TRUE;
        }
 
@@ -370,6 +394,11 @@
                case PROP_SETTINGS:
                        if (dcp->settings && dcp->settings_signal_id)
                        {
+                               if (dcp->settings == g_value_get_object(value))
+                               {
+                                       settings_changed(dcp->settings, 
MASK_ALL, dcp);
+                                       break;
+                               }
                                g_signal_handler_disconnect(dcp->settings, 
dcp->settings_signal_id);
                                g_object_weak_unref(G_OBJECT(dcp->settings), 
settings_weak_notify, dcp);
                        }
@@ -475,16 +504,9 @@
 
        RSFilterRequest *request_clone = rs_filter_request_clone(request);
 
-       /* If we don't apply the DCP profile, we provide premultipliers to an
-          earlier filter (RSColorspaceTransform) for white balancing before ICC
-          transform */
        if (!dcp->use_profile)
        {
                gfloat premul[4] = {1.0, 1.0, 1.0, 1.0};
-               premul[0] = dcp->pre_mul.x;
-               premul[1] = dcp->pre_mul.y;
-               premul[2] = dcp->pre_mul.z;
-
                rs_filter_param_set_float4(RS_FILTER_PARAM(request_clone), 
"premul", premul);
        }
 
@@ -503,9 +525,6 @@
        rs_filter_param_set_object(RS_FILTER_PARAM(response), "colorspace", 
klass->prophoto);
        g_object_unref(previous_response);
 
-       dcp->is_premultiplied = FALSE;
-       rs_filter_param_get_boolean(RS_FILTER_PARAM(response), 
"is-premultiplied", &dcp->is_premultiplied);
-
        if ((roi = rs_filter_request_get_roi(request)))
        {
                /* Align so we start at even pixel counts */
@@ -1010,12 +1029,6 @@
                clip.G = dcp->camera_white.G;
                clip.B = dcp->camera_white.B;
        }
-       else if (!t->dcp->is_premultiplied)
-       {
-               clip.R = 1.0 / MAX(dcp->pre_mul.R, 0.1);
-               clip.G = 1.0 / MAX(dcp->pre_mul.G, 0.1);
-               clip.B = 1.0 / MAX(dcp->pre_mul.B, 0.1);
-       }
 
        for(y = t->start_y ; y < t->end_y; y++)
        {
@@ -1033,27 +1046,17 @@
                                r = MIN(clip.R, r);
                                g = MIN(clip.G, g);
                                b = MIN(clip.B, b);
+                       }
 
-                               pix.R = r;
-                               pix.G = g;
-                               pix.B = b;
-                               pix = vector3_multiply_matrix(&pix, 
&dcp->camera_to_prophoto);
+                       pix.R = r;
+                       pix.G = g;
+                       pix.B = b;
+                       pix = vector3_multiply_matrix(&pix, 
&dcp->camera_to_prophoto);
                                
-                               r = pix.R;
-                               g = pix.G;
-                               b = pix.B;
-                       }
-                       else if (!t->dcp->is_premultiplied)
-                       {
-                               r = MIN(clip.R, r);
-                               g = MIN(clip.G, g);
-                               b = MIN(clip.B, b);
+                       r = pix.R;
+                       g = pix.G;
+                       b = pix.B;
 
-                               r *= dcp->pre_mul.R;
-                               g *= dcp->pre_mul.G;
-                               b *= dcp->pre_mul.B;
-                       }
-
                        r = CLAMP(r * dcp->channelmixer_red, 0.0, 1.0);
                        g = CLAMP(g * dcp->channelmixer_green, 0.0, 1.0);
                        b = CLAMP(b * dcp->channelmixer_blue, 0.0, 1.0);
@@ -1161,10 +1164,25 @@
 #undef _F
 #undef _S
 
+const static RS_MATRIX3 xyz_to_prophoto = {{
+       {  1.3459433, -0.2556075, -0.0511118 },
+       { -0.5445989,  1.5081673,  0.0205351 },
+       {  0.0000000,  0.0000000,  1.2118128 }
+}};
+const static RS_MATRIX3 prophoto_to_xyz = {{
+       { 0.7976749,  0.1351917,  0.0313534},
+       { 0.2880402,  0.7118741,  0.0000857},
+       { 0.0000000,  0.0000000,  0.8252100}
+}};
+
 /* dng_color_spec::FindXYZtoCamera */
 static RS_MATRIX3
 find_xyz_to_camera(RSDcp *dcp, const RS_xy_COORD *white_xy, RS_MATRIX3 
*forward_matrix)
 {
+       if (!dcp->use_profile)
+       {
+               return xyz_to_prophoto;
+       }
        gfloat temp = 5000.0;
 
        rs_color_whitepoint_to_temp(white_xy, &temp, NULL);
@@ -1199,7 +1217,25 @@
                else if (dcp->has_forward_matrix2)
                        *forward_matrix = dcp->forward_matrix2;
        }
-       
+       calculate_huesat_maps(dcp, temp);
+       return color_matrix;
+}
+
+static void
+calculate_huesat_maps(RSDcp *dcp, gfloat temp)
+{
+       gfloat alpha = 0.0;
+
+       if (temp <=  dcp->temp1)
+               alpha = 1.0;
+       else if (temp >=  dcp->temp2)
+               alpha = 0.0;
+       else if ((dcp->temp2 > 0.0) && (dcp->temp1 > 0.0) && (temp > 0.0))
+       {
+               gdouble invT = 1.0 / temp;
+               alpha = (invT - (1.0 / dcp->temp2)) / ((1.0 / dcp->temp1) - 
(1.0 / dcp->temp2));
+       }
+
        dcp->huesatmap = 0;
        if (dcp->huesatmap1 != NULL &&  dcp->huesatmap2 != NULL) 
        {
@@ -1246,7 +1282,6 @@
                else
                        dcp->huesatmap = dcp->huesatmap2;
        }
-       return color_matrix;
 }
 
 /* Verified to behave like dng_camera_profile::NormalizeForwardMatrix */
@@ -1265,6 +1300,20 @@
        matrix3_multiply(&tmp, matrix, matrix);
 }
 
+static void
+set_prophoto_wb(RSDcp *dcp, gfloat warmth, gfloat tint) 
+{
+       RS_xy_COORD prophoto_white;
+       prophoto_white.x = 0.3457;
+       prophoto_white.y = 0.3585;
+       RS_xy_COORD dest_xy = rs_color_temp_to_whitepoint(warmth, tint);
+       RS_MATRIX3 map = rs_calculate_map_white_matrix(&dest_xy, 
&prophoto_white);
+
+       RS_MATRIX3 pcs_to_camera;
+       matrix3_multiply(&prophoto_to_xyz, &map, &pcs_to_camera);
+       matrix3_multiply(&pcs_to_camera, &xyz_to_prophoto, 
&dcp->camera_to_prophoto);
+}
+
 /* dng_color_spec::SetWhiteXY */
 static void
 set_white_xy(RSDcp *dcp, const RS_xy_COORD *xy)
@@ -1318,7 +1367,8 @@
        }};
 
        /* Camera to ProPhoto */
-       matrix3_multiply(&xyz_to_prophoto, &dcp->camera_to_pcs, 
&dcp->camera_to_prophoto); /* verified by SDK */
+       if (dcp->use_profile)
+               matrix3_multiply(&xyz_to_prophoto, &dcp->camera_to_pcs, 
&dcp->camera_to_prophoto); /* verified by SDK */
        if (dcp->huesatmap)
                calc_hsm_constants(dcp->huesatmap, dcp->huesatmap_precalc); 
        if (dcp->looktable)

Modified: trunk/plugins/dcp/dcp.h
===================================================================
--- trunk/plugins/dcp/dcp.h     2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/plugins/dcp/dcp.h     2011-03-06 14:29:08 UTC (rev 3838)
@@ -56,9 +56,9 @@
        gfloat channelmixer_red;
        gfloat channelmixer_green;
        gfloat channelmixer_blue;
+       gfloat warmth, tint;
 
        RS_VECTOR3 pre_mul;
-       gboolean is_premultiplied;
        RS_xy_COORD white_xy;
 
        gint nknots;

Modified: trunk/src/application.c
===================================================================
--- trunk/src/application.c     2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/application.c     2011-03-06 14:29:08 UTC (rev 3838)
@@ -77,43 +77,14 @@
                g_object_unref(rs->photo);
        rs->photo = NULL;
 
-       /* Set photo in preview-widget */
-       rs_preview_widget_set_photo(RS_PREVIEW_WIDGET(rs->preview), photo);
-
        /* Save photo in blob */
        rs->photo = photo;
 
        if (rs->photo)
        {
-               /* Look up lens */
-               RSMetadata *meta = rs_photo_get_metadata(rs->photo);
-               RSLensDb *lens_db = rs_lens_db_get_default();
-               RSLens *lens = rs_lens_db_lookup_from_metadata(lens_db, meta);
-
-               /* Apply lens information to RSLensfun */
-               if (lens)
-               {
-                       rs_filter_set_recursive(rs->filter_end,
-                               "make", meta->make_ascii,
-                               "model", meta->model_ascii,
-                               "lens", lens,
-                               "focal", (gfloat) meta->focallength,
-                               "aperture", meta->aperture,
-                               "tca_kr", 
rs->photo->settings[rs->current_setting]->tca_kr,
-                               "tca_kb", 
rs->photo->settings[rs->current_setting]->tca_kb,
-                               "vignetting", 
rs->photo->settings[rs->current_setting]->vignetting,
-                               NULL);
-                       g_object_unref(lens);
-               }
-
-               g_object_unref(meta);
-
                rs_filter_set_recursive(rs->filter_end,
                        "image", rs->photo->input_response,
                        "filename", rs->photo->filename,
-                       "rectangle", rs_photo_get_crop(photo),
-                       "angle", rs_photo_get_angle(photo),
-                       "orientation", rs->photo->orientation,
                        NULL);
 
                g_signal_connect(G_OBJECT(rs->photo), "spatial-changed", 
G_CALLBACK(photo_spatial_changed), rs);
@@ -182,16 +153,10 @@
        if (0 < width && 0 < height) /* We only wan't to set width and height 
if they are not -1 */
                rs_filter_set_recursive(fend, "width", width, "height", height, 
NULL);
 
-       /* Set dcp profile */
-       RSDcpFile *dcp_profile  = rs_photo_get_dcp_profile(photo);
-       if (dcp_profile != NULL)
-               g_object_set(fdcp, "profile", dcp_profile, "use-profile", TRUE, 
NULL);
-       else
-               g_object_set(fdcp, "use-profile", FALSE, NULL);
+       GList *filters = g_list_append(NULL, fend);
+       rs_photo_apply_to_filters(photo, filters, snapshot);
+       g_list_free(filters);
 
-       /* Set image settings */
-       rs_filter_set_recursive(fend, "settings", photo->settings[snapshot], 
NULL);
-
        /* actually save */
        gboolean exported = rs_output_execute(output, fend);
 
@@ -231,16 +196,10 @@
        if (0 < width && 0 < height) /* We only wan't to set width and height 
if they are not -1 */
                rs_filter_set_recursive(fend, "width", width, "height", height, 
NULL);
 
-       /* Set dcp profile */
-       RSDcpFile *dcp_profile  = rs_photo_get_dcp_profile(photo);
-       if (dcp_profile != NULL)
-               g_object_set(fdcp, "profile", dcp_profile, "use-profile", TRUE, 
NULL);
-       else
-               g_object_set(fdcp, "use-profile", FALSE, NULL);
+       GList *filters = g_list_append(NULL, fend);
+       rs_photo_apply_to_filters(photo, filters, snapshot);
+       g_list_free(filters);
 
-       /* Set image settings */
-       rs_filter_set_recursive(fend, "settings", photo->settings[snapshot], 
NULL);
-
        RSFilterResponse *response;
        RSFilterRequest *request = rs_filter_request_new();
        rs_filter_request_set_quick(RS_FILTER_REQUEST(request), FALSE);

Modified: trunk/src/gtk-interface.c
===================================================================
--- trunk/src/gtk-interface.c   2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/gtk-interface.c   2011-03-06 14:29:08 UTC (rev 3838)
@@ -186,22 +186,25 @@
        }
 
        set_photo_info_label(photo);
+
        rs_set_photo(rs, photo);
-       rs_toolbox_set_photo(RS_TOOLBOX(rs->tools), photo);
-       GTK_CATCHUP();
-       gui_set_busy(FALSE);
-       if (NULL==rs->photo->crop && rs->photo->proposed_crop)
-               rs_photo_set_crop(rs->photo, rs->photo->proposed_crop);
 
        /* We need check if we should calculate and set auto wb here because 
the photo needs to be loaded for filterchain to work */
        gint i;
        g_object_ref(rs->filter_demosaic_cache);
        rs->photo->auto_wb_filter = rs->filter_demosaic_cache;
        for (i=0;i<3;i++)
+       {
                if (photo && photo->settings[i] && photo->settings[i]->wb_ascii 
&& g_strcmp0(photo->settings[i]->wb_ascii, PRESET_WB_AUTO) == 0)
                        rs_photo_set_wb_auto(rs->photo, i);
-
+       }
+       /* Set photo in preview-widget */
+       rs_preview_widget_set_photo(RS_PREVIEW_WIDGET(rs->preview), photo);
+       rs_toolbox_set_photo(RS_TOOLBOX(rs->tools), photo);
+       if (NULL==rs->photo->crop && rs->photo->proposed_crop)
+               rs_photo_set_crop(rs->photo, rs->photo->proposed_crop);
        rs_core_actions_update_menu_items(rs);
+       gui_set_busy(FALSE);
        return TRUE;
 }
 

Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c      2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-actions.c      2011-03-06 14:29:08 UTC (rev 3838)
@@ -756,12 +756,14 @@
 {
        if (RS_IS_PHOTO(rs->photo) && rs_store_is_photo_selected(rs->store, 
rs->photo->filename))
        {
-               if (rs->photo->metadata->cam_mul[R] == -1.0)
+               if (rs->photo && !rs->photo->dcp)
+                       rs_photo_set_wb_from_camera(rs->photo, 
rs->current_setting);
+               else if (rs->photo && rs->photo->metadata && 
rs->photo->metadata->cam_mul[R] == -1.0)
                        gui_status_notify(_("No white balance to set from"));
                else
                {
                        gui_status_notify(_("Adjusting to camera white 
balance"));
-                       rs_photo_set_wb_from_mul(rs->photo, 
rs->current_setting, rs->photo->metadata->cam_mul, PRESET_WB_CAMERA);
+                       rs_photo_set_wb_from_camera(rs->photo, 
rs->current_setting);
                }
        }
 
@@ -1232,17 +1234,12 @@
                GTK_RESPONSE_ACCEPT,
                NULL);
 
-       GtkFileFilter *filter_icc = gtk_file_filter_new();
        GtkFileFilter *filter_all = gtk_file_filter_new();
 
        GtkFileFilter *filter_profiles = gtk_file_filter_new();
        gtk_file_filter_set_name(filter_profiles, _("All Profiles"));
        gtk_file_filter_add_pattern(filter_profiles, "*.dcp");
        gtk_file_filter_add_pattern(filter_profiles, "*.DCP");
-       gtk_file_filter_add_pattern(filter_profiles, "*.icc");
-       gtk_file_filter_add_pattern(filter_profiles, "*.ICC");
-       gtk_file_filter_add_pattern(filter_profiles, "*.icm");
-       gtk_file_filter_add_pattern(filter_profiles, "*.ICM");
        gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_profiles);
 
        GtkFileFilter *filter_dcp = gtk_file_filter_new();
@@ -1251,13 +1248,6 @@
        gtk_file_filter_add_pattern(filter_dcp, "*.DCP");
        gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_dcp);
 
-       gtk_file_filter_set_name(filter_icc, _("Color Profiles (ICC and ICM)"));
-       gtk_file_filter_add_pattern(filter_icc, "*.icc");
-       gtk_file_filter_add_pattern(filter_icc, "*.ICC");
-       gtk_file_filter_add_pattern(filter_icc, "*.icm");
-       gtk_file_filter_add_pattern(filter_icc, "*.ICM");
-       gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_icc);
-
        gtk_file_filter_set_name(filter_all, _("All files"));
        gtk_file_filter_add_pattern(filter_all, "*");
        gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog), filter_all);

Modified: trunk/src/rs-batch.c
===================================================================
--- trunk/src/rs-batch.c        2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-batch.c        2011-03-06 14:29:08 UTC (rev 3838)
@@ -543,58 +543,18 @@
                                        break;
                                }
 
-                       /* Set input profile */
-                       RSDcpFile *dcp_profile  = 
rs_photo_get_dcp_profile(photo);
-                       RSIccProfile *icc_profile  = 
rs_photo_get_icc_profile(photo);
+                       GList *filters = g_list_append(NULL, fend);
+                       rs_photo_apply_to_filters(photo, filters, setting_id);
+                       g_list_free(filters);
 
-                       if (dcp_profile != NULL)
-                       {
-                               g_object_set(fdcp,  "use-profile", TRUE, 
"profile", dcp_profile, NULL);
-                       }
-                       else if (icc_profile != NULL)
-                       {
-                               RSColorSpace *icc_space = 
rs_color_space_icc_new_from_icc(icc_profile);
-                               g_object_set(finput, "color-space", icc_space, 
NULL);
-                               g_object_set(fdcp, "use-profile", FALSE, NULL);
-                       }
-                       else if (icc_profile == NULL)
-                       {
-                               g_object_set(fdcp, "use-profile", FALSE, NULL);
-                       }
-
                        rs_filter_set_recursive(fend,
                                "image", photo->input_response,
                                "filename", photo->filename,
-                               "settings", photo->settings[setting_id],
-                               "angle", photo->angle,
-                               "orientation", photo->orientation,
-                               "rectangle", photo->crop,
                                "bounding-box", TRUE,
                                "width", 250,
                                "height", 250,
                                NULL);
 
-                       /* Look up lens */
-                       RSMetadata *meta = rs_photo_get_metadata(photo);
-                       RSLensDb *lens_db = rs_lens_db_get_default();
-                       RSLens *lens = rs_lens_db_lookup_from_metadata(lens_db, 
meta);
-
-                       /* Apply lens information to RSLensfun */
-                       if (lens)
-                       {
-                               rs_filter_set_recursive(fend,
-                                                       "make", 
meta->make_ascii,
-                                                       "model", 
meta->model_ascii,
-                                                       "lens", lens,
-                                                       "focal", (gfloat) 
meta->focallength,
-                                                       "aperture", 
meta->aperture,
-                                                       "tca_kr", 
photo->settings[setting_id]->tca_kr,
-                                                       "tca_kb", 
photo->settings[setting_id]->tca_kb,
-                                                       "vignetting", 
photo->settings[setting_id]->vignetting,
-                                                       NULL);
-                               g_object_unref(lens);
-                       }
-
                        /* Render preview image */
                        RSFilterRequest *request = rs_filter_request_new();
                        rs_filter_request_set_quick(RS_FILTER_REQUEST(request), 
FALSE);

Modified: trunk/src/rs-cache.c
===================================================================
--- trunk/src/rs-cache.c        2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-cache.c        2011-03-06 14:29:08 UTC (rev 3838)
@@ -26,7 +26,7 @@
 #include "rs-photo.h"
 
 /* This will be written to XML files for making backward compatibility easier 
to implement */
-#define CACHEVERSION 4
+#define CACHEVERSION 5
 
 gchar *
 rs_cache_get_name(const gchar *src)
@@ -114,9 +114,9 @@
        if (mask & MASK_CONTRAST)
                xmlTextWriterWriteFormatElement(writer, BAD_CAST "contrast", 
"%f", rss->contrast);
        if (mask & MASK_WARMTH)
-               xmlTextWriterWriteFormatElement(writer, BAD_CAST "warmth", 
"%f", rss->warmth);
+               xmlTextWriterWriteFormatElement(writer, BAD_CAST "warmth", 
"%f", rss->dcp_temp);
        if (mask & MASK_TINT)
-               xmlTextWriterWriteFormatElement(writer, BAD_CAST "tint", "%f", 
rss->tint);
+               xmlTextWriterWriteFormatElement(writer, BAD_CAST "tint", "%f", 
rss->dcp_tint);
        if (mask & MASK_WB && rss->wb_ascii)
                xmlTextWriterWriteFormatElement(writer, BAD_CAST "wb_ascii", 
"%s", rss->wb_ascii);
        if (mask & MASK_SHARPEN)
@@ -182,13 +182,31 @@
                }
                else if ((!xmlStrcmp(cur->name, BAD_CAST "warmth")))
                {
-                       mask |= MASK_WARMTH;
-                       target = &rss->warmth;
+                       if ( version <= 4)
+                       {
+                               mask |= MASK_WARMTH;
+                               target = &rss->warmth;
+                               rss->recalc_temp = TRUE;
+                       }
+                       else
+                       {
+                               mask |= MASK_WARMTH;
+                               target = &rss->dcp_temp;
+                       }
                }
                else if ((!xmlStrcmp(cur->name, BAD_CAST "tint")))
                {
-                       mask |= MASK_TINT;
-                       target = &rss->tint;
+                       if ( version <= 4)
+                       {
+                               mask |= MASK_TINT;
+                               target = &rss->tint;
+                               rss->recalc_temp = TRUE;
+                       }
+                       else
+                       {
+                               mask |= MASK_TINT;
+                               target = &rss->dcp_tint;
+                       }
                }
                else if ((!xmlStrcmp(cur->name, BAD_CAST "wb_ascii")))
                {

Modified: trunk/src/rs-external-editor.c
===================================================================
--- trunk/src/rs-external-editor.c      2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-external-editor.c      2011-03-06 14:29:08 UTC (rev 3838)
@@ -96,17 +96,11 @@
         RSFilter *ftransform_display = rs_filter_new("RSColorspaceTransform", 
fdenoise);
         RSFilter *fend = ftransform_display;
 
-       /* Set DCP profile - we do NOT set ICC profiles, since this will 
already be set further up the chain */
-       RSDcpFile *dcp_profile  = rs_photo_get_dcp_profile(photo);
+                       GList *filters = g_list_append(NULL, fend);
+                       rs_photo_apply_to_filters(photo, filters, snapshot);
+                       g_list_free(filters);
 
-       if (dcp_profile != NULL)
-               g_object_set(fdcp, "profile", dcp_profile, "use-profile", TRUE, 
NULL);
-       else
-               g_object_set(fdcp, "use-profile", FALSE, NULL);
 
-       rs_filter_set_recursive(fdenoise, "settings", 
photo->settings[snapshot], NULL);
-
-
        output = rs_output_new("RSTifffile");
        g_object_set(output, "filename", filename->str, NULL);
        rs_output_execute(output, fend);

Modified: trunk/src/rs-photo.c
===================================================================
--- trunk/src/rs-photo.c        2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-photo.c        2011-03-06 14:29:08 UTC (rev 3838)
@@ -380,6 +380,68 @@
 }
 
 /**
+ * Apply photo settings to a list of filters from an RSSettings
+ * @param photo A RS_PHOTO
+ * @param filters Which filters to apply the settings to
+ * @param snapshot Which snapshot to affect
+ * @param mask A mask for defining which settings to apply
+ */
+void 
+rs_photo_apply_to_filters(RS_PHOTO *photo, GList *filters, const gint snapshot)
+{
+       g_assert(RS_IS_PHOTO(photo));
+       if (!filters)
+               return;
+
+       gint nfilters = g_list_length(filters);
+       gint i= 0;
+
+       for (i = 0; i < nfilters; i++)
+       {
+               RSFilter *filter = RS_FILTER(g_list_nth_data(filters, i));
+               /* Set input profile */
+               RSDcpFile *dcp_profile  = rs_photo_get_dcp_profile(photo);
+
+               if (dcp_profile != NULL)
+                       rs_filter_set_recursive(filter, "profile", dcp_profile, 
NULL);
+               else
+                       rs_filter_set_recursive(filter, "use-profile", FALSE, 
NULL);
+
+               if (g_strcmp0(photo->settings[snapshot]->wb_ascii, 
PRESET_WB_CAMERA) == 0)
+                       rs_photo_set_wb_from_camera(photo, snapshot);
+
+               rs_filter_set_recursive(filter,
+                       "settings", photo->settings[snapshot],
+                       "rectangle", rs_photo_get_crop(photo),
+                       "angle", rs_photo_get_angle(photo),
+                       "orientation", photo->orientation,
+                       NULL);
+
+               /* Look up lens */
+               RSMetadata *meta = rs_photo_get_metadata(photo);
+               RSLensDb *lens_db = rs_lens_db_get_default();
+               RSLens *lens = rs_lens_db_lookup_from_metadata(lens_db, meta);
+
+               /* Apply lens information to RSLensfun */
+               if (lens)
+               {
+                       rs_filter_set_recursive(filter,
+                               "make", meta->make_ascii,
+                               "model", meta->model_ascii,
+                               "lens", lens,
+                               "focal", (gfloat) meta->focallength,
+                               "aperture", meta->aperture,
+                               "tca_kr", photo->settings[snapshot]->tca_kr,
+                               "tca_kb", photo->settings[snapshot]->tca_kb,
+                               "vignetting", 
photo->settings[snapshot]->vignetting,
+                               NULL);
+                       g_object_unref(lens);
+               }
+       }
+}
+
+
+/**
  * Flips a RS_PHOTO
  * @param photo A RS_PHOTO
  */
@@ -660,8 +722,14 @@
 
        if (!((snapshot>=0) && (snapshot<=2))) return FALSE;
 
-       if (photo->metadata->cam_mul[R] != -1.0)
+       if (!photo->dcp)
        {
+               rs_settings_commit_start(photo->settings[snapshot]);
+               g_object_set(photo->settings[snapshot], "dcp-temp", 5000.0, 
"dcp-tint", 0.0, "wb_ascii", PRESET_WB_CAMERA, "recalc_temp", FALSE, NULL);
+               rs_settings_commit_stop(photo->settings[snapshot]);
+       }
+       else if (photo->metadata->cam_mul[R] != -1.0)
+       {
                rs_photo_set_wb_from_mul(photo, snapshot, 
photo->metadata->cam_mul, PRESET_WB_CAMERA);
                ret = TRUE;
        }
@@ -724,8 +792,7 @@
                {
                        /* White balance */
                        if (!(mask & MASK_WB))
-                               if (!rs_photo_set_wb_from_camera(photo, i))
-                                       photo->settings[i]->wb_ascii = 
PRESET_WB_AUTO;
+                               photo->settings[i]->wb_ascii = 
g_strdup(PRESET_WB_CAMERA);
 
                        /* Contrast */
                        if (!(mask & MASK_CONTRAST) && 
(photo->metadata->contrast != -1.0))
@@ -735,6 +802,14 @@
                        if (!(mask & MASK_SATURATION) && 
(photo->metadata->saturation != -1.0))
                                rs_photo_set_saturation(photo, i, 
photo->metadata->saturation);
                }
+
+               if (photo && photo->input_response)
+               {
+                       photo->icc = 
rs_filter_param_get_object_with_type(RS_FILTER_PARAM(photo->input_response), 
"embedded-colorspace", RS_TYPE_COLOR_SPACE);
+                       if (photo->icc)
+                               photo->dcp = NULL;
+               }
+
                /* Load default DCP */
                if (!photo->dcp && !photo->icc && photo->metadata && 
photo->metadata->model_ascii)
                {

Modified: trunk/src/rs-photo.h
===================================================================
--- trunk/src/rs-photo.h        2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-photo.h        2011-03-06 14:29:08 UTC (rev 3838)
@@ -213,6 +213,14 @@
 extern void rs_photo_apply_settings(RS_PHOTO *photo, const gint snapshot, 
RSSettings *settings, RSSettingsMask mask);
 
 /**
+ * Apply photo settings to a list of filters from an RSSettings
+ * @param photo A RS_PHOTO
+ * @param filters Which filters to apply the settings to
+ * @param snapshot Which snapshot to affect
+ */
+extern void rs_photo_apply_to_filters(RS_PHOTO *photo, GList *filters, const 
gint snapshot);
+
+/**
  * Flips a RS_PHOTO
  * @param photo A RS_PHOTO
  */

Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c       2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-preview-widget.c       2011-03-06 14:29:08 UTC (rev 3838)
@@ -641,16 +641,9 @@
 void
 rs_preview_widget_set_photo(RSPreviewWidget *preview, RS_PHOTO *photo)
 {
-       gint view;
-
        g_assert(RS_IS_PREVIEW_WIDGET(preview));
 
        preview->photo = photo;
-
-       /* Mark everything as dirty */
-       for(view=0;view<preview->views;view++)
-               DIRTY(preview->dirty[view], ALL);
-
        if (preview->state & CROP)
                crop_end(preview, FALSE);
        if (preview->state & STRAIGHTEN)
@@ -661,17 +654,36 @@
 
        if (preview->photo)
        {
+               rs_preview_widget_set_photo_settings(preview);
                photo->thumbnail_filter = preview->navigator_filter_end;
-               g_signal_connect(G_OBJECT(preview->photo), "settings-changed", 
G_CALLBACK(settings_changed), preview);
                g_signal_connect(G_OBJECT(preview->photo), "lens-changed", 
G_CALLBACK(lens_changed), preview);
                g_signal_connect(G_OBJECT(preview->photo), "profile-changed", 
G_CALLBACK(profile_changed), preview);
-               for(view=0;view<MAX_VIEWS;view++) 
-               {
-                       rs_filter_request_set_quick(preview->request[view], 
TRUE);
-                       rs_filter_set_recursive(preview->filter_end[view], 
"settings", preview->photo->settings[preview->snapshot[view]], NULL);
-               }
+               rs_preview_widget_update_display_colorspace(preview, TRUE);
        }
+}
 
+/**
+ * Sets settings of active photo of a RSPreviewWidget
+ * @param preview A RSPreviewWidget
+ */
+void
+rs_preview_widget_set_photo_settings(RSPreviewWidget *preview)
+{
+       gint view;
+       GList *filters = NULL;
+       for(view=0;view<MAX_VIEWS;view++) 
+       {
+               rs_filter_request_set_quick(preview->request[view], TRUE);
+               filters = g_list_append(NULL, preview->filter_end[view]);
+               rs_photo_apply_to_filters(preview->photo, filters, view);
+               g_list_free(filters);
+       }
+
+       filters = g_list_append(NULL, preview->loupe_filter_end);
+       filters = g_list_append(filters, preview->navigator_filter_end);
+       rs_photo_apply_to_filters(preview->photo, filters, 
preview->snapshot[0]);
+       g_list_free(filters);
+
        g_object_set(preview->navigator_filter_scale,
                "bounding-box", TRUE,
                "width", NAVIGATOR_WIDTH*2,
@@ -685,7 +697,12 @@
                "never-quick", TRUE,
                NULL);
 
-       rs_preview_widget_update_display_colorspace(preview, TRUE);
+       if (preview->photo)
+               g_signal_connect(G_OBJECT(preview->photo), "settings-changed", 
G_CALLBACK(settings_changed), preview);
+
+       /* Mark everything as dirty */
+       for(view=0;view<preview->views;view++)
+               DIRTY(preview->dirty[view], ALL);
 }
 
 /**

Modified: trunk/src/rs-preview-widget.h
===================================================================
--- trunk/src/rs-preview-widget.h       2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-preview-widget.h       2011-03-06 14:29:08 UTC (rev 3838)
@@ -62,6 +62,12 @@
 extern void rs_preview_widget_set_photo(RSPreviewWidget *preview, RS_PHOTO 
*photo);
 
 /**
+ * Sets settings of active photo of a RSPreviewWidget
+ * @param preview A RSPreviewWidget
+ */
+extern void rs_preview_widget_set_photo_settings(RSPreviewWidget *preview);
+
+/**
  * Set input filter for a RSPreviewWidget
  * @param preview A RSPreviewWidget
  * @param filter A filter to listen for

Modified: trunk/src/rs-toolbox.c
===================================================================
--- trunk/src/rs-toolbox.c      2011-03-06 09:00:15 UTC (rev 3837)
+++ trunk/src/rs-toolbox.c      2011-03-06 14:29:08 UTC (rev 3838)
@@ -50,8 +50,8 @@
        { "saturation",     0.05 },
        { "hue",            1.5 },
        { "contrast",       0.05 },
-       { "warmth",         0.01 },
-       { "tint",           0.01 },
+       { "dcp-temp",       1.0 },
+       { "dcp-tint",       1.0 },
        { "sharpen",        0.5 },
        { "denoise_luma",   0.5 },
        { "denoise_chroma", 0.5 },
@@ -332,8 +332,8 @@
                
rs_object_class_property_reset(G_OBJECT(toolbox->photo->settings[snapshot]), 
basic->property_name);
 
        /* If we reset warmth or tint slider, we go back to camera whitebalance 
*/
-       if (g_strcmp0(basic->property_name, "warmth") == 0 || 
g_strcmp0(basic->property_name, "tint") == 0)
-               rs_photo_set_wb_from_mul(toolbox->photo, snapshot, 
toolbox->photo->metadata->cam_mul, PRESET_WB_CAMERA);
+       if (g_strcmp0(basic->property_name, "dcp-temp") == 0 || 
g_strcmp0(basic->property_name, "dcp-tint") == 0)
+               rs_photo_set_wb_from_camera(toolbox->photo, snapshot);
 
        return TRUE;
 }
@@ -855,6 +855,9 @@
 {
        RSToolbox *toolbox = RS_TOOLBOX(user_data);
 
+       if (toolbox->mute_from_sliders)
+               return;
+
        /* Update histogram */
        rs_histogram_redraw(RS_HISTOGRAM_WIDGET(toolbox->histogram));
        
@@ -1052,6 +1055,7 @@
                {
                        /* Copy all settings */
                        toolbox_copy_from_photo(toolbox, snapshot, MASK_ALL, 
toolbox->photo);
+                       toolbox->mute_from_sliders = TRUE;
 
                        /* Set the basic types sensitive */
                        for(i=0;i<NBASICS;i++)
@@ -1075,11 +1079,9 @@
                /* This will reset everything */
                photo_finalized(toolbox, NULL);
 
-       toolbox->mute_from_sliders = FALSE;
-
        /* Enable Embedded Profile, if present */
-       gboolean embedded_present = FALSE;
-       if (photo && photo->input_response)
+       gboolean embedded_present = photo && (!!photo->icc);
+       if (embedded_present && photo->input_response)
        {
                RSProfileFactory *factory = rs_profile_factory_new_default();
                RSColorSpace *input_space = 
rs_filter_param_get_object_with_type(RS_FILTER_PARAM(photo->input_response), 
"embedded-colorspace", RS_TYPE_COLOR_SPACE);
@@ -1133,10 +1135,8 @@
                        
gtk_combo_box_set_active(GTK_COMBO_BOX(toolbox->selector), 0);
                else if (dcp_profile)
                        rs_profile_selector_select_profile(toolbox->selector, 
dcp_profile);
-
-               /* FIXME: support ICC profiles too */
-               photo_spatial_changed(toolbox->photo, toolbox);
        }
+       toolbox->mute_from_sliders = FALSE;
        gtk_widget_set_sensitive(toolbox->transforms, !!(toolbox->photo));
 }
 


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to