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);
        }


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to