Update of /cvsroot/ufraw/ufraw
In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv3923

Modified Files:
        Doxyfile uf_gtk.cc uf_gtk.h ufobject.cc ufobject.h ufraw.h 
        ufraw_lens_ui.c ufraw_lensfun.cc ufraw_preview.c 
        ufraw_settings.cc ufraw_ufraw.c ufraw_ui.h 
Log Message:
Add ufFocalLength, ufAperture, ufDistance UFObjects.


Index: Doxyfile
===================================================================
RCS file: /cvsroot/ufraw/ufraw/Doxyfile,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- Doxyfile    27 Jan 2010 21:23:22 -0000      1.1
+++ Doxyfile    26 Feb 2010 07:01:04 -0000      1.2
@@ -568,7 +568,7 @@
 # directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
-INPUT                  = ufobject.h ufraw.h uf_gtk.h ufraw_settings.cc
+INPUT                  = ufobject.h ufraw.h uf_gtk.h ufraw_settings.cc 
ufraw_lensfun.cc
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -1257,7 +1257,7 @@
 # undefined via #undef or recursively expanded use the := operator
 # instead of the = operator.
 
-PREDEFINED             = __cplusplus
+PREDEFINED             = __cplusplus HAVE_LENSFUN
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
 # this tag can be used to specify a list of macro names that should be 
expanded.

Index: ufobject.cc
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufobject.cc,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- ufobject.cc 24 Feb 2010 00:24:15 -0000      1.5
+++ ufobject.cc 26 Feb 2010 07:01:04 -0000      1.6
@@ -199,18 +199,17 @@
 public:
     double Number;
     double Default;
-    _UFNumber(UFName name, double number, double minimum, double maximum,
-           double defaultValue, int accuracyDigits,
-           double step, double jump) :
+    _UFNumber(UFName name, double defaultValue, double minimum, double maximum,
+           int accuracyDigits, double step, double jump) :
        _UFNumberCommon(name, minimum, maximum, accuracyDigits, step, jump),
-       Number(number), Default(defaultValue) { }
+       Number(defaultValue), Default(defaultValue) { }
 };
 
 #define ufnumber (static_cast<_UFNumber *>(ufobject))
 
 UFNumber::UFNumber(UFName name, double minimum, double maximum,
        double defaultValue, int accuracyDigits, double step, double jump) :
-    UFObject(new _UFNumber(name, defaultValue, minimum, maximum, defaultValue,
+    UFObject(new _UFNumber(name, defaultValue, minimum, maximum,
            accuracyDigits, step, jump)) { }
 
 const char *UFNumber::StringValue() const {
@@ -614,6 +613,14 @@
        const char *indent, const char *attribute) {
     if (group.IsDefault())
        return "";
+    if (strcmp(attribute, "Index") == 0 && // If object is a UFArray and
+           group.UFGroup::IsDefault()) { // all the array elements are default
+       // Just print the value in a simple format.
+       char *value = g_markup_escape_text(group.StringValue(), -1);
+       std::string xml = (std::string)indent + "<" + group.Name() + ">" +
+               value + "</" + group.Name() + ">\n";
+       return xml;
+    }
     std::string xml = "";
     // For now, we don't want to surround the root XML with <[/]Image> tags.
     if (strlen(indent) != 0) {
@@ -728,7 +735,6 @@
        }
     }
     _UFGROUP_PARENT(object) = ufgroup;
-    ufgroup->CallValueChangedEvent(this);
     return *this;
 }
 
@@ -749,6 +755,16 @@
     return *dropObject;
 }
 
+void UFGroup::Clear() {
+    for (_UFGroupMap::iterator iter = ufgroup->Map.begin();
+           iter != ufgroup->Map.end(); iter++) {
+       _UFGROUP_PARENT(iter->second) = NULL;
+       delete iter->second;
+    }
+    ufgroup->Map.clear();
+    ufgroup->List.clear();
+}
+
 // object is a <UFObject *> and generally not a <UFArray *>.
 // The cast to <UFArray *> is needed for accessing ufobject.
 #define _UFARRAY_PARENT(object) static_cast<UFArray 
*>(object)->ufobject->Parent
@@ -816,16 +832,12 @@
 }
 
 bool UFArray::SetIndex(int index) {
-    if (ufgroup->Index == index)
-       return true;
-    ufgroup->Index = index;
     _UFGroupList::iterator iter = ufgroup->List.begin();
     std::advance(iter, index);
     if (iter == ufgroup->List.end())
        return false;
-    g_free(ufgroup->String);
-    ufgroup->String = g_strdup((*iter)->StringValue());
-    ufgroup->CallValueChangedEvent(this);
+    ufgroup->Index = index;
+    Set((*iter)->StringValue());
     return true;
 }
 
@@ -864,7 +876,6 @@
        }
     }
     _UFARRAY_PARENT(object) = ufgroup;
-    ufgroup->CallValueChangedEvent(this);
     return *this;
 }
 

Index: uf_gtk.cc
===================================================================
RCS file: /cvsroot/ufraw/ufraw/uf_gtk.cc,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- uf_gtk.cc   22 Feb 2010 23:27:20 -0000      1.19
+++ uf_gtk.cc   26 Feb 2010 07:01:04 -0000      1.20
@@ -417,9 +417,14 @@
        gtk_combo_box_set_active(combo, array.Index());
        return;
     }
-    // If value not found activate first entry
-    g_warning("_ufarray_object_event() value not found");
-    gtk_combo_box_set_active(combo, 0);
+    if (GTK_IS_COMBO_BOX_ENTRY(combo)) {
+       GtkWidget *entry = gtk_bin_get_child(GTK_BIN(combo));
+       gtk_entry_set_text(GTK_ENTRY(entry), array.StringValue());
+    } else { // GTK_IS_COMBO_BOX()
+       // If value not found activate first entry
+       g_warning("_ufarray_object_event() value not found");
+       gtk_combo_box_set_active(combo, 0);
+    }
 }
 
 /* Return the widget-data for the object.
@@ -565,25 +570,47 @@
     _ufobject_reset_button_state(object);
 }
 
-// Create a new ComboBox text with small width.
-// The widget must be added with GTK_EXPAND|GTK_FILL.
-GtkWidget *ufarray_combo_box_new(UFObject *object) {
+static void _ufarray_entry_changed(GtkWidget *entry, UFObject *object) {
+    UFArray &array = *object;
+    array.Set(gtk_entry_get_text(GTK_ENTRY(entry)));
+    _ufobject_reset_button_state(object);
+}
+
+GtkWidget *_ufarray_combo_box_new(UFObject *object, GtkWidget *combo) {
     UFArray &array = *object;
     _UFWidgetData &data = _ufarray_widget_data(array);
-    GtkWidget *combo = gtk_combo_box_new_text();
     gtk_widget_set_size_request(combo, 50, -1);
     data.gobject[0] = G_OBJECT(combo);
-    g_signal_connect_after(G_OBJECT(combo), "changed",
-       G_CALLBACK(_ufarray_combo_changed), object);
-    int saveIndex = array.Index();
+    char *saveIndex = g_strdup(array.StringValue());
     int i = 0;
     while (array.SetIndex(i)) {
        gtk_combo_box_append_text(GTK_COMBO_BOX(combo), _(array.StringValue()));
        i++;
     }
-    array.SetIndex(saveIndex);
+    array.Set(saveIndex);
+    g_free(saveIndex);
     _ufarray_object_event(object, uf_value_changed);
+    gtk_widget_set_sensitive(combo, i > 0);
     return combo;
 }
 
+// Create a new ComboBox with small width.
+// The widget must be added with GTK_EXPAND|GTK_FILL.
+GtkWidget *ufarray_combo_box_new(UFObject *object) {
+    GtkWidget *combo = gtk_combo_box_new_text();
+    g_signal_connect_after(G_OBJECT(combo), "changed",
+       G_CALLBACK(_ufarray_combo_changed), object);
+    return _ufarray_combo_box_new(object, combo);
+}
+
+// Create a new ComboBoxEntry with small width.
+// The widget must be added with GTK_EXPAND|GTK_FILL.
+GtkWidget *ufarray_combo_box_entry_new(UFObject *object) {
+    GtkWidget *combo = gtk_combo_box_entry_new_text();
+    GtkWidget *entry = gtk_bin_get_child(GTK_BIN(combo));
+    g_signal_connect_after(G_OBJECT(entry), "changed",
+       G_CALLBACK(_ufarray_entry_changed), object);
+    return _ufarray_combo_box_new(object, combo);
+}
+
 } // extern "C"

Index: uf_gtk.h
===================================================================
RCS file: /cvsroot/ufraw/ufraw/uf_gtk.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- uf_gtk.h    21 Feb 2010 10:03:55 -0000      1.10
+++ uf_gtk.h    26 Feb 2010 07:01:04 -0000      1.11
@@ -68,6 +68,7 @@
 void ufobject_reset_button_add(GtkWidget *button, UFObject *object);
 GtkWidget *ufstring_combo_box_new(UFObject *object);
 GtkWidget *ufarray_combo_box_new(UFObject *object);
+GtkWidget *ufarray_combo_box_entry_new(UFObject *object);
 
 #ifdef  __cplusplus
 }

Index: ufraw_settings.cc
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_settings.cc,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- ufraw_settings.cc   23 Feb 2010 19:36:43 -0000      1.7
+++ ufraw_settings.cc   26 Feb 2010 07:01:04 -0000      1.8
@@ -213,13 +213,6 @@
     }
 };
 
-#ifdef HAVE_LENSFUN
-class Lensfun : public UFGroup {
-public:
-    Lensfun();
-};
-#endif
-
 // ufRawImage is short for 'raw image processing parameters'.
 extern "C" { UFName ufRawImage = "Image"; }
 Image::Image(UFObject *root) : UFGroup(ufRawImage), uf(NULL) {
@@ -232,7 +225,7 @@
     ;
 #ifdef HAVE_LENSFUN
     if (root == NULL || root->Name() != ufRawResources)
-       *this << new Lensfun; // Lensfun data is not saved to .ufrawrc
+       *this << ufraw_lensfun_new(); // Lensfun data is not saved to .ufrawrc
 #else
     (void)root;
 #endif

Index: ufraw_lens_ui.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_lens_ui.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- ufraw_lens_ui.c     22 Feb 2010 01:07:23 -0000      1.34
+++ ufraw_lens_ui.c     26 Feb 2010 07:01:04 -0000      1.35
@@ -15,9 +15,7 @@
 #include "uf_gtk.h"
 #include "ufraw_ui.h"
 #include <glib/gi18n.h>
-#include <string.h>
 #include <ctype.h>
-#include <math.h>
 
 #ifdef HAVE_LENSFUN
 
@@ -27,82 +25,6 @@
     gtk_widget_destroy(widget);
 }
 
-/**
- * Add a labeled GtkComboBoxEntry to a table or to a box.
- */
-static GtkComboBoxEntry *combo_entry_text(GtkWidget *container,
-       guint x, guint y, gchar *lbl, gchar *tip)
-{
-    GtkWidget *label = gtk_label_new(lbl);
-    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
-    if (GTK_IS_TABLE(container))
-       gtk_table_attach(GTK_TABLE(container), label, x, x + 1, y, y + 1,
-               0, 0, 2, 0);
-    else if (GTK_IS_BOX(container))
-       gtk_box_pack_start(GTK_BOX(container), label, FALSE, FALSE, 2);
-    uf_widget_set_tooltip(label, tip);
-
-    GtkWidget *combo = gtk_combo_box_entry_new_text();
-    if (GTK_IS_TABLE(container))
-       gtk_table_attach(GTK_TABLE(container), combo, x+1, x+2, y, y+1,
-               0, 0, 2, 0);
-    else if (GTK_IS_BOX(container))
-       gtk_box_pack_start(GTK_BOX(container), combo, FALSE, FALSE, 2);
-    uf_widget_set_tooltip(combo, tip);
-
-    return GTK_COMBO_BOX_ENTRY(combo);
-}
-
-/* simple function to compute the floating-point precision
-   which is enough for "normal use". The criteria is to have
-   2 or 3 significant digits. */
-static int precision(double x)
-{
-    if (x > 10.0 && (int)(10*x)%10 != 0)
-       // Support focal length such as 10.5mm fisheye.
-       return MAX(-floor(log(x) / log(10) - 1.99), 0);
-    else
-       return MAX(-floor(log(x) / log(10) - 0.99), 0);
-}
-
-static GtkComboBoxEntry *combo_entry_numeric(GtkWidget *container,
-       guint x, guint y, gchar *lbl, gchar *tip,
-       gdouble val, gdouble *values, int nvalues)
-{
-    int i;
-    char txt[30];
-    GtkComboBoxEntry *combo = combo_entry_text(container, x, y, lbl, tip);
-    GtkEntry *entry = GTK_ENTRY(GTK_BIN(combo)->child);
-
-    gtk_entry_set_width_chars(entry, 4);
-
-    snprintf(txt, sizeof(txt), "%.*f", precision(val), val);
-    gtk_entry_set_text(entry, txt);
-
-    for (i = 0; i < nvalues; i++) {
-       gdouble v = values[i];
-       snprintf(txt, sizeof(txt), "%.*f", precision(v), v);
-       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), txt);
-    }
-    return combo;
-}
-
-static GtkComboBoxEntry *combo_entry_numeric_log(GtkWidget *container,
-       guint x, guint y, gchar *lbl, gchar *tip,
-       gdouble val, gdouble min, gdouble max, gdouble step)
-{
-    int i, nvalues = (int)ceil(log(max/min) / log(step)) + 1;
-    gdouble *values = g_new(gdouble, nvalues);
-    values[0] = min;
-    for (i=1; i < nvalues; i++)
-       values[i] = values[i-1] * step;
-
-    GtkComboBoxEntry *combo = combo_entry_numeric(container, x, y,
-           lbl, tip, val, values, nvalues);
-    g_free(values);
-    return combo;
-}
-
 static void camera_set(preview_data *data)
 {
     const char *maker = lf_mlstr_get(CFG->camera->Maker);
@@ -257,47 +179,21 @@
            CFG->cur_lens_type);
 }
 
-void ufraw_lensfun_interpolate(UFObject *lensfun, const lfLens *lens);
-
-static void lens_interpolate(preview_data *data, const lfLens *lens)
-{
-    /* Interpolate all models and set the temp values accordingly */
-    UFObject *lensfun = ufgroup_element(CFG->ufobject, ufLensfun);
-    ufraw_lensfun_interpolate(lensfun, lens);
-    lens_update_controls(data);
-}
-
-static void lens_combo_entry_update(GtkComboBox *widget, float *valuep)
+static void combo_entry_new(UFObject *object, GtkWidget *box,
+       const char *labelText, const char *tooltip)
 {
-    preview_data *data = get_preview_data(widget);
-    char *text = gtk_combo_box_get_active_text(widget);
-    if (sscanf(text, "%f", valuep) == 1)
-       lens_interpolate(data, CFG->lens);
-    g_free(text);
+    GtkWidget *label = gtk_label_new(labelText);
+    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
+    gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 2);
+    GtkWidget *combo = ufarray_combo_box_entry_new(object);
+    gtk_box_pack_start(GTK_BOX(box), combo, TRUE, TRUE, 2);
+    uf_widget_set_tooltip(label, tooltip);
 }
 
-static void lens_set(preview_data *data, const lfLens *lens)
+static void lens_set(preview_data *data)
 {
     gchar *fm;
-    GtkComboBoxEntry *combo;
-    unsigned i;
-    static gdouble focal_values[] = {
-       4.5, 8, 10, 12, 14, 15, 16, 17, 18, 20, 24, 28, 30, 31, 35, 38, 40, 43,
-       45, 50, 55, 60, 70, 75, 77, 80, 85, 90, 100, 105, 110, 120, 135,
-       150, 200, 210, 240, 250, 300, 400, 500, 600, 800, 1000
-    };
-    static gdouble aperture_values[] = {
-       1, 1.2, 1.4, 1.7, 2, 2.4, 2.8, 3.4, 4, 4.8, 5.6, 6.7,
-       8, 9.5, 11, 13, 16, 19, 22, 27, 32, 38, 45
-    };
-
-    if (lens == NULL) {
-       gtk_entry_set_text(GTK_ENTRY(data->LensModel), "");
-       uf_widget_set_tooltip(data->LensModel, NULL);
-       return;
-    }
-    if (CFG->lens != lens)
-       lf_lens_copy(CFG->lens, lens);
+    lfLens *lens = CFG->lens;
 
     const char *maker = lf_mlstr_get(lens->Maker);
     const char *model = lf_mlstr_get(lens->Model);
@@ -324,14 +220,15 @@
     else
        snprintf(aperture, sizeof(aperture), "%g", lens->MinAperture);
 
-    mounts[0] = 0;
-    if (lens->Mounts != NULL)
+    if (lens->Mounts != NULL) {
+       mounts[0] = 0;
+       unsigned i;
        for (i = 0; lens->Mounts[i] != NULL; i++) {
            if (i > 0)
                g_strlcat(mounts, ", ", sizeof(mounts));
            g_strlcat(mounts, lens->Mounts[i], sizeof(mounts));
        }
-
+    }
     fm = g_strdup_printf(_("Maker:\t\t%s\n"
                           "Model:\t\t%s\n"
                           "Focal range:\t%s\n"
@@ -348,51 +245,32 @@
     /* Create the focal/aperture/distance combo boxes */
     gtk_container_foreach(GTK_CONTAINER(data->LensParamBox),
            delete_children, NULL);
+    UFObject *lensfun = ufgroup_element(CFG->ufobject, ufLensfun);
 
-    int ffi = 0, fli = -1;
-    for (i = 0; i < sizeof(focal_values) / sizeof(gdouble); i++) {
-       if (focal_values[i] < lens->MinFocal)
-           ffi = i + 1;
-       if (focal_values[i] > lens->MaxFocal && fli == -1)
-           fli = i;
-    }
-    if (lens->MaxFocal == 0 || fli < 0)
-       fli = sizeof(focal_values) / sizeof(gdouble);
-    if (fli < ffi)
-       fli = ffi + 1;
-    combo = combo_entry_numeric(data->LensParamBox, 0, 0,
-           _("Focal"), _("Focal length"),
-           CFG->focal_len, focal_values + ffi, fli - ffi);
-    g_signal_connect(G_OBJECT(combo), "changed",
-           G_CALLBACK(lens_combo_entry_update), &CFG->focal_len);
-
-    ffi = 0;
-    for (i = 0; i < sizeof(aperture_values) / sizeof(gdouble); i++)
-       if (aperture_values[i] < lens->MinAperture)
-           ffi = i + 1;
-    combo = combo_entry_numeric(data->LensParamBox, 0, 0,
-           _("F"), _("F-number (Aperture)"),
-           CFG->aperture, aperture_values + ffi,
-           sizeof(aperture_values) / sizeof(gdouble) - ffi);
-    g_signal_connect(G_OBJECT(combo), "changed",
-           G_CALLBACK(lens_combo_entry_update), &CFG->aperture);
-
-    combo = combo_entry_numeric_log(data->LensParamBox, 0, 0,
-           _("Distance"), _("Distance to subject"),
-           CFG->subject_distance, 0.25, 1000, sqrt(2));
-    g_signal_connect(G_OBJECT(combo), "changed",
-           G_CALLBACK(lens_combo_entry_update), &CFG->subject_distance);
+    UFObject *FocalLength = ufgroup_element(lensfun, ufFocalLength);
+    combo_entry_new(FocalLength, data->LensParamBox,
+           _("Focal"), _("Focal length"));
+    UFObject *Aperture = ufgroup_element(lensfun, ufAperture);
+    combo_entry_new(Aperture, data->LensParamBox,
+           _("F"), _("F-number (Aperture)"));
+    UFObject *Distance = ufgroup_element(lensfun, ufDistance);
+    combo_entry_new(Distance, data->LensParamBox,
+           _("Distance"), _("Distance to subject in meters"));
 
     gtk_widget_show_all(data->LensParamBox);
 
     CFG->cur_lens_type = LF_UNKNOWN;
 }
 
+void ufraw_lensfun_interpolate(UFObject *lensfun, const lfLens *lens);
+
 static void lens_menu_select(GtkMenuItem *menuitem, preview_data *data)
 {
     lfLens *lens = (lfLens *)g_object_get_data(G_OBJECT(menuitem), "lfLens");
-    lens_set(data, lens);
-    lens_interpolate(data, lens);
+    UFObject *lensfun = ufgroup_element(CFG->ufobject, ufLensfun);
+    ufraw_lensfun_interpolate(lensfun, lens);
+    lens_set(data);
+    lens_update_controls(data);
 }
 
 static void lens_menu_fill(preview_data *data, const lfLens *const *lenslist)
@@ -693,7 +571,6 @@
        gtk_label_set_text(GTK_LABEL(data->LensFromGeometryDesc), details);
 
     ufraw_invalidate_layer(data->UF, ufraw_transform_phase);
-    resize_canvas(data);
     render_preview(data);
 }
 
@@ -767,14 +644,6 @@
            G_CALLBACK(geometry_model_changed), data);
 }
 
-static void ufraw_lensfun_changed(UFObject *obj, UFEventType type)
-{
-    if (type != uf_value_changed)
-        return;
-    preview_data *data = ufobject_user_data(obj);
-    resize_canvas(data);
-}
-
 /**
  * Fill the "lens correction" page in the main notebook.
  */
@@ -782,11 +651,6 @@
 {
     GtkWidget *label, *button, *subpage;
 
-    UFObject *image = CFG->ufobject;
-    UFObject *lensfun = ufgroup_element(image, ufLensfun);
-    ufobject_set_user_data(lensfun, data);
-    ufobject_set_changed_event_handle(lensfun, ufraw_lensfun_changed);
-
     /* Camera selector */
     GtkTable *table = GTK_TABLE(gtk_table_new(10, 10, FALSE));
     gtk_box_pack_start(GTK_BOX(page), GTK_WIDGET(table), FALSE, FALSE, 0);
@@ -840,7 +704,7 @@
 
     /* Create a default lens & camera */
     camera_set(data);
-    lens_set(data, CFG->lens);
+    lens_set(data);
 
     subpage = notebook_page_new(subnb,
            _("Lateral chromatic aberration"), "tca");

Index: ufraw_preview.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_preview.c,v
retrieving revision 1.344
retrieving revision 1.345
diff -u -d -r1.344 -r1.345
--- ufraw_preview.c     24 Feb 2010 18:00:19 -0000      1.344
+++ ufraw_preview.c     26 Feb 2010 07:01:04 -0000      1.345
@@ -874,6 +874,8 @@
     render_status_text(data);
 }
 
+void resize_canvas(preview_data *data);
+
 static gboolean render_preview_now(preview_data *data)
 {
     if (data->FreezeDialog)
@@ -883,6 +885,9 @@
        ;
     data->RenderSubArea = 0;
 
+    if (data->UF->Images[ufraw_transform_phase].invalidate_event)
+       resize_canvas(data);
+
     if (CFG->autoExposure == apply_state) {
        ufraw_invalidate_layer(data->UF, ufraw_develop_phase);
        ufraw_auto_expose(data->UF);
@@ -3103,7 +3108,6 @@
            CFG->orientation != CFG->CameraOrientation);
 
     ufraw_invalidate_layer(data->UF, ufraw_transform_phase);
-    resize_canvas(data);
     render_preview(data);
 }
 

Index: ufraw.h
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw.h,v
retrieving revision 1.151
retrieving revision 1.152
diff -u -d -r1.151 -r1.152
--- ufraw.h     22 Feb 2010 23:27:20 -0000      1.151
+++ ufraw.h     26 Feb 2010 07:01:04 -0000      1.152
@@ -66,6 +66,9 @@
 extern UFName ufGreen;
 extern UFName ufChannelMultipliers;
 extern UFName ufLensfun;
+extern UFName ufFocalLength;
+extern UFName ufAperture;
+extern UFName ufDistance;
 extern UFName ufTCA;
 extern UFName ufVignetting;
 extern UFName ufDistortion;
@@ -79,6 +82,9 @@
 #endif // __cplusplus
 
 UFObject *ufraw_image_new();
+#ifdef HAVE_LENSFUN
+UFObject *ufraw_lensfun_new();
+#endif
 struct ufraw_struct *ufraw_image_get_data(UFObject *obj);
 void ufraw_image_set_data(UFObject *obj, struct ufraw_struct *uf);
 UFObject *ufraw_resources_new();

Index: ufraw_ufraw.c
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_ufraw.c,v
retrieving revision 1.245
retrieving revision 1.246
diff -u -d -r1.245 -r1.246
--- ufraw_ufraw.c       24 Feb 2010 17:44:27 -0000      1.245
+++ ufraw_ufraw.c       26 Feb 2010 07:01:04 -0000      1.246
@@ -697,7 +697,6 @@
     g_free(uf->displayProfile);
     g_free(uf->RawHistogram);
 #ifdef HAVE_LENSFUN
-    lf_lens_destroy(uf->conf->lens);
     lf_modifier_destroy(uf->TCAmodifier);
     lf_camera_destroy(uf->conf->camera);
     lf_modifier_destroy(uf->modifier);

Index: ufobject.h
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufobject.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- ufobject.h  22 Feb 2010 23:27:20 -0000      1.3
+++ ufobject.h  26 Feb 2010 07:01:04 -0000      1.4
@@ -335,7 +335,14 @@
     virtual UFGroup &operator<<(UFObject *object);
     /// Drop an object from the group. The dropped object is returned.
     /// If it is not needed any more it should be deleted to free its memory.
+    /// \exception UFException is thrown if an element with the given name
+    /// does not exist. This can be avoided with the use of the Has() method.
+    /// For UFArray, the index does not get updated.
     UFObject &Drop(UFName name);
+    /// Remove all elements from the group.
+    /// The removed elements are deleted from memory.
+    /// For UFArray, the index does not get updated.
+    void Clear();
 };
 
 /**

Index: ufraw_lensfun.cc
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_lensfun.cc,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- ufraw_lensfun.cc    24 Feb 2010 00:24:15 -0000      1.2
+++ ufraw_lensfun.cc    26 Feb 2010 07:01:04 -0000      1.3
@@ -18,26 +18,159 @@
 #include <glib/gi18n.h>
 #include <string.h>
 #include <assert.h>
+#include <math.h>
 
 #ifdef HAVE_LENSFUN
 namespace UFRaw {
 
 class Lensfun : public UFGroup {
 private:
-    static lfDatabase *GlobalLensDB;
+    static lfDatabase *LensDB;
 public:
+    lfLens Transformation;
+    lfLens Interpolation;
+    double FocalLengthValue;
+    double ApertureValue;
+    double DistanceValue;
     Lensfun();
 #if 0 // Can be useful for valgrind --leak-check=full
     ~Lensfun() {
-       if (GlobalLensDB != NULL)
-           lf_db_destroy(GlobalLensDB);
-       GlobalLensDB = NULL;
+       if (LensDB != NULL)
+           lf_db_destroy(LensDB);
+       LensDB = NULL;
     }
 #endif
-    void Interpolate(const lfLens *lens);
+    static Lensfun &Parent(UFObject &object) {
+       if (strcmp(object.Parent().Name(), ufLensfun) == 0)
+           return static_cast<Lensfun &>(object.Parent());
+       return Lensfun::Parent(object.Parent());
+    }
+    void Interpolate();
     void Init();
 };
 
+#define _buffer_size 80
+
+char *_StringNumber(char *buffer, double number) {
+/*    int precision = 0;
+    while (floor(number * pow(10, precision))*10 <
+           floor(number * pow(10, precision+1)))
+       precision++;*/
+    // Compute the floating-point precision which is enough for "normal use".
+    // The criteria is to have 2 or 3 significant digits.
+    int precision;
+    if (number > 10.0 && (int)(10*number)%10 != 0)
+        // Support focal length such as 10.5mm fisheye.
+        precision = MAX(-floor(log(number) / log(10) - 1.99), 0);
+    else
+        precision = MAX(-floor(log(number) / log(10) - 0.99), 0);
+    snprintf(buffer, _buffer_size, "%.*f", precision, number);
+    return buffer;
+}
+
+extern "C" { UFName ufFocalLength = "FocalLength"; }
+class FocalLength : public UFArray {
+public:
+    FocalLength() : UFArray(ufFocalLength) { }
+    void OriginalValueChangedEvent() {
+       if (!HasParent())
+           return;
+       double value;
+       if (sscanf(StringValue(), "%lf", &value) != 1)
+           return;
+       Lensfun::Parent(*this).FocalLengthValue = value;
+       Lensfun::Parent(*this).Interpolate();
+    }
+    void CreatePresets() {
+       if (!HasParent())
+           return;
+       Clear();
+       lfLens &lens = Lensfun::Parent(*this).Interpolation;
+
+       static double focalValues[] = { 4, 5, 6, 7, 8, 10, 12, 14, 17, 21, 24,
+               28, 35, 43, 50, 70, 85, 105, 135, 200, 300, 400, 600, 800, 0 };
+       char buffer[_buffer_size];
+       double min = lens.MinFocal, max = lens.MaxFocal;
+       if (min > 0)
+           *this << new UFString(ufPreset, _StringNumber(buffer, min));
+       int i = 0;
+       while (focalValues[i] < min && focalValues[i] != 0)
+           i++; 
+       if (Has(_StringNumber(buffer, focalValues[i])))
+           i++; // Comparing string works better than comparing doubles.
+       while (focalValues[i] < max && focalValues[i] != 0) {
+           *this << new UFString(ufPreset, _StringNumber(buffer,
+                   focalValues[i]));
+           i++;
+       }
+       if (max > min)
+           *this << new UFString(ufPreset, _StringNumber(buffer, max));
+    }
+};
+
+extern "C" { UFName ufAperture = "Aperture"; }
+class Aperture : public UFArray {
+public:
+    Aperture() : UFArray(ufAperture) { }
+    void OriginalValueChangedEvent() {
+       if (!HasParent())
+           return;
+       double value;
+       if (sscanf(StringValue(), "%lf", &value) != 1)
+           return;
+       Lensfun::Parent(*this).ApertureValue = value;
+       Lensfun::Parent(*this).Interpolate();
+    }
+    void CreatePresets() {
+       if (!HasParent())
+           return;
+       Clear();
+       lfLens &lens = Lensfun::Parent(*this).Interpolation;
+
+       static double apertureValues[] = { 1, 1.2, 1.4, 1.7, 2, 2.4, 2.8, 3.4,
+           4, 4.8, 5.6, 6.7, 8, 9.5, 11, 13, 16, 19, 22, 27, 32, 38, 45, 0 };
+       char buffer[_buffer_size];
+       double min = lens.MinAperture;
+       if (min > 0)
+           *this << new UFString(ufPreset, _StringNumber(buffer, min));
+       int i = 0;
+       while (apertureValues[i] < min && apertureValues[i] != 0)
+           i++;
+       if (Has(_StringNumber(buffer, apertureValues[i])))
+           i++; // Comparing string works better than comparing doubles.
+       while (apertureValues[i] != 0) {
+           *this << new UFString(ufPreset, _StringNumber(buffer,
+                   apertureValues[i]));
+           i++;
+       }
+    }
+};
+
+extern "C" { UFName ufDistance = "Distance"; }
+class Distance : public UFArray {
+public:
+    Distance() : UFArray(ufDistance) { }
+    void OriginalValueChangedEvent() {
+       if (!HasParent())
+           return;
+       double value;
+       if (sscanf(StringValue(), "%lf", &value) != 1)
+           return;
+       Lensfun::Parent(*this).DistanceValue = value;
+       Lensfun::Parent(*this).Interpolate();
+    }
+    void CreatePresets() {
+       Clear();
+       char buffer[_buffer_size];
+       double value = 0.25;
+       while (value < 1001) {
+           *this << new UFString(ufPreset, _StringNumber(buffer, value));
+           value *= sqrt(2);
+           if (value > 127 && value < 129) value = 125;
+       }
+    }
+};
+
 extern "C" { UFName ufModel = "Model"; }
 
 extern "C" { UFName ufTCA = "TCA"; }
@@ -66,14 +199,13 @@
        ufraw_data *uf = ufraw_image_get_data(this);
        if (uf == NULL)
            return UFObject::Event(type);
-       if (uf->conf->lens == NULL)
-           return UFObject::Event(type);
-       if (uf->conf->lens->CalibTCA != NULL)
-           while (uf->conf->lens->CalibTCA[0] != NULL)
-               uf->conf->lens->RemoveCalibTCA(0);
+       lfLens &lens = Lensfun::Parent(*this).Transformation;
+       if (lens.CalibTCA != NULL)
+           while (lens.CalibTCA[0] != NULL)
+               lens.RemoveCalibTCA(0);
        lfLensCalibTCA calib;
        calib.Model = static_cast<lfTCAModel>(Index());
-       calib.Focal = uf->conf->focal_len;
+       calib.Focal = Lensfun::Parent(*this).FocalLengthValue;
        const lfParameter **params;
        lfLens::GetTCAModelDesc(calib.Model, NULL, &params);
        if (params != NULL) {
@@ -83,16 +215,17 @@
                calib.Terms[i] = Param.DoubleValue();
            }
        }
-       uf->conf->lens->AddCalibTCA(&calib);
+       lens.AddCalibTCA(&calib);
        ufraw_invalidate_tca_layer(uf);
        return UFObject::Event(type);
     }
-    void Interpolate(const lfLens *lens) {
-       ufraw_data *uf = ufraw_image_get_data(this);
-       if (uf == NULL)
+    void Interpolate() {
+       if (!HasParent())
            return;
+       Lensfun &Lensfun = Lensfun::Parent(*this);
        lfLensCalibTCA calib;
-       if (!lens->InterpolateTCA(uf->conf->focal_len, calib)) {
+       if (!Lensfun.Interpolation.InterpolateTCA(
+               Lensfun.FocalLengthValue, calib)) {
            SetIndex(0);
            return;
        }
@@ -136,16 +269,15 @@
        ufraw_data *uf = ufraw_image_get_data(this);
        if (uf == NULL)
            return UFObject::Event(type);
-       if (uf->conf->lens == NULL)
-           return UFObject::Event(type);
-       if (uf->conf->lens->CalibVignetting != NULL)
-           while (uf->conf->lens->CalibVignetting[0] != NULL)
-               uf->conf->lens->RemoveCalibVignetting(0);
+       lfLens &lens = Lensfun::Parent(*this).Transformation;
+       if (lens.CalibVignetting != NULL)
+           while (lens.CalibVignetting[0] != NULL)
+               lens.RemoveCalibVignetting(0);
        lfLensCalibVignetting calib;
        calib.Model = static_cast<lfVignettingModel>(Index());
-       calib.Focal = uf->conf->focal_len;
-       calib.Aperture = uf->conf->aperture;
-       calib.Distance = uf->conf->subject_distance;
+       calib.Focal = Lensfun::Parent(*this).FocalLengthValue;
+       calib.Aperture = Lensfun::Parent(*this).ApertureValue;
+       calib.Distance = Lensfun::Parent(*this).DistanceValue;
        const lfParameter **params;
        lfLens::GetVignettingModelDesc(calib.Model, NULL, &params);
        if (params != NULL) {
@@ -155,17 +287,19 @@
                calib.Terms[i] = Param.DoubleValue();
            }
        }
-       uf->conf->lens->AddCalibVignetting(&calib);
+       lens.AddCalibVignetting(&calib);
        ufraw_invalidate_layer(uf, ufraw_first_phase);
        return UFObject::Event(type);
     }
-    void Interpolate(const lfLens *lens) {
+    void Interpolate() {
        ufraw_data *uf = ufraw_image_get_data(this);
        if (uf == NULL)
            return;
+       Lensfun &Lensfun = Lensfun::Parent(*this);
        lfLensCalibVignetting calib;
-       if (!lens->InterpolateVignetting(uf->conf->focal_len,
-               uf->conf->aperture, uf->conf->subject_distance, calib)) {
+       if (!Lensfun.Interpolation.InterpolateVignetting(
+               Lensfun.FocalLengthValue, Lensfun.FocalLengthValue,
+               Lensfun.DistanceValue, calib)) {
            SetIndex(0);
            return;
        }
@@ -223,14 +357,13 @@
        ufraw_data *uf = ufraw_image_get_data(this);
        if (uf == NULL)
            return UFObject::Event(type);
-       if (uf->conf->lens == NULL)
-           return UFObject::Event(type);
-       if (uf->conf->lens->CalibDistortion != NULL)
-           while (uf->conf->lens->CalibDistortion[0] != NULL)
-               uf->conf->lens->RemoveCalibDistortion(0);
+       lfLens &lens = Lensfun::Parent(*this).Transformation;
+       if (lens.CalibDistortion != NULL)
+           while (lens.CalibDistortion[0] != NULL)
+               lens.RemoveCalibDistortion(0);
        lfLensCalibDistortion calib;
        calib.Model = static_cast<lfDistortionModel>(Index());
-       calib.Focal = uf->conf->focal_len;
+       calib.Focal = Lensfun::Parent(*this).FocalLengthValue;
        const lfParameter **params;
        lfLens::GetDistortionModelDesc(calib.Model, NULL, &params);
        if (params != NULL) {
@@ -240,16 +373,17 @@
                calib.Terms[i] = Param.DoubleValue();
            }
        }
-       uf->conf->lens->AddCalibDistortion(&calib);
+       lens.AddCalibDistortion(&calib);
        ufraw_invalidate_layer(uf, ufraw_transform_phase);
        return UFObject::Event(type);
     }
-    void Interpolate(const lfLens *lens) {
-       ufraw_data *uf = ufraw_image_get_data(this);
-       if (uf == NULL)
+    void Interpolate() {
+       if (!HasParent())
            return;
+       Lensfun &Lensfun = Lensfun::Parent(*this);
        lfLensCalibDistortion calib;
-       if (!lens->InterpolateDistortion(uf->conf->focal_len, calib)) {
+       if (!Lensfun.Interpolation.InterpolateDistortion(
+               Lensfun.FocalLengthValue, calib)) {
            SetIndex(0);
            return;
        }
@@ -267,39 +401,43 @@
 };
 
 extern "C" { UFName ufLensfun = "Lensfun"; }
-Lensfun::Lensfun() : UFGroup(ufLensfun) {
+Lensfun::Lensfun() : UFGroup(ufLensfun), FocalLengthValue(0.0),
+       ApertureValue(0.0), DistanceValue(0.0) {
     *this
+       << new FocalLength
+       << new Aperture
+       << new Distance
        << new TCA
        << new Vignetting
        << new Distortion
     ;
 }
 
-void Lensfun::Interpolate(const lfLens *lens) {
-    static_cast<TCA &>((*this)[ufTCA]).Interpolate(lens);
-    static_cast<Vignetting &>((*this)[ufVignetting]).Interpolate(lens);
-    static_cast<Distortion &>((*this)[ufDistortion]).Interpolate(lens);
+void Lensfun::Interpolate() {
+    static_cast<TCA &>((*this)[ufTCA]).Interpolate();
+    static_cast<Vignetting &>((*this)[ufVignetting]).Interpolate();
+    static_cast<Distortion &>((*this)[ufDistortion]).Interpolate();
 }
 
-lfDatabase *Lensfun::GlobalLensDB = NULL;
+lfDatabase *Lensfun::LensDB = NULL;
 
 void Lensfun::Init() {
     /* Load lens database only once */
-    if (GlobalLensDB == NULL) {
-       GlobalLensDB = lfDatabase::Create();
-       GlobalLensDB->Load();
+    if (LensDB == NULL) {
+       LensDB = lfDatabase::Create();
+       LensDB->Load();
     }
     ufraw_data *uf = ufraw_image_get_data(this);
-    uf->conf->lensdb = GlobalLensDB;
+    uf->conf->lensdb = LensDB;
 
     /* Create a default lens & camera */
-    uf->conf->lens = lf_lens_new();
+    uf->conf->lens = &Transformation;
     uf->conf->camera = lf_camera_new();
     uf->conf->cur_lens_type = LF_UNKNOWN;
 
     /* Set lens and camera from EXIF info, if possible */
     if (uf->conf->real_make[0] || uf->conf->real_model[0]) {
-       const lfCamera **cams = lf_db_find_cameras(uf->conf->lensdb,
+       const lfCamera **cams = LensDB->FindCameras(
                uf->conf->real_make, uf->conf->real_model);
        if (cams != NULL) {
            lf_camera_copy(uf->conf->camera, cams[0]);
@@ -307,10 +445,11 @@
        }
     }
     if (strlen(uf->conf->lensText) > 0) {
-       const lfLens **lenses = lf_db_find_lenses_hd(uf->conf->lensdb,
-               uf->conf->camera, NULL, uf->conf->lensText, 0);
+       const lfLens **lenses = LensDB->FindLenses(
+               uf->conf->camera, NULL, uf->conf->lensText);
        if (lenses != NULL) {
-           lf_lens_copy(uf->conf->lens, lenses[0]);
+           Interpolation = *lenses[0];
+           Transformation = *lenses[0];
            lf_free(lenses);
        }
     }
@@ -328,14 +467,28 @@
        (*this)[ufVignetting].Reset();
        (*this)[ufDistortion].Reset();
     } else {
-       Interpolate(uf->conf->lens);
+       static_cast<FocalLength &>((*this)[ufFocalLength]).CreatePresets();
+       static_cast<Aperture &>((*this)[ufAperture]).CreatePresets();
+       static_cast<Distance &>((*this)[ufDistance]).CreatePresets();
+       Interpolate();
     }
+    char buffer[_buffer_size];
+    (*this)[ufFocalLength].Set(_StringNumber(buffer, uf->conf->focal_len));
+    (*this)[ufFocalLength].SetDefault();
+    (*this)[ufAperture].Set(_StringNumber(buffer, uf->conf->aperture));
+    (*this)[ufAperture].SetDefault();
+    (*this)[ufDistance].Set(_StringNumber(buffer, uf->conf->subject_distance));
+    (*this)[ufDistance].SetDefault();
 }
 
 extern "C" {
 void ufraw_lensfun_interpolate(UFObject *lensfun, const lfLens *lens) {
     Lensfun &Lensfun = dynamic_cast<UFRaw::Lensfun &>(*lensfun);
-    Lensfun.Interpolate(lens);
+    Lensfun.Interpolation = *lens;
+    static_cast<FocalLength &>(Lensfun[ufFocalLength]).CreatePresets();
+    static_cast<Aperture &>(Lensfun[ufAperture]).CreatePresets();
+    static_cast<Distance &>(Lensfun[ufDistance]).CreatePresets();
+    Lensfun.Interpolate();
 }
 
 void ufraw_lensfun_init(ufraw_data *uf) {
@@ -347,4 +500,9 @@
 }
 
 } // namespace UFRaw
+
+extern "C" UFObject *ufraw_lensfun_new() {
+    return new UFRaw::Lensfun();
+}
+
 #endif // HAVE_LENSFUN

Index: ufraw_ui.h
===================================================================
RCS file: /cvsroot/ufraw/ufraw/ufraw_ui.h,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- ufraw_ui.h  21 Feb 2010 10:03:55 -0000      1.38
+++ ufraw_ui.h  26 Feb 2010 07:01:04 -0000      1.39
@@ -122,16 +122,10 @@
     GtkWidget *LensMenu;
     /* The lens fix notebook distortion page */
     GtkWidget *LensDistortionTable, *LensDistortionDesc;
-    /* The lens distortion model combobox */
-    GtkWidget *LensDistortionModel;
     /* The lens fix notebook TCA page */
     GtkWidget *LensTCATable, *LensTCADesc;
-    /* The lens TCA model combobox */
-    GtkWidget *LensTCAModel;
     /* The lens fix notebook vignetting page */
     GtkWidget *LensVignettingTable, *LensVignettingDesc;
-    /* The lens vignetting model combobox */
-    GtkWidget *LensVignettingModel;
     /* The lens fix notebook geometry page */
     GtkWidget *LensGeometryTable, *LensFromGeometryDesc, *LensToGeometryDesc;
     /* The 'from' and 'to' geometry selectors */
@@ -189,10 +183,6 @@
 /* Start the render preview refresh thread for invalid layers in background */
 void render_preview (preview_data *data);
 
-preview_data *get_preview_data (void *object);
-
-void resize_canvas(preview_data *data);
-
 void lens_fill_interface (preview_data *data, GtkWidget *page);
 
 GtkWidget *table_with_frame (GtkWidget *box, char *label, gboolean expand);


------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
_______________________________________________
ufraw-cvs mailing list
ufraw-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ufraw-cvs

Reply via email to