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, ¶ms);
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);
}
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit