[Xfce4-commits] [xfce/tumbler] 01/01: Fix thumbnail orientation (Bug #15011)

noreply at xfce.org noreply at xfce.org
Mon Oct 28 17:59:44 CET 2019


This is an automated email from the git hooks/post-receive script.

a   n   d   r   e       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       m   a   s   t   e   r   
   in repository xfce/tumbler.

commit 784a76c669128541416eb1959ad8a7454539669d
Author: Andre Miranda <andreldm at xfce.org>
Date:   Mon Oct 28 13:55:52 2019 -0300

    Fix thumbnail orientation (Bug #15011)
    
    Use separated structs instead of union to avoid garbled values
    when a file (apparently) contains both types of metadata.
---
 plugins/jpeg-thumbnailer/jpeg-thumbnailer.c | 70 ++++++++++++++---------------
 1 file changed, 34 insertions(+), 36 deletions(-)

diff --git a/plugins/jpeg-thumbnailer/jpeg-thumbnailer.c b/plugins/jpeg-thumbnailer/jpeg-thumbnailer.c
index 0854ed7..712ba2a 100644
--- a/plugins/jpeg-thumbnailer/jpeg-thumbnailer.c
+++ b/plugins/jpeg-thumbnailer/jpeg-thumbnailer.c
@@ -378,23 +378,21 @@ typedef struct
   guint         data_len;
 
   guint         thumb_compression;
-  union
+
+  struct /* thumbnail JPEG */
   {
-    struct /* thumbnail JPEG */
-    {
-      guint     length;
-      guint     offset;
-      guint     orientation;
-    } thumb_jpeg;
-    struct /* thumbnail TIFF */
-    {
-      guint     length;
-      guint     offset;
-      guint     interp;
-      guint     height;
-      guint     width;
-    } thumb_tiff;
-  } thumb;
+    guint     length;
+    guint     offset;
+    guint     orientation;
+  } thumb_jpeg;
+  struct /* thumbnail TIFF */
+  {
+    guint     length;
+    guint     offset;
+    guint     interp;
+    guint     height;
+    guint     width;
+  } thumb_tiff;
 
   gboolean      big_endian;
 } TvtjExif;
@@ -496,15 +494,15 @@ tvtj_exif_parse_ifd (TvtjExif     *exif,
 
           /* and remember it appropriately */
           if (tag == 0x0100)
-            exif->thumb.thumb_tiff.width = value;
+            exif->thumb_tiff.width = value;
           else if (tag == 0x0101)
-            exif->thumb.thumb_tiff.height = value;
+            exif->thumb_tiff.height = value;
           else if (tag == 0x0106)
-            exif->thumb.thumb_tiff.interp = value;
+            exif->thumb_tiff.interp = value;
           else if (tag == 0x0111)
-            exif->thumb.thumb_tiff.offset = value;
+            exif->thumb_tiff.offset = value;
           else
-            exif->thumb.thumb_tiff.length = value;
+            exif->thumb_tiff.length = value;
         }
       else if (tag == 0x0201 || tag == 0x0202)
         {
@@ -516,9 +514,9 @@ tvtj_exif_parse_ifd (TvtjExif     *exif,
 
               /* and remember it appropriately */
               if (G_LIKELY (tag == 0x201))
-                exif->thumb.thumb_jpeg.offset = value;
+                exif->thumb_jpeg.offset = value;
               else
-                exif->thumb.thumb_jpeg.length = value;
+                exif->thumb_jpeg.length = value;
             }
         }
       else if (tag == 0x112)
@@ -529,7 +527,7 @@ tvtj_exif_parse_ifd (TvtjExif     *exif,
             {
               /* determine the orientation value */
               value = tvtj_exif_get_ushort (exif, ifd_ptr + 8);
-              exif->thumb.thumb_jpeg.orientation = MIN (value, 8);
+              exif->thumb_jpeg.orientation = MIN (value, 8);
             }
         }
     }
@@ -655,34 +653,34 @@ tvtj_exif_extract_thumbnail (const guchar *data,
       if (G_LIKELY (exif.thumb_compression == 6)) /* JPEG */
         {
           /* check if we have a valid thumbnail JPEG */
-          if (exif.thumb.thumb_jpeg.offset > 0 && exif.thumb.thumb_jpeg.length > 0
-              && exif.thumb.thumb_jpeg.offset + exif.thumb.thumb_jpeg.length <= length)
+          if (exif.thumb_jpeg.offset > 0 && exif.thumb_jpeg.length > 0
+              && exif.thumb_jpeg.offset + exif.thumb_jpeg.length <= length)
             {
               /* try to load the embedded thumbnail JPEG */
-              thumb = tvtj_jpeg_load (data + exif.thumb.thumb_jpeg.offset, exif.thumb.thumb_jpeg.length, size);
+              thumb = tvtj_jpeg_load (data + exif.thumb_jpeg.offset, exif.thumb_jpeg.length, size);
             }
         }
       else if (exif.thumb_compression == 1) /* Uncompressed */
         {
           /* check if we have a valid thumbnail (current only RGB interpretations) */
-          if (G_LIKELY (exif.thumb.thumb_tiff.interp == 2)
-              && exif.thumb.thumb_tiff.offset > 0 && exif.thumb.thumb_tiff.length > 0
-              && exif.thumb.thumb_tiff.offset + exif.thumb.thumb_tiff.length <= length
-              && exif.thumb.thumb_tiff.height * exif.thumb.thumb_tiff.width == exif.thumb.thumb_tiff.length)
+          if (G_LIKELY (exif.thumb_tiff.interp == 2)
+              && exif.thumb_tiff.offset > 0 && exif.thumb_tiff.length > 0
+              && exif.thumb_tiff.offset + exif.thumb_tiff.length <= length
+              && exif.thumb_tiff.height * exif.thumb_tiff.width == exif.thumb_tiff.length)
             {
               /* plain RGB data, just what we need for a GdkPixbuf */
-              thumb = gdk_pixbuf_new_from_data (g_memdup (data + exif.thumb.thumb_tiff.offset, exif.thumb.thumb_tiff.length),
-                                                GDK_COLORSPACE_RGB, FALSE, 8, exif.thumb.thumb_tiff.width,
-                                                exif.thumb.thumb_tiff.height, exif.thumb.thumb_tiff.width,
+              thumb = gdk_pixbuf_new_from_data (g_memdup (data + exif.thumb_tiff.offset, exif.thumb_tiff.length),
+                                                GDK_COLORSPACE_RGB, FALSE, 8, exif.thumb_tiff.width,
+                                                exif.thumb_tiff.height, exif.thumb_tiff.width,
                                                 (GdkPixbufDestroyNotify) g_free, NULL);
             }
         }
 
      if (thumb != NULL
-         && exif.thumb.thumb_jpeg.orientation > 1)
+         && exif.thumb_jpeg.orientation > 1)
        {
          /* rotate thumbnail */
-         rotated = tvtj_rotate_pixbuf (thumb, exif.thumb.thumb_jpeg.orientation);
+         rotated = tvtj_rotate_pixbuf (thumb, exif.thumb_jpeg.orientation);
          g_object_unref (thumb);
          thumb = rotated;
        }

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list