[gthumb] preserve the exif data after a lossless rotation



commit c200cbf310109cba991bafa38d521c7a1af31360
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Fri Jul 16 15:52:54 2010 +0200

    preserve the exif data after a lossless rotation
    
    read the exif data from the input buffer to make sure that they are
    read correctly, instead of reading them from the output buffer after
    the transformation.

 extensions/exiv2_tools/main.c    |   11 +++++------
 extensions/image_rotation/main.c |    7 +++----
 extensions/jpeg_utils/jpegtran.c |   17 ++++++++---------
 extensions/jpeg_utils/jpegtran.h |    9 +++++++++
 extensions/jpeg_utils/transupp.h |    2 ++
 5 files changed, 27 insertions(+), 19 deletions(-)
---
diff --git a/extensions/exiv2_tools/main.c b/extensions/exiv2_tools/main.c
index a8dcf74..87dd411 100644
--- a/extensions/exiv2_tools/main.c
+++ b/extensions/exiv2_tools/main.c
@@ -24,6 +24,7 @@
 #include <config.h>
 #include <gtk/gtk.h>
 #include <gthumb.h>
+#include <extensions/jpeg_utils/jpegtran.h>
 #include "gth-edit-exiv2-page.h"
 #include "gth-metadata-provider-exiv2.h"
 #include "exiv2-utils.h"
@@ -167,21 +168,19 @@ update_exif_dimensions (GFileInfo    *info,
 
 
 static void
-exiv2_jpeg_tran_cb (void         **out_buffer,
-		    gsize         *out_buffer_size,
-		    GthTransform  *transform)
+exiv2_jpeg_tran_cb (JpegTranInfo *tran_info)
 {
 	GFileInfo *info;
 
 	info = g_file_info_new ();
-	if (exiv2_read_metadata_from_buffer (*out_buffer, *out_buffer_size, info, NULL)) {
+	if (exiv2_read_metadata_from_buffer (tran_info->in_buffer, tran_info->in_buffer_size, info, NULL)) {
 		GthMetadata *metadata;
 
-		update_exif_dimensions (info, *transform);
+		update_exif_dimensions (info, tran_info->transformation);
 
 		metadata = g_object_new (GTH_TYPE_METADATA, "raw", "1", NULL);
 		g_file_info_set_attribute_object (info, "Exif::Image::Orientation", G_OBJECT (metadata));
-		exiv2_write_metadata_to_buffer (out_buffer, out_buffer_size, info, NULL, NULL);
+		exiv2_write_metadata_to_buffer (tran_info->out_buffer, tran_info->out_buffer_size, info, NULL, NULL);
 
 		g_object_unref (metadata);
 	}
diff --git a/extensions/image_rotation/main.c b/extensions/image_rotation/main.c
index 321ce7e..6a1195c 100644
--- a/extensions/image_rotation/main.c
+++ b/extensions/image_rotation/main.c
@@ -33,11 +33,10 @@ gthumb_extension_activate (void)
 	/**
 	 * Called after successfully rotating a jpeg image
 	 *
-	 * @out_buffer (void **): pointer to file data
-	 * @out_buffer_size (gsize *): pointer to file data size
-	 * @tranform (GthTransform *): the transformation applied to the file
+	 * @info (JpegTranInfo *): the transformation info as described in
+	 * extensions/jpeg_utils/jpegtran.h
 	 **/
-	gth_hook_register ("jpegtran-after", 3);
+	gth_hook_register ("jpegtran-after", 1);
 
 	gth_hook_add_callback ("gth-browser-construct", 10, G_CALLBACK (ir__gth_browser_construct_cb), NULL);
 	gth_hook_add_callback ("gth-browser-update-sensitivity", 10, G_CALLBACK (ir__gth_browser_update_sensitivity_cb), NULL);
diff --git a/extensions/jpeg_utils/jpegtran.c b/extensions/jpeg_utils/jpegtran.c
index 1aa302d..5484983 100644
--- a/extensions/jpeg_utils/jpegtran.c
+++ b/extensions/jpeg_utils/jpegtran.c
@@ -222,7 +222,6 @@ jpegtran_internal (struct jpeg_decompress_struct  *srcinfo,
 	/* Initialize destination compression parameters from source values */
 	jpeg_copy_critical_parameters (srcinfo, dstinfo);
 
-
 	/* Do not output a JFIF marker for EXIF thumbnails.
 	 * This is not the optimal way to detect the difference
 	 * between a thumbnail and a normal image, but it works
@@ -230,13 +229,6 @@ jpegtran_internal (struct jpeg_decompress_struct  *srcinfo,
 	if (option == JCOPYOPT_NONE)
 		dstinfo->write_JFIF_header = FALSE;
 
-#if JPEG_LIB_VERSION < 80
-	/* Adjust the markers to create a standard EXIF file if an EXIF marker
-	 * is present in the input. By default, libjpeg creates a JFIF file,
-	 * which is incompatible with the EXIF standard. */
-	jcopy_markers_exif (srcinfo, dstinfo, option);
-#endif
-
 	/* Adjust destination parameters if required by transform options;
 	 * also find out which set of coefficient arrays will hold the output.
 	 */
@@ -336,7 +328,14 @@ jpegtran (void           *in_buffer,
 	jpeg_destroy_decompress (&srcinfo);
 
 	if (success) {
-		gth_hook_invoke ("jpegtran-after", out_buffer, out_buffer_size, &transformation);
+		JpegTranInfo info;
+
+		info.in_buffer = in_buffer;
+		info.in_buffer_size = in_buffer_size;
+		info.out_buffer = out_buffer;
+		info.out_buffer_size = out_buffer_size;
+		info.transformation = transformation;
+		gth_hook_invoke ("jpegtran-after", &info);
 	}
 	else {
 		g_free (*out_buffer);
diff --git a/extensions/jpeg_utils/jpegtran.h b/extensions/jpeg_utils/jpegtran.h
index 6c26139..80bafbe 100644
--- a/extensions/jpeg_utils/jpegtran.h
+++ b/extensions/jpeg_utils/jpegtran.h
@@ -46,6 +46,15 @@ typedef enum {
 } JpegMcuAction;
 
 
+typedef struct {
+	void          *in_buffer;
+	gsize          in_buffer_size;
+	void         **out_buffer;
+	gsize         *out_buffer_size;
+	GthTransform   transformation;
+} JpegTranInfo;
+
+
 gboolean   jpegtran  (void           *in_buffer,
 		      gsize           in_buffer_size,
 		      void          **out_buffer,
diff --git a/extensions/jpeg_utils/transupp.h b/extensions/jpeg_utils/transupp.h
index 104fa2e..5f0f69b 100644
--- a/extensions/jpeg_utils/transupp.h
+++ b/extensions/jpeg_utils/transupp.h
@@ -20,6 +20,8 @@
  *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
  */
 
+#include <config.h>
+
 #ifdef HAVE_LIBJPEG
 
 #include <jpeglib.h>



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