Author: akv
Date: 2009-11-15 20:15:44 +0100 (Sun, 15 Nov 2009)
New Revision: 2739
Modified:
trunk/librawstudio/rs-settings.c
trunk/librawstudio/rs-settings.h
trunk/plugins/lensfun/lensfun.c
trunk/src/application.c
trunk/src/rs-actions.c
trunk/src/rs-cache.c
trunk/src/rs-preview-widget.c
trunk/src/rs-toolbox.c
Log:
Adding TCA correction.
Modified: trunk/librawstudio/rs-settings.c
===================================================================
--- trunk/librawstudio/rs-settings.c 2009-11-15 16:42:46 UTC (rev 2738)
+++ trunk/librawstudio/rs-settings.c 2009-11-15 19:15:44 UTC (rev 2739)
@@ -52,6 +52,8 @@
PROP_SHARPEN,
PROP_DENOISE_LUMA,
PROP_DENOISE_CHROMA,
+ PROP_TCA_KR,
+ PROP_TCA_KB,
PROP_CHANNELMIXER_RED,
PROP_CHANNELMIXER_GREEN,
PROP_CHANNELMIXER_BLUE
@@ -111,6 +113,16 @@
0.0, 100.0, 0.0, G_PARAM_READWRITE)
);
g_object_class_install_property(object_class,
+ PROP_TCA_KR, g_param_spec_float( /* FIXME: ? */
+ "tca_kr", _("tca_kr"), _("tca_kr"),
+ 0.9, 1.1, 1.0, G_PARAM_READWRITE)
+ );
+ g_object_class_install_property(object_class,
+ PROP_TCA_KB, g_param_spec_float( /* FIXME: ? */
+ "tca_kb", _("tca_kb"), _("tca_kb"),
+ 0.9, 1.1, 1.0, G_PARAM_READWRITE)
+ );
+ g_object_class_install_property(object_class,
PROP_CHANNELMIXER_RED, g_param_spec_float( /* FIXME: ? */
"channelmixer_red", _("Red"), _("Red"),
0.0, 300.0, 100.0, G_PARAM_READWRITE)
@@ -171,6 +183,8 @@
CASE(SHARPEN, sharpen);
CASE(DENOISE_LUMA, denoise_luma);
CASE(DENOISE_CHROMA, denoise_chroma);
+ CASE(TCA_KR, tca_kr);
+ CASE(TCA_KB, tca_kb);
CASE(CHANNELMIXER_RED, channelmixer_red);
CASE(CHANNELMIXER_GREEN, channelmixer_green);
CASE(CHANNELMIXER_BLUE, channelmixer_blue);
@@ -205,6 +219,8 @@
CASE(SHARPEN, sharpen);
CASE(DENOISE_LUMA, denoise_luma);
CASE(DENOISE_CHROMA, denoise_chroma);
+ CASE(TCA_KR, tca_kr);
+ CASE(TCA_KB, tca_kb);
CASE(CHANNELMIXER_RED, channelmixer_red);
CASE(CHANNELMIXER_GREEN, channelmixer_green);
CASE(CHANNELMIXER_BLUE, channelmixer_blue);
@@ -261,6 +277,12 @@
if (mask & MASK_DENOISE_CHROMA)
rs_object_class_property_reset(settings, "denoise_chroma");
+ if (mask & MASK_TCA_KR)
+ rs_object_class_property_reset(settings, "tca_kr");
+
+ if (mask & MASK_TCA_KB)
+ rs_object_class_property_reset(settings, "tca_kb");
+
if (mask & MASK_CHANNELMIXER_RED)
rs_object_class_property_reset(settings, "channelmixer_red");
@@ -359,6 +381,8 @@
SETTINGS_COPY(SHARPEN, sharpen);
SETTINGS_COPY(DENOISE_LUMA, denoise_luma);
SETTINGS_COPY(DENOISE_CHROMA, denoise_chroma);
+ SETTINGS_COPY(TCA_KR, tca_kr);
+ SETTINGS_COPY(TCA_KB, tca_kb);
SETTINGS_COPY(CHANNELMIXER_RED, channelmixer_red);
SETTINGS_COPY(CHANNELMIXER_GREEN, channelmixer_green);
SETTINGS_COPY(CHANNELMIXER_BLUE, channelmixer_blue);
Modified: trunk/librawstudio/rs-settings.h
===================================================================
--- trunk/librawstudio/rs-settings.h 2009-11-15 16:42:46 UTC (rev 2738)
+++ trunk/librawstudio/rs-settings.h 2009-11-15 19:15:44 UTC (rev 2739)
@@ -44,9 +44,12 @@
MASK_SHARPEN = (1<<7),
MASK_DENOISE_LUMA = (1<<8),
MASK_DENOISE_CHROMA = (1<<9),
- MASK_CHANNELMIXER_RED = (1<<10),
- MASK_CHANNELMIXER_GREEN = (1<<11),
- MASK_CHANNELMIXER_BLUE = (1<<12),
+ MASK_TCA_KR = (1<<10),
+ MASK_TCA_KB = (1<<11),
+ MASK_TCA = MASK_TCA_KR | MASK_TCA_KB,
+ MASK_CHANNELMIXER_RED = (1<<12),
+ MASK_CHANNELMIXER_GREEN = (1<<13),
+ MASK_CHANNELMIXER_BLUE = (1<<14),
MASK_CHANNELMIXER = MASK_CHANNELMIXER_RED | MASK_CHANNELMIXER_GREEN |
MASK_CHANNELMIXER_BLUE,
MASK_ALL = 0x00ffffff,
} RSSettingsMask;
@@ -64,6 +67,8 @@
gfloat sharpen;
gfloat denoise_luma;
gfloat denoise_chroma;
+ gfloat tca_kr;
+ gfloat tca_kb;
gfloat channelmixer_red;
gfloat channelmixer_green;
gfloat channelmixer_blue;
Modified: trunk/plugins/lensfun/lensfun.c
===================================================================
--- trunk/plugins/lensfun/lensfun.c 2009-11-15 16:42:46 UTC (rev 2738)
+++ trunk/plugins/lensfun/lensfun.c 2009-11-15 19:15:44 UTC (rev 2739)
@@ -40,6 +40,8 @@
gchar *lens_model;
gfloat focal;
gfloat aperture;
+ gfloat tca_kr;
+ gfloat tca_kb;
};
struct _RSLensfunClass {
@@ -57,6 +59,8 @@
PROP_LENS_MODEL,
PROP_FOCAL,
PROP_APERTURE,
+ PROP_TCA_KR,
+ PROP_TCA_KB,
};
static void get_property (GObject *object, guint property_id, GValue *value,
GParamSpec *pspec);
@@ -119,6 +123,16 @@
"aperture", "aperture", "aperture",
1.0, G_MAXFLOAT, 5.6, G_PARAM_READWRITE)
);
+ g_object_class_install_property(object_class,
+ PROP_TCA_KR, g_param_spec_float(
+ "tca_kr", "tca_kr", "tca_kr",
+ 0.9, 1.1, 1.0, G_PARAM_READWRITE)
+ );
+ g_object_class_install_property(object_class,
+ PROP_TCA_KB, g_param_spec_float(
+ "tca_kb", "tca_kb", "tca_kb",
+ 0.9, 1.1, 1.0, G_PARAM_READWRITE)
+ );
filter_class->name = "Lensfun filter";
filter_class->get_image = get_image;
@@ -134,6 +148,8 @@
lensfun->lens_model = NULL;
lensfun->focal = 50.0; /* Well... */
lensfun->aperture = 5.6;
+ lensfun->tca_kr = 1.0;
+ lensfun->tca_kb = 1.0;
}
static void
@@ -164,6 +180,12 @@
case PROP_APERTURE:
g_value_set_float(value, lensfun->aperture);
break;
+ case PROP_TCA_KR:
+ g_value_set_float(value, lensfun->tca_kr);
+ break;
+ case PROP_TCA_KB:
+ g_value_set_float(value, lensfun->tca_kb);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id,
pspec);
}
@@ -195,6 +217,14 @@
case PROP_APERTURE:
lensfun->aperture = g_value_get_float(value);
break;
+ case PROP_TCA_KR:
+ lensfun->tca_kr = g_value_get_float(value);
+ rs_filter_changed(RS_FILTER(lensfun),
RS_FILTER_CHANGED_PIXELDATA);
+ break;
+ case PROP_TCA_KB:
+ lensfun->tca_kb = g_value_get_float(value);
+ rs_filter_changed(RS_FILTER(lensfun),
RS_FILTER_CHANGED_PIXELDATA);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id,
pspec);
}
@@ -347,6 +377,19 @@
{
gint effective_flags;
+ if (lensfun->tca_kr != 1.0 || lensfun->tca_kb != 1.0)
+ {
+ /* Set TCA */
+ lfLensCalibTCA tca;
+ tca.Model = LF_TCA_MODEL_LINEAR;
+ const char *details;
+ const lfParameter **params;
+ lf_get_tca_model_desc (tca.Model, &details, ¶ms);
+ tca.Terms[0] = lensfun->tca_kr;
+ tca.Terms[1] = lensfun->tca_kb;
+ lf_lens_add_calib_tca((lfLens *) lens, (lfLensCalibTCA
*) &tca.Model);
+ }
+
lfModifier *mod = lf_modifier_new (lens,
cameras[0]->CropFactor, input->w, input->h);
effective_flags = lf_modifier_initialize (mod, lens,
LF_PF_U16, /* lfPixelFormat */
Modified: trunk/src/application.c
===================================================================
--- trunk/src/application.c 2009-11-15 16:42:46 UTC (rev 2738)
+++ trunk/src/application.c 2009-11-15 19:15:44 UTC (rev 2739)
@@ -85,6 +85,8 @@
"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,
NULL);
g_object_unref(lens);
}
Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c 2009-11-15 16:42:46 UTC (rev 2738)
+++ trunk/src/rs-actions.c 2009-11-15 19:15:44 UTC (rev 2739)
@@ -338,7 +338,7 @@
gint mask = 0xffffff; /* Should be RSSettingsMask, is gint to satisfy
rs_conf_get_integer() */
GtkWidget *dialog, *cb_box;
- GtkWidget *cb_exposure, *cb_saturation, *cb_hue, *cb_contrast,
*cb_whitebalance, *cb_curve, *cb_sharpen, *cb_denoise_luma, *cb_denoise_chroma,
*cb_channelmixer;
+ GtkWidget *cb_exposure, *cb_saturation, *cb_hue, *cb_contrast,
*cb_whitebalance, *cb_curve, *cb_sharpen, *cb_denoise_luma, *cb_denoise_chroma,
*cb_channelmixer, *cb_tca;
if (rs->settings_buffer)
{
@@ -352,6 +352,7 @@
cb_denoise_luma = gtk_check_button_new_with_label
(_("Denoise"));
cb_denoise_chroma = gtk_check_button_new_with_label (_("Color
denoise"));
cb_channelmixer = gtk_check_button_new_with_label (_("Channel
mixer"));
+ cb_tca = gtk_check_button_new_with_label (_("TCA"));
cb_curve = gtk_check_button_new_with_label (_("Curve"));
rs_conf_get_integer(CONF_PASTE_MASK, &mask);
@@ -374,6 +375,8 @@
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_denoise_chroma), TRUE);
if (mask & MASK_CHANNELMIXER)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_channelmixer), TRUE);
+ if (mask & MASK_TCA)
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_tca),
TRUE);
if (mask & MASK_CURVE)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_curve), TRUE);
@@ -388,6 +391,7 @@
gtk_box_pack_start (GTK_BOX (cb_box), cb_denoise_luma, FALSE,
TRUE, 0);
gtk_box_pack_start (GTK_BOX (cb_box), cb_denoise_chroma, FALSE,
TRUE, 0);
gtk_box_pack_start (GTK_BOX (cb_box), cb_channelmixer, FALSE,
TRUE, 0);
+ gtk_box_pack_start (GTK_BOX (cb_box), cb_tca, FALSE, TRUE, 0);
gtk_box_pack_start (GTK_BOX (cb_box), cb_curve, FALSE, TRUE, 0);
dialog = gui_dialog_make_from_widget(GTK_STOCK_DIALOG_QUESTION,
_("Select settings to paste"), cb_box);
@@ -419,6 +423,8 @@
mask |= MASK_DENOISE_CHROMA;
if (GTK_TOGGLE_BUTTON(cb_channelmixer)->active)
mask |= MASK_CHANNELMIXER;
+ if (GTK_TOGGLE_BUTTON(cb_tca)->active)
+ mask |= MASK_TCA;
if (GTK_TOGGLE_BUTTON(cb_curve)->active)
mask |= MASK_CURVE;
rs_conf_set_integer(CONF_PASTE_MASK, mask);
Modified: trunk/src/rs-cache.c
===================================================================
--- trunk/src/rs-cache.c 2009-11-15 16:42:46 UTC (rev 2738)
+++ trunk/src/rs-cache.c 2009-11-15 19:15:44 UTC (rev 2739)
@@ -120,6 +120,12 @@
xmlTextWriterWriteFormatElement(writer, BAD_CAST
"channelmixer_blue", "%f",
photo->settings[id]->channelmixer_blue);
}
+ if (mask & MASK_TCA_KR)
+ xmlTextWriterWriteFormatElement(writer, BAD_CAST
"tca_kr", "%f",
+ photo->settings[id]->tca_kr);
+ if (mask & MASK_TCA_KB)
+ xmlTextWriterWriteFormatElement(writer, BAD_CAST
"tca_kb", "%f",
+ photo->settings[id]->tca_kb);
if (mask & MASK_CURVE && photo->settings[id]->curve_nknots > 0)
{
xmlTextWriterStartElement(writer, BAD_CAST "curve");
@@ -223,6 +229,20 @@
if (version < 4)
rss->channelmixer_blue *= 3.0;
}
+ else if ((!xmlStrcmp(cur->name, BAD_CAST "tca_kr")))
+ {
+ mask |= MASK_TCA_KR;
+ val = xmlNodeListGetString(doc, cur->xmlChildrenNode,
1);
+ rss->tca_kr = rs_atof((gchar *) val);
+ xmlFree(val);
+ }
+ else if ((!xmlStrcmp(cur->name, BAD_CAST "tca_kb")))
+ {
+ mask |= MASK_TCA_KB;
+ val = xmlNodeListGetString(doc, cur->xmlChildrenNode,
1);
+ rss->tca_kb = rs_atof((gchar *) val);
+ xmlFree(val);
+ }
else if ((!xmlStrcmp(cur->name, BAD_CAST "curve")))
{
gchar **vals;
Modified: trunk/src/rs-preview-widget.c
===================================================================
--- trunk/src/rs-preview-widget.c 2009-11-15 16:42:46 UTC (rev 2738)
+++ trunk/src/rs-preview-widget.c 2009-11-15 19:15:44 UTC (rev 2739)
@@ -150,6 +150,7 @@
RSFilter *filter_mask[MAX_VIEWS];
RSFilter *filter_cache3[MAX_VIEWS];
RSFilter *filter_end[MAX_VIEWS]; /* For convenience */
+ RSFilter *filter_lensfun[MAX_VIEWS];
RSFilterRequest *request[MAX_VIEWS];
GdkRectangle *last_roi[MAX_VIEWS];
@@ -567,6 +568,7 @@
if (preview->photo)
{
+ g_signal_connect(G_OBJECT(preview->photo), "settings-changed",
G_CALLBACK(settings_changed), preview);
for(view=0;view<MAX_VIEWS;view++)
{
rs_filter_request_set_quick(preview->request[view],
TRUE);
@@ -584,6 +586,24 @@
void
rs_preview_widget_set_filter(RSPreviewWidget *preview, RSFilter *filter)
{
+ RSFilter *lensfun = NULL;
+
+ RSFilter *f = filter;
+
+ while(RS_IS_FILTER(filter))
+ {
+ if (g_str_equal(RS_FILTER_NAME(filter), "RSLensfun"))
+ lensfun = filter;
+ filter = filter->previous;
+ }
+ filter = f;
+
+ if (RS_IS_FILTER(lensfun))
+ {
+ preview->filter_lensfun[0] = lensfun;
+ printf("We found the lensfun filter!\n");
+ }
+
g_assert(RS_IS_PREVIEW_WIDGET(preview));
g_assert(RS_IS_FILTER(filter));
@@ -2153,6 +2173,40 @@
}
static void
+settings_changed(RS_PHOTO *photo, RSSettingsMask mask, RSPreviewWidget
*preview)
+{
+ gint view;
+
+ /* Seperate snapshot */
+ const gint snapshot = mask>>24;
+ mask &= 0x00ffffff;
+
+ /* Return if no more relevant */
+ if (photo != preview->photo)
+ return;
+
+ for(view=0;view<preview->views;view++)
+ {
+ if (preview->snapshot[view] == snapshot)
+ {
+ DIRTY(preview->dirty[view], SCREEN);
+ if (mask & MASK_TCA_KR)
+ {
+ gfloat f = 1.0;
+
g_object_get(preview->photo->settings[preview->snapshot[view]], "tca_kr", &f,
NULL);
+ g_object_set(preview->filter_lensfun[view],
"tca_kr", (gfloat) f, NULL);
+ }
+ if (mask & MASK_TCA_KB)
+ {
+ gfloat f = 1.0;
+
g_object_get(preview->photo->settings[preview->snapshot[view]], "tca_kb", &f,
NULL);
+ g_object_set(preview->filter_lensfun[view],
"tca_kb", (gfloat) f, NULL);
+ }
+ }
+ }
+}
+
+static void
filter_changed(RSFilter *filter, RSFilterChangedMask mask, RSPreviewWidget
*preview)
{
gint view;
Modified: trunk/src/rs-toolbox.c
===================================================================
--- trunk/src/rs-toolbox.c 2009-11-15 16:42:46 UTC (rev 2738)
+++ trunk/src/rs-toolbox.c 2009-11-15 19:15:44 UTC (rev 2739)
@@ -59,12 +59,19 @@
};
#define NCHANNELMIXER (3)
+const static BasicSettings tca[] = {
+ { "tca_kr", 0.00001 },
+ { "tca_kb", 0.00001 },
+};
+#define NTCA (2)
+
struct _RSToolbox {
GtkScrolledWindow parent;
GtkWidget *notebook;
GtkBox *toolbox;
GtkRange *ranges[3][NBASICS];
GtkRange *channelmixer[3][NCHANNELMIXER];
+ GtkRange *tca[3][NTCA];
RSSettings *settings[3];
GtkWidget *curve[3];
@@ -615,17 +622,20 @@
new_snapshot_page(RSToolbox *toolbox, const gint snapshot)
{
GtkWidget *vbox = gtk_vbox_new(FALSE, 1);
- GtkTable *table, *channelmixertable;
+ GtkTable *table, *channelmixertable, *tcatable;
gint row;
table = GTK_TABLE(gtk_table_new(NBASICS, 5, FALSE));
channelmixertable = GTK_TABLE(gtk_table_new(NCHANNELMIXER, 5, FALSE));
+ tcatable = GTK_TABLE(gtk_table_new(NTCA, 5, FALSE));
/* Add basic sliders */
for(row=0;row<NBASICS;row++)
toolbox->ranges[snapshot][row] = basic_slider(toolbox,
snapshot, table, row, &basic[row]);
for(row=0;row<NCHANNELMIXER;row++)
toolbox->channelmixer[snapshot][row] = basic_slider(toolbox,
snapshot, channelmixertable, row, &channelmixer[row]);
+ for(row=0;row<NTCA;row++)
+ toolbox->tca[snapshot][row] = basic_slider(toolbox, snapshot,
tcatable, row, &tca[row]);
/* Add curve editor */
toolbox->curve[snapshot] = rs_curve_widget_new();
@@ -636,6 +646,7 @@
/* Pack everything nice */
gtk_box_pack_start(GTK_BOX(vbox), gui_box(_("Basic"),
GTK_WIDGET(table), "show_basic", TRUE), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), gui_box(_("Channel Mixer"),
GTK_WIDGET(channelmixertable), "show_channelmixer", TRUE), FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), gui_box(_("TCA"),
GTK_WIDGET(tcatable), "show_tca", TRUE), FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), gui_box(_("Curve"),
toolbox->curve[snapshot], "show_curve", TRUE), FALSE, FALSE, 0);
return vbox;
@@ -761,6 +772,10 @@
{
gtk_widget_set_sensitive(GTK_WIDGET(toolbox->channelmixer[snapshot][i]), FALSE);
}
+ for(i=0;i<NTCA;i++)
+ {
+
gtk_widget_set_sensitive(GTK_WIDGET(toolbox->tca[snapshot][i]), FALSE);
+ }
rs_curve_widget_reset(RS_CURVE_WIDGET(toolbox->curve[snapshot]));
rs_curve_widget_add_knot(RS_CURVE_WIDGET(toolbox->curve[snapshot]), 0.0,0.0);
rs_curve_widget_add_knot(RS_CURVE_WIDGET(toolbox->curve[snapshot]), 1.0,1.0);
@@ -794,6 +809,15 @@
gtk_range_set_value(toolbox->channelmixer[snapshot][i], value);
}
+ /* Update tca */
+ for(i=0;i<NTCA;i++)
+ if (mask)
+ {
+ gfloat value;
+
g_object_get(toolbox->photo->settings[snapshot], tca[i].property_name, &value,
NULL);
+ gtk_range_set_value(toolbox->tca[snapshot][i],
value);
+ }
+
/* Update curve */
if(mask & MASK_CURVE)
{
@@ -838,6 +862,8 @@
gtk_widget_set_sensitive(GTK_WIDGET(toolbox->ranges[snapshot][i]), TRUE);
for(i=0;i<NCHANNELMIXER;i++)
gtk_widget_set_sensitive(GTK_WIDGET(toolbox->channelmixer[snapshot][i]), TRUE);
+ for(i=0;i<NTCA;i++)
+
gtk_widget_set_sensitive(GTK_WIDGET(toolbox->tca[snapshot][i]), TRUE);
}
photo_spatial_changed(toolbox->photo, toolbox);
}
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit