]> granicus.if.org Git - imagemagick/commitdiff
Added image->duration, compute it in coders/gif.c, report it in identify.c
authorglennrp <glennrp@git.imagemagick.org>
Sat, 25 Jan 2014 16:59:43 +0000 (16:59 +0000)
committerglennrp <glennrp@git.imagemagick.org>
Sat, 25 Jan 2014 16:59:43 +0000 (16:59 +0000)
MagickCore/identify.c
MagickCore/image.h
coders/gif.c

index f6c95ccf0f2f7fafe47d38545730b5ff51feb12d..e823ee524019d1c537e373c607e9ec8e99ffb16c 100644 (file)
@@ -1053,6 +1053,9 @@ MagickExport MagickBooleanType IdentifyImage(Image *image,FILE *file,
   if (image->iterations != 1)
     (void) FormatLocaleFile(file,"  Iterations: %.20g\n",(double)
       image->iterations);
+  if (image->duration != 0)
+    (void) FormatLocaleFile(file,"  Duration: %.20g\n",(double)
+      image->duration);
   if ((image->next != (Image *) NULL) || (image->previous != (Image *) NULL))
     (void) FormatLocaleFile(file,"  Scene: %.20g of %.20g\n",(double)
       image->scene,(double) GetImageListLength(image));
index 18f938c2ab359ef0d7f4171a4a3cc0085a8be0e7..87df70bc8d3fea23f8cf8bf4012190ad86fe041d 100644 (file)
@@ -236,7 +236,8 @@ struct _Image
 
   size_t
     scene,          /* index of image in multi-image file */
-    delay;          /* Animation delay time */
+    delay,          /* Animation delay time */
+    duration;       /* Total animation duration sum(delay*iterations) */
 
   ssize_t
     ticks_per_second;  /* units for delay time, default 100 for GIF */
index 10ff941d16277c2015c1f1ab5392fb3d6adf7e42..a4986b28e6145250e179d279fe7fcb4acd58ba14 100644 (file)
@@ -986,6 +986,7 @@ static Image *ReadGIFImage(const ImageInfo *image_info,ExceptionInfo *exception)
   size_t
     delay,
     dispose,
+    duration,
     global_colors,
     image_count,
     iterations,
@@ -1042,6 +1043,7 @@ static Image *ReadGIFImage(const ImageInfo *image_info,ExceptionInfo *exception)
     count=ReadBlob(image,(size_t) (3*global_colors),global_colormap);
   delay=0;
   dispose=0;
+  duration=0;
   iterations=1;
   opacity=(-1);
   image_count=0;
@@ -1263,7 +1265,6 @@ static Image *ReadGIFImage(const ImageInfo *image_info,ExceptionInfo *exception)
     image->alpha_trait=opacity >= 0 ? BlendPixelTrait : UndefinedPixelTrait;
     delay=0;
     dispose=0;
-    iterations=1;
     if ((image->columns == 0) || (image->rows == 0))
       {
         global_colormap=(unsigned char *) RelinquishMagickMemory(
@@ -1359,6 +1360,7 @@ static Image *ReadGIFImage(const ImageInfo *image_info,ExceptionInfo *exception)
           global_colormap);
         ThrowReaderException(CorruptImageError,"CorruptImage");
       }
+    duration += image->delay * image->iterations;
     if (image_info->number_scenes != 0)
       if (image->scene >= (image_info->scene+image_info->number_scenes-1))
         break;
@@ -1368,6 +1370,7 @@ static Image *ReadGIFImage(const ImageInfo *image_info,ExceptionInfo *exception)
     if (status == MagickFalse)
       break;
   }
+  image->duration=duration;
   meta_image=DestroyImage(meta_image);
   global_colormap=(unsigned char *) RelinquishMagickMemory(global_colormap);
   if ((image->columns == 0) || (image->rows == 0))