gthumb r2257 - in trunk: . libgthumb



Author: mjc
Date: Wed Feb  6 13:11:09 2008
New Revision: 2257
URL: http://svn.gnome.org/viewvc/gthumb?rev=2257&view=rev

Log:
2008-02-06  Michael J. Chudobiak  <mjc svn gnome org>

        * NEWS:
        * README:
        * configure.in:
        * libgthumb/comments.c: (comment_data_new), (comment_data_free),
        (comment_data_dup), (comment_delete), (load_comment_from_metadata),
        (save_comment_to_metadata), (save_comment),
        (comments_load_comment):
        * libgthumb/gth-exiv2-utils.cpp:
        Removed libiptcdata from gthumb. We use exiv2 instead, now.
        The comment <-> metadata code has been updated to reflect this.
        The comment <-> metadata mapping is still unstable and may change.



Modified:
   trunk/ChangeLog
   trunk/NEWS
   trunk/README
   trunk/configure.in
   trunk/libgthumb/comments.c
   trunk/libgthumb/gth-exiv2-utils.cpp

Modified: trunk/NEWS
==============================================================================
--- trunk/NEWS	(original)
+++ trunk/NEWS	Wed Feb  6 13:11:09 2008
@@ -58,6 +58,7 @@
 
 	Library changes:
 	* exiv2 0.15 or higher is now required.
+	* libiptcdata is no longer used.
 
 
 version 2.10.9

Modified: trunk/README
==============================================================================
--- trunk/README	(original)
+++ trunk/README	Wed Feb  6 13:11:09 2008
@@ -104,9 +104,6 @@
   If the libgphoto2 library version >= 2.1.3 is present you can import
   photos from your camera.
 
-  If the libiptc library version >= 0.2.1 is present you can store
-  comments in the IPTC metadata of a JPEG image.
-
   If the libopenraw library version >= 0.0.2 is present you can view
   RAW photo thumbnails.
 

Modified: trunk/configure.in
==============================================================================
--- trunk/configure.in	(original)
+++ trunk/configure.in	Wed Feb  6 13:11:09 2008
@@ -31,7 +31,6 @@
 GNOME_VFS_REQUIRED=2.6.0
 LIBGLADE_REQUIRED=2.4.0
 LIBEXIF_REQUIRED=0.6.13
-LIBIPTCDATA_REQUIRED=0.2.1
 LIBGPHOTO_REQUIRED=2.1.3
 BONOBO_REQUIRED=2.6.0
 LIBOPENRAW_REQUIRED=0.0.2
@@ -47,7 +46,6 @@
 AC_SUBST(GNOME_VFS_REQUIRED)
 AC_SUBST(LIBGLADE_REQUIRED)
 AC_SUBST(LIBEXIF_REQUIRED)
-AC_SUBST(LIBIPTCDATA_REQUIRED)
 AC_SUBST(LIBGPHOTO_REQUIRED)
 AC_SUBST(BONOBO_REQUIRED)
 AC_SUBST(LIBOPENRAW_REQUIRED)
@@ -195,29 +193,6 @@
 AC_SUBST(XF86GAMMA_LIBS)
 
 #
-# Checks for libiptcdata
-#
-AC_ARG_ENABLE([iptcdata],
-	      [AC_HELP_STRING([--disable-iptcdata],[disable support for iptc data])],,
-	      [enable_iptcdata=yes])
-
-HAVE_IPTC=no
-if test x$enable_iptcdata = xyes ; then
-   AC_MSG_CHECKING(IPTC Data Support)
-   IPTCDATA_LIBS=""
-   IPTCDATA_CFLAGS=""
-   if pkg-config --atleast-version=$LIBIPTCDATA_REQUIRED libiptcdata; then
-     HAVE_IPTC="yes"
-     IPTCDATA_LIBS=`pkg-config --libs libiptcdata`
-     IPTCDATA_CFLAGS=`pkg-config --cflags libiptcdata`
-     AC_DEFINE(HAVE_LIBIPTCDATA, 1, [Have libiptcdata])
-   fi
-   AC_MSG_RESULT($HAVE_IPTC)
-fi
-AC_SUBST(IPTCDATA_LIBS)
-AC_SUBST(IPTCDATA_CFLAGS)
-
-#
 # Checks for libgphoto2
 #
 AC_ARG_ENABLE([gphoto2],
@@ -389,7 +364,6 @@
 	Have XRender:             ${HAVE_RENDER}
 	Have XTest:               ${have_xtest}
 	Have XF86VidModeSetGamma: ${have_xf86gamma}
-	Have libiptcdata:         ${HAVE_IPTC}
 	Have libtiff:             ${HAVE_TIFF}
 	Have libgphoto:           ${HAVE_GPHOTO2}
 	Have libopenraw:          ${HAVE_LIBOPENRAW}

Modified: trunk/libgthumb/comments.c
==============================================================================
--- trunk/libgthumb/comments.c	(original)
+++ trunk/libgthumb/comments.c	Wed Feb  6 13:11:09 2008
@@ -41,16 +41,12 @@
 #include <libxml/xmlmemory.h>
 #include <gtk/gtk.h>
 
-#ifdef HAVE_LIBIPTCDATA
-#include <libiptcdata/iptc-data.h>
-#include <libiptcdata/iptc-jpeg.h>
-#endif /* HAVE_LIBIPTCDATA */
-
 #include "typedefs.h"
 #include "comments.h"
 #include "file-utils.h"
 #include "glib-utils.h"
 #include "gtk-utils.h"
+#include "gth-exif-utils.h"
 
 #define COMMENT_TAG  ((xmlChar *)"Comment")
 #define PLACE_TAG    ((xmlChar *)"Place")
@@ -78,11 +74,6 @@
 	data->keywords_n = 0;
 	data->keywords = NULL;
 	data->utf8_format = TRUE;
-
-#ifdef HAVE_LIBIPTCDATA
-	data->iptc_data = NULL;
-#endif /* HAVE_LIBIPTCDATA */
-
 	data->changed = FALSE;
 
 	return data;
@@ -131,12 +122,6 @@
 
 	comment_data_free_comment (data);
 	comment_data_free_keywords (data);
-
-#ifdef HAVE_LIBIPTCDATA
-	if (data->iptc_data != NULL)
-		iptc_data_unref (data->iptc_data);
-#endif /* HAVE_LIBIPTCDATA */
-
         g_free (data);
 }
 
@@ -169,12 +154,6 @@
 	}
 	new_data->utf8_format = data->utf8_format;
 
-#ifdef HAVE_LIBIPTCDATA
-	new_data->iptc_data = data->iptc_data;
-	if (new_data->iptc_data != NULL)
-		iptc_data_ref (new_data->iptc_data);
-#endif /* HAVE_LIBIPTCDATA */
-
 	return new_data;
 }
 
@@ -248,331 +227,6 @@
 }
 
 
-#ifdef HAVE_LIBIPTCDATA
-
-
-static CommentData *
-load_comment_from_iptc (const char *uri)
-{
-	CommentData *data;
-	IptcData    *d;
-	struct tm    t;
-	int          i;
-	int          got_date = 0, got_time = 0;
-        char        *local_file = NULL;
-
-	if (uri == NULL)
-		return NULL;
-
-        local_file = get_cache_filename_from_uri (uri);
-        if (local_file == NULL)
-                return NULL;
-
-	d = iptc_data_new_from_jpeg (local_file);
-	g_free (local_file);
-	
-	if (d == NULL) 
-		return NULL;
-
-	data = comment_data_new ();
-
-	bzero (&t, sizeof (t));
-	t.tm_isdst = -1;
-
-	for (i = 0; i < d->count; i++) {
-		IptcDataSet * ds = d->datasets[i];
-
-		if ((ds->record == IPTC_RECORD_APP_2)
-		    && (ds->tag == IPTC_TAG_CAPTION)) {
-			if (data->comment)
-				continue;
-			data->comment = g_new (char, ds->size + 1);
-			if (data->comment)
-				iptc_dataset_get_data (ds, (guchar*)data->comment, ds->size + 1);
-		}
-		else if ((ds->record == IPTC_RECORD_APP_2)
-			 && (ds->tag == IPTC_TAG_CONTENT_LOC_NAME)) {
-			if (data->place)
-				continue;
-			data->place = g_new (char, ds->size + 1);
-			if (data->place)
-				iptc_dataset_get_data (ds, (guchar*)data->place, ds->size + 1);
-		}
-		else if ((ds->record == IPTC_RECORD_APP_2)
-			 && (ds->tag == IPTC_TAG_KEYWORDS)) {
-			char keyword[64];
-			if (iptc_dataset_get_data (ds, (guchar*)keyword, sizeof(keyword)) < 0)
-				continue;
-			comment_data_add_keyword (data, keyword);
-		}
-		else if ((ds->record == IPTC_RECORD_APP_2)
-			 && (ds->tag == IPTC_TAG_DATE_CREATED)) {
-			int year, month;
-			iptc_dataset_get_date (ds, &year, &month, &t.tm_mday);
-			t.tm_year = year - 1900;
-			t.tm_mon = month - 1;
-			got_date = 1;
-		}
-		else if ((ds->record == IPTC_RECORD_APP_2)
-			 && (ds->tag == IPTC_TAG_TIME_CREATED)) {
-			iptc_dataset_get_time (ds, &t.tm_hour, &t.tm_min, &t.tm_sec, NULL);
-			got_time = 1;
-		}
-	}
-
-	if (got_date && got_time)
-		data->time = mktime (&t);
-
-	data->iptc_data = d;
-
-	return data;
-}
-
-
-static void
-clear_iptc_comment (IptcData *d)
-{
-	IptcTag deletetag[] = {
-		IPTC_TAG_DATE_CREATED, IPTC_TAG_TIME_CREATED, IPTC_TAG_KEYWORDS,
-		IPTC_TAG_CAPTION, IPTC_TAG_CONTENT_LOC_NAME, 0
-	};
-	int          i;
-
-	for (i = 0; deletetag[i] != 0; i++) {
-		IptcDataSet *ds;
-		while ((ds = iptc_data_get_dataset (d,
-						    IPTC_RECORD_APP_2,
-						    deletetag[i]))) {
-			iptc_data_remove_dataset (d, ds);
-			iptc_dataset_unref (ds);
-		}
-	}
-}
-
-
-static void
-save_iptc_data (const char *filename,
-		IptcData   *d)
-{
-	guint        buf_len = 256 * 256;
-	FILE        *infile, *outfile;
-	guchar      *ps3_buf;
-	guchar      *ps3_out_buf;
-	guchar      *iptc_buf;
-	guint        ps3_len, iptc_len;
-	gchar       *tmpfile;
-	struct stat  statinfo;
-
-	if (filename == NULL)
-		return;
-
-	ps3_buf = g_malloc (buf_len);
-	if (!ps3_buf)
-		return;
-
-	ps3_out_buf = g_malloc (buf_len);
-	if (!ps3_out_buf)
-		goto abort1;
-
-	infile = fopen (filename, "r");
-	if (!infile)
-		goto abort2;
-
-	ps3_len = iptc_jpeg_read_ps3 (infile, ps3_buf, buf_len);
-	if (ps3_len < 0)
-		goto abort3;
-
-	if (iptc_data_save (d, &iptc_buf, &iptc_len) < 0)
-		goto abort3;
-
-	ps3_len = iptc_jpeg_ps3_save_iptc (ps3_buf, ps3_len,
-					   iptc_buf, iptc_len,
-					   ps3_out_buf, buf_len);
-	iptc_data_free_buf (d, iptc_buf);
-	if (ps3_len < 0)
-		goto abort3;
-
-	rewind (infile);
-
-	tmpfile = g_strdup_printf ("%s.%d", filename, getpid());
-	if (!tmpfile)
-		goto abort3;
-
-	outfile = fopen (tmpfile, "w");
-	if (!outfile)
-		goto abort4;
-
-	if (iptc_jpeg_save_with_ps3 (infile, outfile, (guchar*)ps3_out_buf, ps3_len) < 0)
-		goto abort5;
-
-	fclose (outfile);
-	fclose (infile);
-
-	stat (filename, &statinfo);
-
-	if (rename (tmpfile, filename) < 0)
-		file_unlink (tmpfile);
-	else {
-		chown (filename, -1, statinfo.st_gid);
-		chmod (filename, statinfo.st_mode);
-	}
-
-	g_free (tmpfile);
-	g_free (ps3_out_buf);
-	g_free (ps3_buf);
-
-	return;
-abort5:
-	fclose (outfile);
-	file_unlink (tmpfile);
-abort4:
-	g_free (tmpfile);
-abort3:
-	fclose (infile);
-abort2:
-	g_free (ps3_out_buf);
-abort1:
-	g_free (ps3_buf);
-}
-
-
-static void
-save_comment_iptc (const char  *uri,
-		   CommentData *data)
-{
-        char        *local_file;
-        char        *local_uri;
-	time_t       mtime;
-	IptcData    *d;
-	IptcDataSet *ds;
-	int          i;
-
-	local_file = get_cache_filename_from_uri (uri);
-        if (local_file == NULL)
-                return;
-	local_uri = get_uri_from_local_path (local_file);
-	mtime = get_file_mtime (local_uri);
-
-	d = iptc_data_new_from_jpeg (local_file);
-	if (d != NULL) 
-		clear_iptc_comment (d);
-	else {
-		d = iptc_data_new ();
-		if (d == NULL)
-			return;
-	}
-
-	if (data->time > 0) {
-		struct tm t;
-		localtime_r (&data->time, &t);
-
-		ds = iptc_dataset_new ();
-		if (ds != NULL) {
-			iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2,
-					IPTC_TAG_DATE_CREATED);
-			iptc_dataset_set_date (ds, t.tm_year + 1900, t.tm_mon + 1,
-					t.tm_mday, IPTC_DONT_VALIDATE);
-			iptc_data_add_dataset (d, ds);
-			iptc_dataset_unref (ds);
-		}
-
-		ds = iptc_dataset_new ();
-		if (ds != NULL) {
-			iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2,
-					IPTC_TAG_TIME_CREATED);
-			iptc_dataset_set_time (ds, t.tm_hour, t.tm_min, t.tm_sec,
-					0, IPTC_DONT_VALIDATE);
-			iptc_data_add_dataset (d, ds);
-			iptc_dataset_unref (ds);
-		}
-	}
-
-	for (i = 0; i < data->keywords_n; i++) {
-		ds = iptc_dataset_new ();
-		if (ds != NULL) {
-			iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2,
-					      IPTC_TAG_KEYWORDS);
-			iptc_dataset_set_data (ds, (guchar*)data->keywords[i],
-					       strlen (data->keywords[i]), IPTC_DONT_VALIDATE);
-			iptc_data_add_dataset (d, ds);
-			iptc_dataset_unref (ds);
-		}
-	}
-
-	if (data->comment != NULL && data->comment[0]) {
-		ds = iptc_dataset_new ();
-		if (ds != NULL) {
-			iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2,
-					IPTC_TAG_CAPTION);
-			iptc_dataset_set_data (ds, (guchar*)data->comment,
-					       strlen (data->comment), IPTC_DONT_VALIDATE);
-			iptc_data_add_dataset (d, ds);
-			iptc_dataset_unref (ds);
-		}
-	}
-
-	if (data->place != NULL && data->place[0]) {
-		ds = iptc_dataset_new ();
-		if (ds != NULL) {
-			iptc_dataset_set_tag (ds, IPTC_RECORD_APP_2,
-					      IPTC_TAG_CONTENT_LOC_NAME);
-			iptc_dataset_set_data (ds, (guchar*)data->place,
-					       strlen (data->place), IPTC_DONT_VALIDATE);
-			iptc_data_add_dataset (d, ds);
-			iptc_dataset_unref (ds);
-		}
-	}
-
-	/* The iptc_data_set_version and iptc_data_set_encoding_utf8
-	   functions cause Picasa to choke, as indicated in the libiptc
-	   API docs. So we'll disable them and see if that fixes more
-	   things than it breaks. Bug 438716. */
-
-	/* iptc_data_set_version (d, IPTC_IIM_VERSION); */
-	/* iptc_data_set_encoding_utf8 (d); */
-
-	iptc_data_sort (d);
-
-	save_iptc_data (local_file, d);
-	set_file_mtime (local_uri, mtime);
-	iptc_data_unref (d);
-
-        g_free (local_file);
-        g_free (local_uri);
-}
-
-
-static void
-delete_comment_iptc (const char *uri)
-{
-	IptcData *d;
-	time_t    mtime;
-	char     *local_file;
-
-	if ((uri == NULL) || ! is_local_file (uri))
-		return;
-
-	mtime = get_file_mtime (uri);
-
-	local_file = get_cache_filename_from_uri (uri);
-	d = iptc_data_new_from_jpeg (local_file);
-	if (d == NULL) {
-		g_free (local_file);
-		return;
-	}
-
-	clear_iptc_comment (d);
-	save_iptc_data (local_file, d);
-	iptc_data_unref (d);
-	g_free (local_file);
-	
-	set_file_mtime (uri, mtime);
-}
-
-
-#endif /* HAVE_LIBIPTCDATA */
-
-
 void
 comment_copy (const char *src,
 	      const char *dest)
@@ -638,11 +292,6 @@
 	comment_uri = comments_get_comment_filename (uri, TRUE);
 	file_unlink (comment_uri);
 	g_free (comment_uri);
-
-#ifdef HAVE_LIBIPTCDATA
-	if (image_is_jpeg (uri))
-		delete_comment_iptc (uri);
-#endif /* HAVE_LIBIPTCDATA */
 }
 
 
@@ -714,6 +363,108 @@
 
 
 static CommentData *
+load_comment_from_metadata (const char *uri)
+{
+	CommentData *data;
+	FileData    *file;
+	char        *metadata_string = NULL;
+	time_t	     metadata_time = 0;
+
+	file = file_data_new (uri, NULL);
+	file_data_update_all (file, FALSE);
+
+	data = comment_data_new ();
+
+	metadata_string = get_metadata_tagset_string (file, TAG_NAME_SETS[COMMENT_TAG_NAMES]);
+	if ((metadata_string != NULL) && (metadata_string[0] != 0)) {
+		data->comment = g_strdup (metadata_string);
+		g_free (metadata_string);
+	}
+
+        metadata_string = get_metadata_tagset_string (file, TAG_NAME_SETS[LOCATION_TAG_NAMES]);
+        if ((metadata_string != NULL) && (metadata_string[0] != 0)) {
+                data->place = g_strdup (metadata_string);
+                g_free (metadata_string);
+        }
+
+        metadata_time = get_exif_time (file);
+        if (metadata_time > (time_t) 0)
+                data->time = metadata_time;
+
+        metadata_string = get_metadata_tagset_string (file, TAG_NAME_SETS[KEYWORD_TAG_NAMES]);
+        if ((metadata_string != NULL) && (metadata_string[0] != 0)) {
+		char **keywords_v;
+		int  i = 0;
+
+		comment_data_free_keywords (data);
+
+		keywords_v = g_strsplit (metadata_string, ",", 0);
+
+		while (keywords_v[i] != NULL) {
+			i++;
+		}
+
+		data->keywords_n = i;
+		data->keywords = g_new0 (char*, data->keywords_n + 1);
+
+		for (i = 0; i < data->keywords_n; i++) 
+			data->keywords[i] = g_strdup (keywords_v[i]);
+
+		data->keywords[i] = NULL;
+		g_strfreev (keywords_v);
+		g_free (metadata_string);
+	}
+
+        file_data_unref (file);
+
+	return data;
+}
+
+
+static void
+save_comment_to_metadata (const char  *uri,
+   	                  CommentData *data)
+{
+        char      *keywords_str = NULL;
+	GList     *add_metadata = NULL;
+        FileData  *file;
+        char      *buf;
+        struct tm  tm;
+
+        file = file_data_new (uri, NULL);
+        file_data_update_all (file, FALSE);
+
+	add_metadata = simple_add_metadata (add_metadata, "Exif.Photo.UserComment", data->comment);
+	add_metadata = simple_add_metadata (add_metadata, "Xmp.iptc.Location", data->place);
+
+        localtime_r (&data->time, &tm);
+        buf = g_strdup_printf ("%04d:%02d:%02d %02d:%02d:%02d ",
+                               tm.tm_year + 1900,
+                               tm.tm_mon + 1,
+                               tm.tm_mday,
+                               tm.tm_hour,
+                               tm.tm_min,
+                               tm.tm_sec );
+        add_metadata = simple_add_metadata (add_metadata, "Exif.Image.DateTime", buf);
+
+        if (data->keywords_n > 0) {
+                if (data->keywords_n == 1)
+                        keywords_str = g_strdup (data->keywords[0]);
+                else
+                        keywords_str = g_strjoinv (",", data->keywords);
+        } else
+                keywords_str = g_strdup ("");
+
+	add_metadata = simple_add_metadata (add_metadata, "Xmp.dc.subject", keywords_str);
+
+	update_and_save_metadata (file->path, file->path, add_metadata);
+	free_metadata (add_metadata);
+	file_data_unref (file);
+	g_free (keywords_str);
+}
+
+
+static CommentData *
 load_comment_from_xml (const char *uri)
 {
 	CommentData *data;
@@ -793,12 +544,8 @@
 	if ((uri == NULL) || ! is_local_file (uri))
 		return;
 
-	if (save_embedded) {
-#ifdef HAVE_LIBIPTCDATA
-		if (image_is_jpeg (uri))
-			save_comment_iptc (uri, data);
-#endif /* HAVE_LIBIPTCDATA */
-	}
+	if (save_embedded)
+		save_comment_to_metadata (uri, data);
 
 	if (comment_data_is_void (data)) {
 		comment_delete (uri);
@@ -877,25 +624,19 @@
 	xml_comment = load_comment_from_xml (uri);
 
 	if (try_embedded) {
-#ifdef HAVE_LIBIPTCDATA
-		if (image_is_jpeg (uri))
-			img_comment = load_comment_from_iptc (uri);
+		img_comment = load_comment_from_metadata (uri);
 		if (img_comment != NULL) {
 			if (xml_comment == NULL)
 				xml_comment = comment_data_new ();
-			xml_comment->iptc_data = img_comment->iptc_data;
-			if (xml_comment->iptc_data != NULL)
-				iptc_data_ref (xml_comment->iptc_data);
-		}
-#endif /* HAVE_LIBIPTCDATA */
-		if ((img_comment != NULL)
-		    && (! comment_data_equal (xml_comment, img_comment))) {
-			/* Consider the image comment more up-to-date and
-			 * sync the xml comment with it. */
-			save_comment (uri, img_comment, FALSE);
-			comment_data_free (xml_comment);
-			xml_comment = img_comment;
-			xml_comment->changed = TRUE;
+
+			if (! comment_data_equal (xml_comment, img_comment)) {
+				/* Consider the image comment more up-to-date and
+				 * sync the xml comment with it. */
+				save_comment (uri, img_comment, FALSE);
+				comment_data_free (xml_comment);
+				xml_comment = img_comment;
+				xml_comment->changed = TRUE;
+			}
 		} 
 		else
 			comment_data_free (img_comment);

Modified: trunk/libgthumb/gth-exiv2-utils.cpp
==============================================================================
--- trunk/libgthumb/gth-exiv2-utils.cpp	(original)
+++ trunk/libgthumb/gth-exiv2-utils.cpp	Wed Feb  6 13:11:09 2008
@@ -344,6 +344,10 @@
 {
 	GthMetadata *new_entry;
 
+	/* skip blank values */
+	if ((formatted_value == NULL) || (formatted_value[0] == '\0'))
+		return metadata;
+
 	new_entry = g_new (GthMetadata, 1);
 	new_entry->category = category;
 	new_entry->full_name = g_strdup (full_name);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]