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

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


Author: akv
Date: 2009-11-15 20:58:19 +0100 (Sun, 15 Nov 2009)
New Revision: 2740

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:
Enabling basic vignetting - only using Lensfun Vignetting K2 value as suggested by Lensfun author.

Modified: trunk/librawstudio/rs-settings.c
===================================================================
--- trunk/librawstudio/rs-settings.c	2009-11-15 19:15:44 UTC (rev 2739)
+++ trunk/librawstudio/rs-settings.c	2009-11-15 19:58:19 UTC (rev 2740)
@@ -54,6 +54,7 @@
 	PROP_DENOISE_CHROMA,
 	PROP_TCA_KR,
 	PROP_TCA_KB,
+	PROP_VIGNETTING_K2,
 	PROP_CHANNELMIXER_RED,
 	PROP_CHANNELMIXER_GREEN,
 	PROP_CHANNELMIXER_BLUE
@@ -123,6 +124,11 @@
 			0.9, 1.1, 1.0, G_PARAM_READWRITE)
 	);
 	g_object_class_install_property(object_class,
+		PROP_VIGNETTING_K2, g_param_spec_float( /* FIXME: ? */
+			"vignetting_k2", _("vignetting_k2"), _("vignetting_k2"),
+			-1, 2, 0.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)
@@ -185,6 +191,7 @@
 		CASE(DENOISE_CHROMA, denoise_chroma);
 		CASE(TCA_KR, tca_kr);
 		CASE(TCA_KB, tca_kb);
+		CASE(VIGNETTING_K2, vignetting_k2);
 		CASE(CHANNELMIXER_RED, channelmixer_red);
 		CASE(CHANNELMIXER_GREEN, channelmixer_green);
 		CASE(CHANNELMIXER_BLUE, channelmixer_blue);
@@ -221,6 +228,7 @@
 		CASE(DENOISE_CHROMA, denoise_chroma);
 		CASE(TCA_KR, tca_kr);
 		CASE(TCA_KB, tca_kb);
+		CASE(VIGNETTING_K2, vignetting_k2);
 		CASE(CHANNELMIXER_RED, channelmixer_red);
 		CASE(CHANNELMIXER_GREEN, channelmixer_green);
 		CASE(CHANNELMIXER_BLUE, channelmixer_blue);
@@ -283,6 +291,9 @@
 	if (mask & MASK_TCA_KB)
 		rs_object_class_property_reset(settings, "tca_kb");
 
+	if (mask & MASK_VIGNETTING_K2)
+		rs_object_class_property_reset(settings, "vignetting_k2");
+
 	if (mask & MASK_CHANNELMIXER_RED)
 		rs_object_class_property_reset(settings, "channelmixer_red");
 
@@ -383,6 +394,7 @@
 	SETTINGS_COPY(DENOISE_CHROMA, denoise_chroma);
 	SETTINGS_COPY(TCA_KR, tca_kr);
 	SETTINGS_COPY(TCA_KB, tca_kb);
+	SETTINGS_COPY(VIGNETTING_K2, vignetting_k2);
 	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 19:15:44 UTC (rev 2739)
+++ trunk/librawstudio/rs-settings.h	2009-11-15 19:58:19 UTC (rev 2740)
@@ -51,6 +51,8 @@
 	MASK_CHANNELMIXER_GREEN = (1<<13),
 	MASK_CHANNELMIXER_BLUE = (1<<14),
 	MASK_CHANNELMIXER = MASK_CHANNELMIXER_RED | MASK_CHANNELMIXER_GREEN | MASK_CHANNELMIXER_BLUE,
+	MASK_VIGNETTING_K2  = (1<<15),
+	MASK_VIGNETTING     = MASK_VIGNETTING_K2,
 	MASK_ALL            = 0x00ffffff,
 } RSSettingsMask;
 
@@ -69,6 +71,7 @@
 	gfloat denoise_chroma;
 	gfloat tca_kr;
 	gfloat tca_kb;
+	gfloat vignetting_k2;
 	gfloat channelmixer_red;
 	gfloat channelmixer_green;
 	gfloat channelmixer_blue;

Modified: trunk/plugins/lensfun/lensfun.c
===================================================================
--- trunk/plugins/lensfun/lensfun.c	2009-11-15 19:15:44 UTC (rev 2739)
+++ trunk/plugins/lensfun/lensfun.c	2009-11-15 19:58:19 UTC (rev 2740)
@@ -42,6 +42,9 @@
 	gfloat aperture;
 	gfloat tca_kr;
 	gfloat tca_kb;
+	gfloat vignetting_k1;
+	gfloat vignetting_k2;
+	gfloat vignetting_k3;
 };
 
 struct _RSLensfunClass {
@@ -61,6 +64,9 @@
 	PROP_APERTURE,
 	PROP_TCA_KR,
 	PROP_TCA_KB,
+	PROP_VIGNETTING_K1,
+	PROP_VIGNETTING_K2,
+	PROP_VIGNETTING_K3,
 };
 
 static void get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec);
@@ -133,6 +139,21 @@
 			"tca_kb", "tca_kb", "tca_kb",
 			0.9, 1.1, 1.0, G_PARAM_READWRITE)
 	);
+	g_object_class_install_property(object_class,
+		PROP_VIGNETTING_K1, g_param_spec_float(
+			"vignetting_k1", "vignetting_k1", "vignetting_k1",
+			-1, 2, 0.0, G_PARAM_READWRITE)
+	);
+	g_object_class_install_property(object_class,
+		PROP_VIGNETTING_K2, g_param_spec_float(
+			"vignetting_k2", "vignetting_k2", "vignetting_k2",
+			-1, 2, 0.0, G_PARAM_READWRITE)
+	);
+	g_object_class_install_property(object_class,
+		PROP_VIGNETTING_K3, g_param_spec_float(
+			"vignetting_k3", "vignetting_k3", "vignetting_k3",
+			-1, 2, 0.0, G_PARAM_READWRITE)
+	);
 
 	filter_class->name = "Lensfun filter";
 	filter_class->get_image = get_image;
@@ -150,6 +171,9 @@
 	lensfun->aperture = 5.6;
 	lensfun->tca_kr = 1.0;
 	lensfun->tca_kb = 1.0;
+	lensfun->vignetting_k1 = 0.0;
+	lensfun->vignetting_k2 = 0.0;
+	lensfun->vignetting_k3 = 0.0;
 }
 
 static void
@@ -186,6 +210,15 @@
 		case PROP_TCA_KB:
 			g_value_set_float(value, lensfun->tca_kb);
 			break;
+		case PROP_VIGNETTING_K1:
+			g_value_set_float(value, lensfun->vignetting_k1);
+			break;
+		case PROP_VIGNETTING_K2:
+			g_value_set_float(value, lensfun->vignetting_k2);
+			break;
+		case PROP_VIGNETTING_K3:
+			g_value_set_float(value, lensfun->vignetting_k3);
+			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
 	}
@@ -225,6 +258,18 @@
 			lensfun->tca_kb = g_value_get_float(value);
 			rs_filter_changed(RS_FILTER(lensfun), RS_FILTER_CHANGED_PIXELDATA);
 			break;
+		case PROP_VIGNETTING_K1:
+			lensfun->vignetting_k1 = g_value_get_float(value);
+			rs_filter_changed(RS_FILTER(lensfun), RS_FILTER_CHANGED_PIXELDATA);
+			break;
+		case PROP_VIGNETTING_K2:
+			lensfun->vignetting_k2 = g_value_get_float(value);
+			rs_filter_changed(RS_FILTER(lensfun), RS_FILTER_CHANGED_PIXELDATA);
+			break;
+		case PROP_VIGNETTING_K3:
+			lensfun->vignetting_k3 = 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);
 	}
@@ -387,15 +432,29 @@
 			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);
+			lf_lens_add_calib_tca((lfLens *) lens, (lfLensCalibTCA *) &tca);
 		}
 
+		if (lensfun->vignetting_k2 != 0.0 )
+		{
+			/* Set vignetting */
+			lfLensCalibVignetting vignetting;
+			vignetting.Model = LF_VIGNETTING_MODEL_PA;
+			vignetting.Distance = 1.0;
+			vignetting.Focal = lensfun->focal;
+			vignetting.Aperture = lensfun->aperture;
+			vignetting.Terms[0] = lensfun->vignetting_k1;
+			vignetting.Terms[1] = lensfun->vignetting_k2;
+			vignetting.Terms[2] = lensfun->vignetting_k3;
+			lf_lens_add_calib_vignetting((lfLens *) lens, &vignetting);
+		}
+
 		lfModifier *mod = lf_modifier_new (lens, cameras[0]->CropFactor, input->w, input->h);
 		effective_flags = lf_modifier_initialize (mod, lens,
 			LF_PF_U16, /* lfPixelFormat */
 			lensfun->focal, /* focal */
 			lensfun->aperture, /* aperture */
-			0.0, /* distance */
+			1.0, /* distance */
 			1.0, /* scale */
 			LF_UNKNOWN, /* lfLensType targeom, */ /* FIXME: ? */
 			LF_MODIFY_ALL, /* flags */ /* FIXME: ? */
@@ -418,6 +477,15 @@
 		g_debug("Effective flags:%s", flags->str);
 		g_string_free(flags, TRUE);
 
+		/* Do lensfun vignetting */
+		if (effective_flags & LF_MODIFY_VIGNETTING)
+		{
+			lf_modifier_apply_color_modification (
+				mod, input->pixels, 0.0, 0.0, input->w, input->h,
+				LF_CR_4 (RED, GREEN, BLUE, UNKNOWN),
+				input->rowstride*2);
+		}
+			
 		if (effective_flags > 0)
 		{
 			guint y_offset, y_per_thread, threaded_h;

Modified: trunk/src/application.c
===================================================================
--- trunk/src/application.c	2009-11-15 19:15:44 UTC (rev 2739)
+++ trunk/src/application.c	2009-11-15 19:58:19 UTC (rev 2740)
@@ -87,6 +87,7 @@
 				"aperture", meta->aperture,
 				"tca_kr", rs->photo->settings[rs->current_setting]->tca_kr,
 				"tca_kb", rs->photo->settings[rs->current_setting]->tca_kb,
+				"vignetting_k2", rs->photo->settings[rs->current_setting]->vignetting_k2,
 				NULL);
 			g_object_unref(lens);
 		}

Modified: trunk/src/rs-actions.c
===================================================================
--- trunk/src/rs-actions.c	2009-11-15 19:15:44 UTC (rev 2739)
+++ trunk/src/rs-actions.c	2009-11-15 19:58:19 UTC (rev 2740)
@@ -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, *cb_tca;
+	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, *cb_vignetting;
 
 	if (rs->settings_buffer)
 	{
@@ -353,6 +353,7 @@
 		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_vignetting = gtk_check_button_new_with_label (_("Vignetting"));
 		cb_curve = gtk_check_button_new_with_label (_("Curve"));
 
 		rs_conf_get_integer(CONF_PASTE_MASK, &mask);
@@ -377,6 +378,8 @@
 			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_VIGNETTING)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_vignetting), TRUE);
 		if (mask & MASK_CURVE)
 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cb_curve), TRUE);
 
@@ -392,6 +395,7 @@
 		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_vignetting, 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);
@@ -425,6 +429,8 @@
 				mask |= MASK_CHANNELMIXER;
 			if (GTK_TOGGLE_BUTTON(cb_tca)->active)
 				mask |= MASK_TCA;
+			if (GTK_TOGGLE_BUTTON(cb_vignetting)->active)
+				mask |= MASK_VIGNETTING;
 			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 19:15:44 UTC (rev 2739)
+++ trunk/src/rs-cache.c	2009-11-15 19:58:19 UTC (rev 2740)
@@ -126,6 +126,9 @@
 		if (mask & MASK_TCA_KB)
 			xmlTextWriterWriteFormatElement(writer, BAD_CAST "tca_kb", "%f",
 				photo->settings[id]->tca_kb);
+		if (mask & MASK_VIGNETTING_K2)
+			xmlTextWriterWriteFormatElement(writer, BAD_CAST "vignetting_k2", "%f",
+				photo->settings[id]->vignetting_k2);
 		if (mask & MASK_CURVE && photo->settings[id]->curve_nknots > 0)
 		{
 			xmlTextWriterStartElement(writer, BAD_CAST "curve");
@@ -243,6 +246,13 @@
 			rss->tca_kb =  rs_atof((gchar *) val);
 			xmlFree(val);
 		}
+		else if ((!xmlStrcmp(cur->name, BAD_CAST "vignetting_k2")))
+		{
+			mask |= MASK_VIGNETTING_K2;
+			val = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
+			rss->vignetting_k2 =  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 19:15:44 UTC (rev 2739)
+++ trunk/src/rs-preview-widget.c	2009-11-15 19:58:19 UTC (rev 2740)
@@ -2202,6 +2202,12 @@
  				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);
  			}
+ 			if (mask & MASK_VIGNETTING_K2)
+ 			{
+				gfloat f = 1.0;
+ 				g_object_get(preview->photo->settings[preview->snapshot[view]], "vignetting_k2", &f, NULL);
+				g_object_set(preview->filter_lensfun[view], "vignetting_k2", (gfloat) f, NULL);
+ 			}
 		}
 	}
 }

Modified: trunk/src/rs-toolbox.c
===================================================================
--- trunk/src/rs-toolbox.c	2009-11-15 19:15:44 UTC (rev 2739)
+++ trunk/src/rs-toolbox.c	2009-11-15 19:58:19 UTC (rev 2740)
@@ -59,11 +59,12 @@
 };
 #define NCHANNELMIXER (3)
 
-const static BasicSettings tca[] = {
-	{ "tca_kr",         0.00001 },
-	{ "tca_kb",         0.00001 },
+const static BasicSettings lens[] = {
+	{ "tca_kr",         0.001 },
+	{ "tca_kb",         0.001 },
+	{ "vignetting_k2",  0.01 },
 };
-#define NTCA (2)
+#define NLENS (3)
 
 struct _RSToolbox {
 	GtkScrolledWindow parent;
@@ -71,7 +72,7 @@
 	GtkBox *toolbox;
 	GtkRange *ranges[3][NBASICS];
 	GtkRange *channelmixer[3][NCHANNELMIXER];
-	GtkRange *tca[3][NTCA];
+	GtkRange *lens[3][NLENS];
 	RSSettings *settings[3];
 	GtkWidget *curve[3];
 
@@ -622,20 +623,20 @@
 new_snapshot_page(RSToolbox *toolbox, const gint snapshot)
 {
 	GtkWidget *vbox = gtk_vbox_new(FALSE, 1);
-	GtkTable *table, *channelmixertable, *tcatable;
+	GtkTable *table, *channelmixertable, *lenstable;
 	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));
+	lenstable = GTK_TABLE(gtk_table_new(NLENS, 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]);
+	for(row=0;row<NLENS;row++)
+		toolbox->lens[snapshot][row] = basic_slider(toolbox, snapshot, lenstable, row, &lens[row]);
 
 	/* Add curve editor */
 	toolbox->curve[snapshot] = rs_curve_widget_new();
@@ -646,7 +647,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(_("Lens corrections"), GTK_WIDGET(lenstable), "show_lens", 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;
@@ -772,9 +773,9 @@
 		{
 			gtk_widget_set_sensitive(GTK_WIDGET(toolbox->channelmixer[snapshot][i]), FALSE);
 		}
-		for(i=0;i<NTCA;i++)
+		for(i=0;i<NLENS;i++)
 		{
-			gtk_widget_set_sensitive(GTK_WIDGET(toolbox->tca[snapshot][i]), FALSE);
+			gtk_widget_set_sensitive(GTK_WIDGET(toolbox->lens[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);
@@ -809,13 +810,13 @@
 				gtk_range_set_value(toolbox->channelmixer[snapshot][i], value);
 			}
 
-		/* Update tca */
-		for(i=0;i<NTCA;i++)
+		/* Update lens */
+		for(i=0;i<NLENS;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);
+				g_object_get(toolbox->photo->settings[snapshot], lens[i].property_name, &value, NULL);
+				gtk_range_set_value(toolbox->lens[snapshot][i], value);
 			}
 
 		/* Update curve */
@@ -862,8 +863,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);
+			for(i=0;i<NLENS;i++)
+				gtk_widget_set_sensitive(GTK_WIDGET(toolbox->lens[snapshot][i]), TRUE);
 		}
 		photo_spatial_changed(toolbox->photo, toolbox);
 	}




More information about the Rawstudio-commit mailing list