]> code.delx.au - gnu-emacs/commitdiff
(imagemagick_compute_animated_image): Respect the GIF disposal methods.
authorLars Magne Ingebrigtsen <larsi@gnus.org>
Thu, 15 Aug 2013 17:20:06 +0000 (19:20 +0200)
committerLars Magne Ingebrigtsen <larsi@gnus.org>
Thu, 15 Aug 2013 17:20:06 +0000 (19:20 +0200)
src/ChangeLog
src/image.c

index c12b32ebc714b89af5630ed2f8ed8df4b075d5b9..028c33848a4d8c2358b00cb53ee40caf736f25e5 100644 (file)
@@ -1,3 +1,8 @@
+2013-08-15  Lars Magne Ingebrigtsen  <larsi@gnus.org>
+
+       * image.c (imagemagick_compute_animated_image): Respect the GIF
+       disposal methods.
+
 2013-08-15  Ken Brown  <kbrown@cornell.edu>
 
        * emacs.c (main): Update comment about G_SLICE_ALWAYS_MALLOC.
index 3cab72edf74921742ced1be045d978323832ac78..3c5ee4ce66f5e8df33f8aa02b4e095ea8061aa23 100644 (file)
@@ -7887,17 +7887,20 @@ imagemagick_compute_animated_image (MagickWand *super_wand, int ino)
   else
     composite_wand = animation_cache;
 
-  for (i = max (1, animation_index); i <= ino; i++)
+  for (i = max (1, animation_index + 1); i <= ino; i++)
     {
       MagickWand *sub_wand;
       PixelIterator *source_iterator, *dest_iterator;
       PixelWand **source, **dest;
       size_t source_width, dest_width;
       MagickPixelPacket pixel;
+      DisposeType dispose;
 
       MagickSetIteratorIndex (super_wand, i);
       sub_wand = MagickGetImage (super_wand);
 
+      dispose = MagickGetImageDispose (sub_wand);
+
       source_iterator = NewPixelIterator (sub_wand);
       if (! source_iterator)
        {
@@ -7926,12 +7929,20 @@ imagemagick_compute_animated_image (MagickWand *super_wand, int ino)
          dest = PixelGetNextIteratorRow (dest_iterator, &dest_width);
          for (x = 0; x < source_width; x++)
            {
-             /* Copy over non-transparent pixels. */
-             if (PixelGetAlpha (source[x]))
+             if (dispose == BackgroundDispose)
                {
                  PixelGetMagickColor (source[x], &pixel);
                  PixelSetMagickColor (dest[x], &pixel);
                }
+             else
+               {
+                 /* Copy over non-transparent pixels. */
+                 if (PixelGetAlpha (source[x]))
+                   {
+                     PixelGetMagickColor (source[x], &pixel);
+                     PixelSetMagickColor (dest[x], &pixel);
+                   }
+               }
            }
          PixelSyncIterator(dest_iterator);
        }