gthumb r2460 - in trunk: . libgthumb



Author: mjc
Date: Sat Dec 20 18:29:50 2008
New Revision: 2460
URL: http://svn.gnome.org/viewvc/gthumb?rev=2460&view=rev

Log:
2008-12-20  Michael J. Chudobiak  <mjc svn gnome org>

        * libgthumb/gth-exiv2-utils.cpp:
        * libgthumb/pixbuf-utils.c: (_gdk_pixbuf_savev):
        Fixed metadata saving with exiv2 0.18. When saving an edited pixbuf,
        first try copying the metadata from a backup copy of the original
        file. If that fails, copy from the internal metadata glist, which is
        less robust, because it does not contain variable-typing data.



Modified:
   trunk/ChangeLog
   trunk/libgthumb/gth-exiv2-utils.cpp
   trunk/libgthumb/pixbuf-utils.c

Modified: trunk/libgthumb/gth-exiv2-utils.cpp
==============================================================================
--- trunk/libgthumb/gth-exiv2-utils.cpp	(original)
+++ trunk/libgthumb/gth-exiv2-utils.cpp	Sat Dec 20 18:29:50 2008
@@ -574,8 +574,6 @@
 		const char *to_file,
 		GList      *metadata_in)
 {
-printf ("\ndebugging: metadata writes are partly broken. Beware!\n");	
-printf ("Copy from %s to %s:\n",from_file,to_file);
 	try {
 		GList *scan;
 
@@ -594,7 +592,6 @@
 			// Update the requested tag
 			GthMetadata *metadatum = (GthMetadata *) scan->data;
 			if (metadatum->full_name != NULL) {
-printf ("Copy tag %s = %s\n",metadatum->full_name, metadatum->raw_value);
 				if (g_str_has_prefix (metadatum->full_name, "Exif")) {
 					ed[metadatum->full_name] = metadatum->raw_value;
 				}
@@ -664,7 +661,6 @@
 		image2->setXmpData (image1->xmpData());
 
 		// overwrite existing metadata with new metadata
-printf ("Did this write work?\n");
 		image2->writeMetadata();
 	}
 

Modified: trunk/libgthumb/pixbuf-utils.c
==============================================================================
--- trunk/libgthumb/pixbuf-utils.c	(original)
+++ trunk/libgthumb/pixbuf-utils.c	Sat Dec 20 18:29:50 2008
@@ -1202,13 +1202,35 @@
 		   char        **values,
 		   GError      **error)
 {
-	gboolean result;
+	char     *temp_backup;
+	char     *temp_dir;
+	char     *ext;
+
+	gboolean  is_overwrite;
+	gboolean  result;
 
 	g_return_val_if_fail (pixbuf != NULL, FALSE);
 	g_return_val_if_fail (local_file != NULL, FALSE);
 	g_return_val_if_fail (type != NULL, FALSE);
 	g_return_val_if_fail (! uri_has_scheme (local_file), FALSE);
 
+	is_overwrite = FALSE;
+
+        temp_dir = get_temp_dir_name ();
+        if (temp_dir != NULL) {
+		is_overwrite = path_exists (local_file);
+		if (is_overwrite) {
+			ext = g_strdup_printf (".%s",get_filename_extension (local_file));
+			temp_backup = get_temp_file_name (temp_dir, ext);
+			g_free (ext);
+			/* Make a backup copy first to preserve original metadata in its original
+			 * fully-typed form. Use the string copies in the metadata glist as a 
+			 * fallback - but exiv2 soemtimes gets the typing wrong,
+			 * causing no metadata to be saved. */
+			file_copy (local_file, temp_backup);
+		}
+	}
+
 #ifdef HAVE_LIBTIFF
 	if (strcmp (type, "tiff") == 0)
 		result = _gdk_pixbuf_save_as_tiff (pixbuf,
@@ -1235,9 +1257,19 @@
 
 	if (result == TRUE) {
 		metadata = simple_add_metadata (metadata, "Exif.Image.Orientation", "1");
-		update_and_save_metadata (local_file, local_file, metadata);
+		if (is_overwrite)
+			update_and_save_metadata (temp_backup, local_file, metadata);
+		else
+			update_and_save_metadata (local_file, local_file, metadata);
 	}
-	
+
+	if (is_overwrite) {
+		file_unlink (temp_backup);
+		local_dir_remove_recursive (temp_dir);
+	}
+
+	g_free (temp_backup);
+	g_free (temp_dir);
 
 	return result;
 }



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