Author: post
Date: 2011-09-10 22:22:43 +0200 (Sat, 10 Sep 2011)
New Revision: 4039

Modified:
   trunk/librawstudio/rs-lens-db-editor.c
   trunk/librawstudio/rs-lens-db-editor.h
   trunk/librawstudio/rs-lens-db.c
   trunk/librawstudio/rs-lens.c
   trunk/librawstudio/rs-lens.h
   trunk/plugins/lensfun/lensfun.c
Log:
Add option to lenses for correcting for fisheye effect. Selectable per lens.

Modified: trunk/librawstudio/rs-lens-db-editor.c
===================================================================
--- trunk/librawstudio/rs-lens-db-editor.c      2011-09-10 16:42:03 UTC (rev 
4038)
+++ trunk/librawstudio/rs-lens-db-editor.c      2011-09-10 20:22:43 UTC (rev 
4039)
@@ -46,6 +46,7 @@
        GtkWidget *lensfun_model;
        GtkWidget *button;
        GtkWidget *checkbutton_enabled;
+       GtkWidget *checkbutton_defish;
        RSLens *lens;
 } SingleLensData;
 
@@ -121,6 +122,7 @@
                            RS_LENS_DB_EDITOR_LENS_MODEL, lens->Model,
                            RS_LENS_DB_EDITOR_ENABLED_ACTIVATABLE, TRUE,
                            RS_LENS_DB_EDITOR_ENABLED, TRUE,
+                           RS_LENS_DB_EDITOR_DEFISH, FALSE,
                            -1);
 
        RSLens *rs_lens = NULL;
@@ -132,6 +134,7 @@
        rs_lens_set_lensfun_make(rs_lens, lens->Maker);
        rs_lens_set_lensfun_model(rs_lens, lens->Model);
        rs_lens_set_lensfun_enabled(rs_lens, TRUE);
+       rs_lens_set_lensfun_defish(rs_lens, FALSE);
 
        RSLensDb *lens_db = rs_lens_db_get_default();
 
@@ -489,6 +492,34 @@
 }
 
 void
+defish_clicked (GtkCellRendererToggle *cell_renderer_toggle, const gchar 
*path, gpointer user_data)
+{
+       GtkTreeIter iter;
+       gboolean enabled;
+       GtkTreeView *tree_view = GTK_TREE_VIEW(user_data);
+       GtkTreeModel *tree_model = gtk_tree_view_get_model(tree_view);
+       GtkTreePath* tree_path = gtk_tree_path_new_from_string(path);
+
+       gtk_tree_model_get_iter(GTK_TREE_MODEL (tree_model), &iter, tree_path);
+       gtk_tree_model_get(GTK_TREE_MODEL (tree_model), &iter, 
RS_LENS_DB_EDITOR_DEFISH, &enabled, -1);
+
+       gtk_list_store_set(GTK_LIST_STORE (tree_model), &iter, 
RS_LENS_DB_EDITOR_DEFISH, !enabled, -1);
+
+       RSLens *rs_lens = NULL;
+       gtk_tree_model_get (tree_model, &iter,
+                           RS_LENS_DB_EDITOR_LENS, &rs_lens,
+                           -1);
+
+       /* Set enabled/disabled to the selected RSLens */
+       rs_lens_set_lensfun_defish(rs_lens, !enabled);
+
+       RSLensDb *lens_db = rs_lens_db_get_default();
+
+       /* Force save of RSLensDb */
+       rs_lens_db_save(lens_db);
+}
+
+void
 update_lensfun(GtkButton *button, gpointer user_data)
 {
        GtkWidget *window = GTK_WIDGET(user_data);
@@ -556,7 +587,7 @@
 void
 rs_lens_db_editor(void) 
 {
-       GtkTreeModel *tree_model = GTK_TREE_MODEL(gtk_list_store_new(10, 
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, 
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_OBJECT));
+       GtkTreeModel *tree_model = GTK_TREE_MODEL(gtk_list_store_new(11, 
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, 
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 
G_TYPE_OBJECT));
 
        RSLensDb *lens_db = rs_lens_db_get_default();
        fill_model(lens_db, tree_model);
@@ -586,6 +617,7 @@
         GtkCellRenderer *renderer_camera_make = gtk_cell_renderer_text_new();
         GtkCellRenderer *renderer_camera_model = gtk_cell_renderer_text_new();
         GtkCellRenderer *renderer_enabled = gtk_cell_renderer_toggle_new();
+        GtkCellRenderer *renderer_defish = gtk_cell_renderer_toggle_new();
 
         GtkTreeViewColumn *column_lens_make = 
gtk_tree_view_column_new_with_attributes (_("Lens make"),
                                                                  
renderer_lens_make,
@@ -616,6 +648,11 @@
                                                                  "active", 
RS_LENS_DB_EDITOR_ENABLED,
                                                                  
"activatable", RS_LENS_DB_EDITOR_ENABLED_ACTIVATABLE,
                                                                                
   NULL);
+        GtkTreeViewColumn *column_defish = 
gtk_tree_view_column_new_with_attributes (_("Defish"),
+                                                                 
renderer_defish,
+                                                                 "active", 
RS_LENS_DB_EDITOR_DEFISH,
+                                                                 
"activatable", RS_LENS_DB_EDITOR_ENABLED_ACTIVATABLE,
+                                                                               
   NULL);
 
        gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(tree_model), 
RS_LENS_DB_EDITOR_CAMERA_MODEL, GTK_SORT_ASCENDING);
        gtk_tree_sortable_set_sort_func(GTK_TREE_SORTABLE(tree_model), 
RS_LENS_DB_EDITOR_CAMERA_MODEL, rs_lens_db_editor_sort, NULL, NULL);
@@ -625,6 +662,7 @@
 
         g_signal_connect (renderer_enabled, "toggled",
                          G_CALLBACK (toggle_clicked), view);
+                       g_signal_connect (renderer_defish, "toggled", 
G_CALLBACK (defish_clicked), view);
                g_signal_connect(G_OBJECT(view), "button-press-event", 
G_CALLBACK(view_on_button_pressed), NULL);
                g_signal_connect(view, "popup-menu", (GCallback) 
view_popupmenu, NULL);
 
@@ -635,6 +673,7 @@
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_camera_make);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), 
column_camera_model);
         gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_enabled);
+        gtk_tree_view_append_column (GTK_TREE_VIEW (view), column_defish);
 
         gtk_tree_view_set_headers_visible(GTK_TREE_VIEW (view), TRUE);
 
@@ -672,6 +711,7 @@
                 gchar *camera_make;
                 gchar *camera_model;
                gboolean enabled;
+               gboolean defish;
 
                 RSLens *lens = list->data;
 
@@ -687,6 +727,7 @@
                             "camera-make", &camera_make,
                             "camera-model", &camera_model,
                             "enabled", &enabled,
+                            "defish", &defish,
                             NULL);
 
                const gchar *human_focal = rs_human_focal(min_focal, max_focal);
@@ -708,6 +749,7 @@
                                    RS_LENS_DB_EDITOR_CAMERA_MAKE, camera_make,
                                    RS_LENS_DB_EDITOR_CAMERA_MODEL, 
camera_model,
                                    RS_LENS_DB_EDITOR_ENABLED, enabled,
+                                   RS_LENS_DB_EDITOR_DEFISH, defish,
                                    RS_LENS_DB_EDITOR_ENABLED_ACTIVATABLE, 
enabled_activatable,
                                    RS_LENS_DB_EDITOR_LENS, lens,
                                    -1);
@@ -898,6 +940,13 @@
 }
 
 void
+defish_lens(GtkCheckButton *checkbutton, gpointer user_data)
+{
+       RSLens *lens = user_data;
+       rs_lens_set_lensfun_defish(lens, 
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton)));
+}
+
+void
 open_full_lens_editor(GtkCheckButton *checkbutton, gpointer user_data)
 {
        rs_lens_db_editor();
@@ -920,6 +969,7 @@
        gchar *camera_make;
        gchar *camera_model;
        gboolean enabled;
+       gboolean defish;
 
        g_assert(RS_IS_LENS(lens));
        g_object_get(lens,
@@ -933,6 +983,7 @@
                     "camera-make", &camera_make,
                     "camera-model", &camera_model,
                     "enabled", &enabled,
+                    "defish", &defish,
                     NULL);
        
        GtkWidget *editor = gtk_dialog_new();
@@ -993,7 +1044,9 @@
        GtkWidget *label_camera_make = gtk_label_new(camera_make);
        GtkWidget *label_camera_model = gtk_label_new(camera_model);
        GtkWidget *checkbutton_enabled = 
gtk_check_button_new_with_label(_("Enable this lens"));
+       GtkWidget *checkbutton_defish = 
gtk_check_button_new_with_label(_("Enable Defish"));
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_enabled), 
rs_lens_get_lensfun_enabled(lens));
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbutton_defish), 
rs_lens_get_lensfun_defish(lens));
 
        GtkWidget *button_set_lens = gtk_button_new_with_label(_("Set lens"));
 
@@ -1006,6 +1059,7 @@
        single_lens_data->lens = lens;
        single_lens_data->button = button_set_lens;
        single_lens_data->checkbutton_enabled = checkbutton_enabled;
+       single_lens_data->checkbutton_defish = checkbutton_defish;
 
        g_signal_connect(button_set_lens, "clicked", G_CALLBACK(set_lens), 
single_lens_data);
 
@@ -1026,7 +1080,8 @@
        gtk_table_attach_defaults(GTK_TABLE(table), label_lensfun_model, 
1,2,7,8);
        gtk_table_attach_defaults(GTK_TABLE(table), button_set_lens, 1,2,6,8);
        gtk_table_attach_defaults(GTK_TABLE(table), sep2, 0,2,8,9);
-       gtk_table_attach_defaults(GTK_TABLE(table), checkbutton_enabled, 
0,2,9,10);
+       gtk_table_attach_defaults(GTK_TABLE(table), checkbutton_enabled, 
0,1,9,10);
+       gtk_table_attach_defaults(GTK_TABLE(table), checkbutton_defish, 
1,2,9,10);
 
        /* Set spacing around separator in table */
        gtk_table_set_row_spacing(GTK_TABLE(table), 4, 10);
@@ -1043,6 +1098,7 @@
        gtk_container_add (GTK_CONTAINER (frame), table);
 
        g_signal_connect(checkbutton_enabled, "toggled", 
G_CALLBACK(enable_lens), lens);
+       g_signal_connect(checkbutton_defish, "toggled", 
G_CALLBACK(defish_lens), lens);
 
        /* FIXME: Put lensfun update button in editor - for this to work, we 
cannot close the window when updating */
 //     GtkWidget *button_update_lensfun = gtk_button_new_with_label(_("Update 
lensfun database"));

Modified: trunk/librawstudio/rs-lens-db-editor.h
===================================================================
--- trunk/librawstudio/rs-lens-db-editor.h      2011-09-10 16:42:03 UTC (rev 
4038)
+++ trunk/librawstudio/rs-lens-db-editor.h      2011-09-10 20:22:43 UTC (rev 
4039)
@@ -29,6 +29,7 @@
        RS_LENS_DB_EDITOR_CAMERA_MAKE,
        RS_LENS_DB_EDITOR_CAMERA_MODEL,
        RS_LENS_DB_EDITOR_ENABLED,
+       RS_LENS_DB_EDITOR_DEFISH,
        RS_LENS_DB_EDITOR_ENABLED_ACTIVATABLE,
        RS_LENS_DB_EDITOR_LENS
 };

Modified: trunk/librawstudio/rs-lens-db.c
===================================================================
--- trunk/librawstudio/rs-lens-db.c     2011-09-10 16:42:03 UTC (rev 4038)
+++ trunk/librawstudio/rs-lens-db.c     2011-09-10 20:22:43 UTC (rev 4039)
@@ -137,6 +137,7 @@
                gchar *camera_make;
                gchar *camera_model;
                gboolean enabled;
+               gboolean defish;
 
                RSLens *lens = list->data;
 
@@ -152,6 +153,7 @@
                        "camera-make", &camera_make,
                        "camera-model", &camera_model,
                        "enabled", &enabled,
+                       "defish", &defish,
                        NULL);
 
                xmlTextWriterStartElement(writer, BAD_CAST "lens");
@@ -177,6 +179,7 @@
                                xmlTextWriterWriteFormatElement(writer, 
BAD_CAST "enabled", "%s", "TRUE");
                        if (!enabled)
                                xmlTextWriterWriteFormatElement(writer, 
BAD_CAST "enabled", "%s", "FALSE");
+                       xmlTextWriterWriteFormatElement(writer, BAD_CAST 
"defish", "%s", defish ? "TRUE": "FALSE");
                xmlTextWriterEndElement(writer);
 
                g_free(identifier);
@@ -258,6 +261,11 @@
                                                        enabled = TRUE;
                                                g_object_set(lens, "enabled", 
enabled, NULL);
                                        }
+                                       else if ((!xmlStrcmp(entry->name, 
BAD_CAST "defish")))
+                                       {
+                                               gboolean defish = 
g_strcmp0((gchar *) val, "TRUE") == 0;
+                                               g_object_set(lens, "defish", 
defish, NULL);
+                                       }
                                        xmlFree(val);
                                        entry = entry->next;
                                }

Modified: trunk/librawstudio/rs-lens.c
===================================================================
--- trunk/librawstudio/rs-lens.c        2011-09-10 16:42:03 UTC (rev 4038)
+++ trunk/librawstudio/rs-lens.c        2011-09-10 20:22:43 UTC (rev 4039)
@@ -34,6 +34,7 @@
        gchar *camera_make;
        gchar *camera_model;
        gboolean enabled;
+       gboolean defish;
 };
 
 G_DEFINE_TYPE (RSLens, rs_lens, G_TYPE_OBJECT)
@@ -50,7 +51,8 @@
        PROP_LENSFUN_MODEL,
        PROP_CAMERA_MAKE,
        PROP_CAMERA_MODEL,
-       PROP_ENABLED
+       PROP_ENABLED,
+       PROP_DEFISH
 };
 
 static void
@@ -93,6 +95,9 @@
                case PROP_ENABLED:
                        g_value_set_boolean(value, lens->enabled);
                        break;
+               case PROP_DEFISH:
+                       g_value_set_boolean(value, lens->defish);
+                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, 
pspec);
        }
@@ -140,6 +145,9 @@
                case PROP_ENABLED:
                        lens->enabled = g_value_get_boolean(value);
                        break;
+               case PROP_DEFISH:
+                       lens->defish = g_value_get_boolean(value);
+                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, 
pspec);
        }
@@ -223,6 +231,12 @@
                PROP_ENABLED, g_param_spec_boolean(
                "enabled", "enabled", "Specify whether the lens should be 
corrected or not",
                FALSE, G_PARAM_READWRITE));
+
+               g_object_class_install_property(object_class,
+               PROP_DEFISH, g_param_spec_boolean(
+               "defish", "defish", "Specify whether fisheye distortion should 
be corrected or not",
+               FALSE, G_PARAM_READWRITE));
+
 }
 
 static void
@@ -240,6 +254,7 @@
        lens->camera_make = NULL;
        lens->camera_model = NULL;
        lens->enabled = FALSE;
+       lens->defish = FALSE;
 }
 
 /**
@@ -367,3 +382,19 @@
 
        return lens->enabled;
 }
+
+void
+rs_lens_set_lensfun_defish(RSLens *lens, gboolean enabled)
+{
+       g_assert(RS_IS_LENS(lens));
+
+       lens->defish = enabled;
+}
+
+gboolean
+rs_lens_get_lensfun_defish(RSLens *lens)
+{
+       g_assert(RS_IS_LENS(lens));
+
+       return lens->defish;
+}

Modified: trunk/librawstudio/rs-lens.h
===================================================================
--- trunk/librawstudio/rs-lens.h        2011-09-10 16:42:03 UTC (rev 4038)
+++ trunk/librawstudio/rs-lens.h        2011-09-10 20:22:43 UTC (rev 4039)
@@ -77,6 +77,8 @@
 void rs_lens_set_lensfun_model(RSLens *lens, gchar *model);
 void rs_lens_set_lensfun_enabled(RSLens *lens, gboolean enabled);
 gboolean rs_lens_get_lensfun_enabled(RSLens *lens);
+void rs_lens_set_lensfun_defish(RSLens *lens, gboolean enabled);
+gboolean rs_lens_get_lensfun_defish(RSLens *lens);
 
 G_END_DECLS
 

Modified: trunk/plugins/lensfun/lensfun.c
===================================================================
--- trunk/plugins/lensfun/lensfun.c     2011-09-10 16:42:03 UTC (rev 4038)
+++ trunk/plugins/lensfun/lensfun.c     2011-09-10 20:22:43 UTC (rev 4039)
@@ -53,6 +53,7 @@
        gfloat tca_kb;
        gfloat vignetting;
        gboolean distortion_enabled;
+       gboolean defish;
 
        lfLens *selected_lens;
        const lfCamera *selected_camera;
@@ -79,6 +80,7 @@
        PROP_TCA_KB,
        PROP_VIGNETTING,
        PROP_DISTORTION_ENABLED,
+       PROP_DEFISH,
 };
 
 static void get_property (GObject *object, guint property_id, GValue *value, 
GParamSpec *pspec);
@@ -166,6 +168,11 @@
                        "distortion-enabled", "distortion-enabled", 
"distortion-enabled",
                   FALSE, G_PARAM_READWRITE)
        );
+       g_object_class_install_property(object_class,
+               PROP_DISTORTION_ENABLED, g_param_spec_boolean(
+                       "defish", "defish", "defish",
+                  FALSE, G_PARAM_READWRITE)
+       );
        
        filter_class->name = "Lensfun filter";
        filter_class->get_image = get_image;
@@ -187,6 +194,7 @@
        lensfun->tca_kb = 0.0;
        lensfun->vignetting = 0.0;
        lensfun->distortion_enabled = FALSE;
+       lensfun->defish = FALSE;
 
        /* Initialize Lensfun database */
        lensfun->ldb = lf_db_new ();
@@ -233,6 +241,9 @@
                case PROP_DISTORTION_ENABLED:
                        g_value_set_boolean(value, lensfun->distortion_enabled);
                        break;
+               case PROP_DEFISH:
+                       g_value_set_boolean(value, lensfun->defish);
+                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, 
pspec);
        }
@@ -284,6 +295,11 @@
                        lensfun->distortion_enabled = 
g_value_get_boolean(value);
                        rs_filter_changed(RS_FILTER(lensfun), 
RS_FILTER_CHANGED_PIXELDATA);
                        break;
+               case PROP_DEFISH:
+                       lensfun->DIRTY = TRUE;
+                       lensfun->defish = g_value_get_boolean(value);
+                       rs_filter_changed(RS_FILTER(lensfun), 
RS_FILTER_CHANGED_PIXELDATA);
+                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, 
pspec);
        }
@@ -533,6 +549,7 @@
                }
 
                lensfun->distortion_enabled = 
rs_lens_get_lensfun_enabled(lensfun->lens);               
+               lensfun->defish = rs_lens_get_lensfun_defish(lensfun->lens);    
        
                if ((!lensfun->selected_lens || !lensfun->distortion_enabled) 
&& lensfun->selected_camera)
                {
 //                     g_debug("Lensfun: Lens not found or lens is disabled. 
Using neutral lense.");
@@ -583,7 +600,6 @@
        if (lensfun->selected_lens && lf_lens_check((lfLens *) 
lensfun->selected_lens))
        {
                gint effective_flags;
-
                /* Set TCA */
                if (ABS(lensfun->tca_kr) > 0.01f || ABS(lensfun->tca_kb) > 
0.01f) 
                {
@@ -637,12 +653,13 @@
                        lensfun->aperture, /* aperture */
                        1.0, /* distance */
                        1.0, /* scale */
-                       LF_UNKNOWN, /* lfLensType targeom, */ /* FIXME: ? */
+                       lensfun->defish ? LF_RECTILINEAR : LF_UNKNOWN, /* 
lfLensType targeom, */
                        LF_MODIFY_ALL, /* flags */ /* FIXME: ? */
                        FALSE); /* reverse */
-
+#if 0
                /* Print flags used */
-#if 0
+               g_debug("defish:%d", (int)lensfun->defish);
+               g_debug("crop:%f, focal:%f, aperture:%f ", 
lensfun->selected_camera->CropFactor, lensfun->focal, lensfun->aperture);
                GString *flags = g_string_new("");
                if (effective_flags & LF_MODIFY_TCA)
                        g_string_append(flags, " LF_MODIFY_TCA");


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

Reply via email to