mirror of
https://gitlab.gnome.org/GNOME/nautilus
synced 2024-08-25 02:36:07 +00:00
Support for exif info.
2003-10-14 Alexander Larsson <alexl@redhat.com> * acconfig.h: * components/image_properties/Makefile.am: * components/image_properties/nautilus-image-properties-view.c: * configure.in: Support for exif info.
This commit is contained in:
parent
b5fd55155a
commit
f950720caa
|
@ -1,3 +1,11 @@
|
|||
2003-10-14 Alexander Larsson <alexl@redhat.com>
|
||||
|
||||
* acconfig.h:
|
||||
* components/image_properties/Makefile.am:
|
||||
* components/image_properties/nautilus-image-properties-view.c:
|
||||
* configure.in:
|
||||
Support for exif info.
|
||||
|
||||
2003-10-11 Dennis cranston <dennis_cranston at yahoo com>
|
||||
|
||||
* src/file-manager/fm-icon-view.c: Fixes to the 'Link here'
|
||||
|
|
|
@ -22,3 +22,4 @@
|
|||
#undef bzwrite
|
||||
#define HAVE_GTK_MULTIHEAD /* needed for egg-screen-exec functions */
|
||||
#undef HAVE_STARTUP_NOTIFICATION
|
||||
#undef HAVE_EXIF
|
||||
|
|
|
@ -11,7 +11,8 @@ INCLUDES = \
|
|||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
$(DISABLE_DEPRECATED_CFLAGS) \
|
||||
$(COMPONENT_CFLAGS)
|
||||
$(COMPONENT_CFLAGS) \
|
||||
$(EXIF_CFLAGS)
|
||||
|
||||
bonobodir = $(libdir)/bonobo
|
||||
bonobo_LTLIBRARIES = libnautilus-image-properties-view.la
|
||||
|
@ -23,7 +24,8 @@ libnautilus_image_properties_view_la_SOURCES = \
|
|||
|
||||
libnautilus_image_properties_view_la_LIBADD = \
|
||||
$(top_builddir)/libnautilus/libnautilus.la \
|
||||
$(COMPONENT_LIBS)
|
||||
$(COMPONENT_LIBS) \
|
||||
$(EXIF_LIBS)
|
||||
|
||||
libnautilus_image_properties_view_la_LDFLAGS = -module -avoid-version -no-undefined
|
||||
|
||||
|
|
|
@ -32,6 +32,18 @@
|
|||
#include <eel/eel-gnome-extensions.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_EXIF
|
||||
#include <libexif/exif-data.h>
|
||||
#include <libexif/exif-ifd.h>
|
||||
#include <libexif/exif-loader.h>
|
||||
#include <gtk/gtkliststore.h>
|
||||
#include <gtk/gtktreestore.h>
|
||||
#include <gtk/gtktreeview.h>
|
||||
#include <gtk/gtkscrolledwindow.h>
|
||||
#include <gtk/gtkcellrenderertext.h>
|
||||
#include <eel/eel-vfs-extensions.h>
|
||||
#endif
|
||||
|
||||
#define LOAD_BUFFER_SIZE 8192
|
||||
|
||||
struct NautilusImagePropertiesViewDetails {
|
||||
|
@ -41,9 +53,23 @@ struct NautilusImagePropertiesViewDetails {
|
|||
GnomeVFSAsyncHandle *vfs_handle;
|
||||
GdkPixbufLoader *loader;
|
||||
gboolean got_size;
|
||||
gboolean pixbuf_still_loading;
|
||||
char buffer[LOAD_BUFFER_SIZE];
|
||||
int width;
|
||||
int height;
|
||||
#ifdef HAVE_EXIF
|
||||
ExifLoader *exifldr;
|
||||
#endif /*HAVE_EXIF*/
|
||||
};
|
||||
|
||||
#ifdef HAVE_EXIF
|
||||
struct ExifAttribute {
|
||||
ExifTag tag;
|
||||
char *value;
|
||||
gboolean found;
|
||||
};
|
||||
#endif /*HAVE_EXIF*/
|
||||
|
||||
enum {
|
||||
PROP_URI,
|
||||
};
|
||||
|
@ -57,8 +83,9 @@ nautilus_image_properties_view_finalize (GObject *object)
|
|||
|
||||
view = NAUTILUS_IMAGE_PROPERTIES_VIEW (object);
|
||||
|
||||
if (view->details->vfs_handle != NULL)
|
||||
if (view->details->vfs_handle != NULL) {
|
||||
gnome_vfs_async_cancel (view->details->vfs_handle);
|
||||
}
|
||||
|
||||
view->details->vfs_handle = NULL;
|
||||
g_free (view->details->location);
|
||||
|
@ -75,23 +102,162 @@ file_closed_callback (GnomeVFSAsyncHandle *handle,
|
|||
{
|
||||
}
|
||||
|
||||
#ifdef HAVE_EXIF
|
||||
static char *
|
||||
exif_string_to_utf8 (const char *exif_str)
|
||||
{
|
||||
char *utf8_str;
|
||||
|
||||
if (g_utf8_validate (exif_str, -1, NULL)) {
|
||||
return g_strdup (exif_str);
|
||||
}
|
||||
|
||||
utf8_str = g_locale_to_utf8 (exif_str, -1, NULL, NULL, NULL);
|
||||
if (utf8_str != NULL) {
|
||||
return utf8_str;
|
||||
}
|
||||
|
||||
return eel_make_valid_utf8 (exif_str);
|
||||
}
|
||||
|
||||
static void
|
||||
exif_content_callback (ExifContent *content, gpointer data)
|
||||
{
|
||||
struct ExifAttribute *attribute;
|
||||
|
||||
attribute = (struct ExifAttribute *)data;
|
||||
if (attribute->found) {
|
||||
return;
|
||||
}
|
||||
|
||||
attribute->value = g_strdup (exif_content_get_value (content, attribute->tag));
|
||||
if (attribute->value != NULL) {
|
||||
attribute->found = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
exifdata_get_tag_name_utf8 (ExifTag tag)
|
||||
{
|
||||
return exif_string_to_utf8 (exif_tag_get_name (tag));
|
||||
}
|
||||
|
||||
static char *
|
||||
exifdata_get_tag_value_utf8 (ExifData *data, ExifTag tag)
|
||||
{
|
||||
struct ExifAttribute attribute;
|
||||
char *utf8_value;
|
||||
|
||||
attribute.tag = tag;
|
||||
attribute.value = NULL;
|
||||
attribute.found = FALSE;
|
||||
|
||||
exif_data_foreach_content (data, exif_content_callback, &attribute);
|
||||
|
||||
if (attribute.found) {
|
||||
utf8_value = exif_string_to_utf8 (attribute.value);
|
||||
g_free (attribute.value);
|
||||
} else {
|
||||
utf8_value = NULL;
|
||||
}
|
||||
|
||||
return utf8_value;
|
||||
}
|
||||
|
||||
static void
|
||||
append_tag_value_pair (GString *string, ExifData *data, ExifTag tag, gchar *description)
|
||||
{
|
||||
char *utf_attribute;
|
||||
char *utf_value;
|
||||
|
||||
utf_attribute = exifdata_get_tag_name_utf8 (tag);
|
||||
utf_value = exifdata_get_tag_value_utf8 (data, tag);
|
||||
|
||||
if ((utf_attribute == NULL) || (utf_value == NULL)) {
|
||||
g_free (utf_attribute);
|
||||
g_free (utf_value);
|
||||
return;
|
||||
}
|
||||
|
||||
g_string_append_printf (string, "<b>%s:</b> %s\n", (description != NULL) ? description : utf_attribute, utf_value);
|
||||
|
||||
g_free (utf_attribute);
|
||||
g_free (utf_value);
|
||||
}
|
||||
|
||||
static void
|
||||
append_exifdata_string (ExifData *exifdata, GString *string)
|
||||
{
|
||||
gchar *camera_make, *camera_model;
|
||||
|
||||
if (exifdata->ifd[0] && exifdata->ifd[0]->count) {
|
||||
camera_make = exifdata_get_tag_value_utf8 (exifdata, EXIF_TAG_MAKE);
|
||||
camera_model = exifdata_get_tag_value_utf8 (exifdata, EXIF_TAG_MODEL);
|
||||
if (camera_make != NULL) {
|
||||
g_string_append_printf (string, "<b>%s:</b> %s %s\n",
|
||||
_("Camera"),
|
||||
camera_make,
|
||||
camera_model);
|
||||
}
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_DATE_TIME, _("Date Taken"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_EXPOSURE_TIME, _("Exposure Time"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_EXPOSURE_PROGRAM, _("Exposure Program"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_APERTURE_VALUE, _("Aperture Value"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_METERING_MODE, _("Metering Mode"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_FLASH,_("Flash Fired"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_FOCAL_LENGTH,_("Focal Lenght"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_SHUTTER_SPEED_VALUE, _("Shutter Speed"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_ISO_SPEED_RATINGS, _("ISO Speed Rating"));
|
||||
append_tag_value_pair (string, exifdata, EXIF_TAG_SOFTWARE, _("Software"));
|
||||
|
||||
}
|
||||
}
|
||||
#endif /*HAVE_EXIF*/
|
||||
|
||||
static void
|
||||
load_finished (NautilusImagePropertiesView *view)
|
||||
{
|
||||
GdkPixbufFormat *format;
|
||||
char *name, *desc;
|
||||
GString *str;
|
||||
|
||||
if (view->details->got_size) {
|
||||
str = g_string_new (NULL);
|
||||
format = gdk_pixbuf_loader_get_format (view->details->loader);
|
||||
|
||||
name = gdk_pixbuf_format_get_name (format);
|
||||
desc = gdk_pixbuf_format_get_description (format);
|
||||
g_string_append_printf (str, _("<b>Image Type:</b> %s (%s)\n<b>Resolution:</b> %dx%d pixels\n"),
|
||||
name, desc, view->details->width, view->details->height);
|
||||
g_free (name);
|
||||
g_free (desc);
|
||||
|
||||
#ifdef HAVE_EXIF
|
||||
append_exifdata_string (exif_loader_get_data (view->details->exifldr), str);
|
||||
#endif /*HAVE_EXIF*/
|
||||
|
||||
gtk_label_set_markup (GTK_LABEL (view->details->resolution), str->str);
|
||||
g_string_free (str, TRUE);
|
||||
} else {
|
||||
gtk_label_set_text (GTK_LABEL (view->details->resolution), _("Failed to load image information"));
|
||||
}
|
||||
|
||||
if (view->details->loader != NULL) {
|
||||
gdk_pixbuf_loader_close (view->details->loader, NULL);
|
||||
g_object_unref (view->details->loader);
|
||||
view->details->loader = NULL;
|
||||
}
|
||||
#ifdef HAVE_EXIF
|
||||
if (view->details->exifldr != NULL) {
|
||||
exif_loader_unref (view->details->exifldr);
|
||||
view->details->exifldr = NULL;
|
||||
}
|
||||
#endif /*HAVE_EXIF*/
|
||||
|
||||
if (view->details->vfs_handle != NULL) {
|
||||
gnome_vfs_async_close (view->details->vfs_handle, file_closed_callback, NULL);
|
||||
view->details->vfs_handle = NULL;
|
||||
}
|
||||
|
||||
if (!view->details->got_size) {
|
||||
gtk_label_set_text (GTK_LABEL (view->details->resolution), _("Failed to load image information"));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -103,16 +269,31 @@ file_read_callback (GnomeVFSAsyncHandle *vfs_handle,
|
|||
gpointer callback_data)
|
||||
{
|
||||
NautilusImagePropertiesView *view;
|
||||
#ifdef HAVE_EXIF
|
||||
int exif_still_loading;
|
||||
#endif
|
||||
|
||||
view = NAUTILUS_IMAGE_PROPERTIES_VIEW (callback_data);
|
||||
|
||||
if (result == GNOME_VFS_OK && bytes_read != 0) {
|
||||
if (!gdk_pixbuf_loader_write (view->details->loader,
|
||||
buffer,
|
||||
bytes_read,
|
||||
NULL)) {
|
||||
result = GNOME_VFS_ERROR_WRONG_FORMAT;
|
||||
} else if (!view->details->got_size) {
|
||||
#ifdef HAVE_EXIF
|
||||
exif_still_loading = exif_loader_write (view->details->exifldr,
|
||||
buffer,
|
||||
bytes_read);
|
||||
#endif
|
||||
if (view->details->pixbuf_still_loading) {
|
||||
if (!gdk_pixbuf_loader_write (view->details->loader,
|
||||
buffer,
|
||||
bytes_read,
|
||||
NULL)) {
|
||||
view->details->pixbuf_still_loading = FALSE;
|
||||
}
|
||||
}
|
||||
if (view->details->pixbuf_still_loading
|
||||
#ifdef HAVE_EXIF
|
||||
&& (exif_still_loading == 1)
|
||||
#endif
|
||||
) {
|
||||
gnome_vfs_async_read (view->details->vfs_handle,
|
||||
view->details->buffer,
|
||||
sizeof (view->details->buffer),
|
||||
|
@ -121,7 +302,6 @@ file_read_callback (GnomeVFSAsyncHandle *vfs_handle,
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
load_finished (view);
|
||||
}
|
||||
|
||||
|
@ -132,24 +312,13 @@ size_prepared_callback (GdkPixbufLoader *loader,
|
|||
gpointer callback_data)
|
||||
{
|
||||
NautilusImagePropertiesView *view;
|
||||
GdkPixbufFormat *format;
|
||||
char *str;
|
||||
char *name, *desc;
|
||||
|
||||
view = NAUTILUS_IMAGE_PROPERTIES_VIEW (callback_data);
|
||||
|
||||
format = gdk_pixbuf_loader_get_format (loader);
|
||||
|
||||
name = gdk_pixbuf_format_get_name (format);
|
||||
desc = gdk_pixbuf_format_get_description (format);
|
||||
str = g_strdup_printf (_("<b>Image Type:</b> %s (%s)\n<b>Resolution:</b> %dx%d pixels\n"),
|
||||
name, desc, width, height);
|
||||
gtk_label_set_markup (GTK_LABEL (view->details->resolution), str);
|
||||
g_free (str);
|
||||
g_free (name);
|
||||
g_free (desc);
|
||||
|
||||
view->details->height = height;
|
||||
view->details->width = width;
|
||||
view->details->got_size = TRUE;
|
||||
view->details->pixbuf_still_loading = FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -167,6 +336,12 @@ file_opened_callback (GnomeVFSAsyncHandle *vfs_handle,
|
|||
}
|
||||
|
||||
view->details->loader = gdk_pixbuf_loader_new ();
|
||||
view->details->pixbuf_still_loading = TRUE;
|
||||
view->details->width = 0;
|
||||
view->details->height = 0;
|
||||
#ifdef HAVE_EXIF
|
||||
view->details->exifldr = exif_loader_new ();
|
||||
#endif /*HAVE_EXIF*/
|
||||
|
||||
g_signal_connect (view->details->loader, "size_prepared",
|
||||
G_CALLBACK (size_prepared_callback), view);
|
||||
|
@ -257,7 +432,7 @@ nautilus_image_properties_view_init (NautilusImagePropertiesView *view)
|
|||
gtk_box_pack_start (GTK_BOX (view->details->vbox),
|
||||
view->details->resolution,
|
||||
FALSE, TRUE, 2);
|
||||
|
||||
|
||||
gtk_widget_show_all (view->details->vbox);
|
||||
|
||||
bonobo_control_construct (BONOBO_CONTROL (view), view->details->vbox);
|
||||
|
|
12
configure.in
12
configure.in
|
@ -20,6 +20,7 @@ MEDUSA_REQUIRED=0.5.1
|
|||
RSVG_REQUIRED=2.0.1
|
||||
XML_REQUIRED=2.4.7
|
||||
STARTUP_NOTIFICATION_REQUIRED=0.5
|
||||
EXIF_REQUIRED=0.5.12
|
||||
|
||||
AC_SUBST(ART_REQUIRED)
|
||||
AC_SUBST(BONOBO_ACTIVATION_REQUIRED)
|
||||
|
@ -223,6 +224,17 @@ if test "x$have_medusa" = "xyes"; then
|
|||
EXTRA_CORE_MODULES="$EXTRA_CORE_MODULES medusa-2.0"
|
||||
fi
|
||||
|
||||
dnl exif checking
|
||||
|
||||
AC_MSG_CHECKING(for libExif)
|
||||
|
||||
PKG_CHECK_MODULES(EXIF, libexif >= $EXIF_REQUIRED, have_exif=yes, have_exif=no)
|
||||
if test "x$have_exif" = "xyes"; then
|
||||
AC_DEFINE(HAVE_EXIF,1)
|
||||
AC_SUBST(EXIF_CFLAGS)
|
||||
AC_SUBST(EXIF_LIBS)
|
||||
fi
|
||||
|
||||
dnl ==========================================================================
|
||||
|
||||
dnl libjpeg
|
||||
|
|
Loading…
Reference in a new issue