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