From: Lars Magne Ingebrigtsen Date: Thu, 15 Aug 2013 19:46:02 +0000 (+0200) Subject: (imagemagick_compute_animated_image): Allow certain degenerate images X-Git-Tag: emacs-24.3.90~173^2^2~42^2~45^2~387^2~1686^2~220 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=7967001450f4a3e76e37355740fa942290cede26;p=emacs.git (imagemagick_compute_animated_image): Allow certain degenerate images (imagemagick_compute_animated_image): Allow images that say they have sub-images that are bigger than the main image, but just crop them. --- diff --git a/src/ChangeLog b/src/ChangeLog index 431802eab45..dd4697298ac 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -4,6 +4,9 @@ when sub-images are smaller than the main image. (imagemagick_compute_animated_image): Setting the iterator row to zero is apparently not allowed. + (imagemagick_compute_animated_image): Allow images that say they + have sub-images that are bigger than the main image, but just crop + them. 2013-08-15 Jan Djärv diff --git a/src/image.c b/src/image.c index 6f92c583554..d7e1d7991dd 100644 --- a/src/image.c +++ b/src/image.c @@ -7900,6 +7900,7 @@ imagemagick_compute_animated_image (MagickWand *super_wand, int ino) ssize_t source_left, source_top; MagickPixelPacket pixel; DisposeType dispose; + ptrdiff_t lines = 0; MagickSetIteratorIndex (super_wand, i); sub_wand = MagickGetImage (super_wand); @@ -7907,17 +7908,6 @@ imagemagick_compute_animated_image (MagickWand *super_wand, int ino) MagickGetImagePage (sub_wand, &source_width, &source_height, &source_left, &source_top); - /* Sanity check. The sub-image should not be bigger than the - base image. */ - if (source_height + source_top > dest_height) - { - DestroyMagickWand (composite_wand); - DestroyMagickWand (sub_wand); - animation_cache = NULL; - image_error ("Inconsinstent animation size", Qnil, Qnil); - return NULL; - } - dispose = MagickGetImageDispose (sub_wand); source_iterator = NewPixelIterator (sub_wand); @@ -7946,17 +7936,26 @@ imagemagick_compute_animated_image (MagickWand *super_wand, int ino) /* The sub-image may not start at origo, so move the destination iterator to where the sub-image should start. */ if (source_top > 0) - PixelSetIteratorRow (dest_iterator, source_top); + { + PixelSetIteratorRow (dest_iterator, source_top); + lines = source_top; + } while ((source = PixelGetNextIteratorRow (source_iterator, &source_width)) != NULL) { ptrdiff_t x; + + /* Sanity check. This shouldn't happen, but apparently + does in some pictures. */ + if (++lines >= dest_height) + break; + dest = PixelGetNextIteratorRow (dest_iterator, &dest_width); for (x = 0; x < source_width; x++) { /* Sanity check. This shouldn't happen, but apparently - does in some pictures. */ + also does in some pictures. */ if (x + source_left > dest_width) break; /* Normally we only copy over non-transparent pixels,