[prev in list] [next in list] [prev in thread] [next in thread] 

List:       graphicsmagick-commit
Subject:    [GM-commit] GraphicsMagick: 2 new changesets
From:       GraphicsMagick Commits <graphicsmagick-commit () lists ! sourceforge ! net>
Date:       2023-04-30 22:18:39
Message-ID: mailman.11767.1682893128.1830.graphicsmagick-commit () lists ! sourceforge ! net
[Download RAW message or body]

changeset 80ee010ff0da in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=80ee010ff0da
summary: HEIF: Fix reading images with rotation/transformation; added option to ignore them

changeset 3316416208d1 in /hg/GraphicsMagick
details: http://hg.GraphicsMagick.org/hg/GraphicsMagick?cmd=changeset;node=3316416208d1
summary: Use C99 comment syntax

diffstat:

 coders/heif.c |  37 ++++++++++++++++++++++++++++++++++---
 1 files changed, 34 insertions(+), 3 deletions(-)

diffs (83 lines):

diff -r 6fbaa24a0978 -r 3316416208d1 coders/heif.c
--- a/coders/heif.c	Sun Apr 30 17:05:33 2023 -0500
+++ b/coders/heif.c	Sun Apr 30 17:18:35 2023 -0500
@@ -461,6 +461,12 @@
   PixelPacket
     *q;
 
+  const char
+    *value;
+
+  MagickBool
+    ignore_transformations;
+
   assert(image_info != (const ImageInfo *) NULL);
   assert(image_info->signature == MagickSignature);
   assert(exception != (ExceptionInfo *) NULL);
@@ -484,6 +490,11 @@
   if (ReadBlob(image,in_len,in_buf) != in_len)
     ThrowHEIFReaderException(CorruptImageError, UnexpectedEndOfFile, image);
 
+  ignore_transformations = MagickFalse;
+  if ((value=AccessDefinition(image_info,"heic","ignore_transformations")))
+    if (LocaleCompare(value,"TRUE") == 0)
+      ignore_transformations = MagickTrue;
+
   /* Init HEIF-Decoder handles */
   heif=heif_context_alloc();
 
@@ -516,6 +527,10 @@
       ThrowHEIFReaderException(CorruptImageError, AnErrorHasOccurredReadingFromFile, image);
     }
 
+  /*
+    Note: Those values are preliminary but likely the upper bound
+    The real image values might be rotated or cropped due to transformations
+  */
   image->columns=heif_image_handle_get_width(heif_image_handle);
   image->rows=heif_image_handle_get_height(heif_image_handle);
   if (heif_image_handle_has_alpha_channel(heif_image_handle))
@@ -543,7 +558,11 @@
       return NULL;
     }
 
-  if (image_info->ping)
+  /*
+    When apply transformations (the default) the whole image has to be
+    read to get the real dimensions.
+  */
+  if (image_info->ping && ignore_transformations)
     {
       image->depth = 8;
       HEIFReadCleanup();
@@ -565,7 +584,7 @@
   progress_user_data.progress = 0;
 
   /* version 1 options */
-  decode_options->ignore_transformations = 0;
+  decode_options->ignore_transformations = ignore_transformations == MagickTrue ? 1 : 0;
 #if HEIF_ENABLE_PROGRESS_MONITOR
   decode_options->start_progress = start_progress;
   decode_options->on_progress = on_progress;
@@ -600,8 +619,20 @@
       ThrowHEIFReaderException(CorruptImageError, AnErrorHasOccurredReadingFromFile, image);
     }
 
+  /* Update with final values, see preliminary note above */
+  image->columns=heif_image_get_primary_width(heif_image);
+  image->rows=heif_image_get_primary_height(heif_image);
+
+  if (image_info->ping)
+    {
+      image->depth = 8;
+      HEIFReadCleanup();
+      CloseBlob(image);
+      return image;
+    }
+
   image->depth=heif_image_get_bits_per_pixel(heif_image, heif_channel_interleaved);
-  /* the requested channel is interleaved there depth is a sum of all channels
+  /* The requested channel is interleaved there depth is a sum of all channels
      split it up again: */
   if (image->logging)
     {


_______________________________________________
Graphicsmagick-commit mailing list
Graphicsmagick-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/graphicsmagick-commit
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic