[Rawstudio-commit] r2739 - in trunk: librawstudio plugins/lensfun src

Anders Kvist anders at kvistmail.dk
Sun Nov 15 20:15:44 CET 2009


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, &params);
+			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);
 	}




More information about the Rawstudio-commit mailing list