[gdk-pixbuf] gdip: fix gif animation delays between frames



commit ee81d3fc611a0e64dc55c4f2a2fda73932de2fe6
Author: Keith Moyer <gnome-bugzilla keithmoyer com>
Date:   Sat Oct 1 01:32:40 2011 +0200

    gdip: fix gif animation delays between frames
    
    1. delay value of first frame was being used for all frames
    2. when a frame specifies a delay of 0ms, use 100ms instead of 20ms
       (matches gdk-pixbuf/io-gif.c)
    3. when a frame specifies a delay of < 20ms, use 20ms instead
       (also matches gdk-pixbuf/io-gif.c)
    
    https://bugzilla.gnome.org/show_bug.cgi?id=655755

 gdk-pixbuf/io-gdip-utils.c |   27 ++++++++++++++++-----------
 1 files changed, 16 insertions(+), 11 deletions(-)
---
diff --git a/gdk-pixbuf/io-gdip-utils.c b/gdk-pixbuf/io-gdip-utils.c
index 8f62d75..01befd8 100644
--- a/gdk-pixbuf/io-gdip-utils.c
+++ b/gdk-pixbuf/io-gdip-utils.c
@@ -480,9 +480,9 @@ gdip_bitmap_get_property_as_string (GpBitmap *bitmap, guint propertyId, gchar **
 }
 
 static gboolean
-gdip_bitmap_get_frame_delay (GpBitmap *bitmap, guint *delay)
+gdip_bitmap_get_frame_delay (GpBitmap *bitmap, guint frame, guint *delay)
 {
-  guint item_size;
+  guint item_size, item_count;
   gboolean success = FALSE;
 
   if (bitmap == NULL || delay == NULL)
@@ -495,8 +495,9 @@ gdip_bitmap_get_frame_delay (GpBitmap *bitmap, guint *delay)
     
     item = (PropertyItem *)g_try_malloc (item_size);
     if (Ok == GdipGetPropertyItem ((GpImage *)bitmap, PropertyTagFrameDelay, item_size, item)) {
+      item_count = item_size / sizeof(long);
       /* PropertyTagFrameDelay. Time delay, in hundredths of a second, between two frames in an animated GIF image. */
-      *delay = *((long *)item->value);
+      *delay = ((long *)item->value)[(frame < item_count) ? frame : item_count - 1];
       success = TRUE;
     }
     
@@ -697,7 +698,7 @@ stop_load (GpBitmap *bitmap, GdipContext *context, GError **error)
     frame = g_new (GdkPixbufFrame, 1);
     frame->pixbuf = pixbuf;
 
-    gdip_bitmap_get_frame_delay (bitmap, &frame_delay);
+    gdip_bitmap_get_frame_delay (bitmap, i, &frame_delay);
   
     animation->n_frames++;
     animation->frames = g_list_append (animation->frames, frame);
@@ -707,16 +708,20 @@ stop_load (GpBitmap *bitmap, GdipContext *context, GError **error)
 
     /* GIF delay is in hundredths, we want thousandths */
     frame->delay_time = frame_delay * 10;
-    frame->elapsed = animation->total_time;
-    
-    /* Some GIFs apparently have delay time of 0,
-     * that crashes everything so set it to "fast".
-     * Also, timeouts less than 20 or so just lock up
-     * the app or make the animation choppy, so fix them.
+
+    /* GIFs with delay time 0 are mostly broken, but they
+     * just want a default, "not that fast" delay.
      */
-    if (frame->delay_time < 20)
+    if (frame->delay_time == 0)
+      frame->delay_time = 100;
+
+    /* No GIFs gets to play faster than 50 fps. They just
+     * lock up poor gtk.
+     */
+    else if (frame->delay_time < 20)
       frame->delay_time = 20; /* 20 = "fast" */
 
+    frame->elapsed = animation->total_time;
     animation->total_time += frame->delay_time;
 
     if (i == 0)



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]