summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/testpixbuf.c2
-rw-r--r--gdk-pixbuf/io-gif.c71
2 files changed, 64 insertions, 9 deletions
diff --git a/demos/testpixbuf.c b/demos/testpixbuf.c
index 800697b48c..3035e2c979 100644
--- a/demos/testpixbuf.c
+++ b/demos/testpixbuf.c
@@ -464,8 +464,6 @@ main (int argc, char **argv)
GdkPixbuf *pixbuf;
GdkPixbufLoader *pixbuf_loader;
FILE *file;
- gint val;
- guchar buf;
gtk_init (&argc, &argv);
diff --git a/gdk-pixbuf/io-gif.c b/gdk-pixbuf/io-gif.c
index 5282f03bd0..f1dcc6e902 100644
--- a/gdk-pixbuf/io-gif.c
+++ b/gdk-pixbuf/io-gif.c
@@ -56,14 +56,16 @@
* <jrb@redhat.com>
*/
+
+
#include <config.h>
#include <stdio.h>
#include <glib.h>
#include <string.h>
#include "gdk-pixbuf.h"
#include "gdk-pixbuf-io.h"
-
+
#define MAXCOLORMAPSIZE 256
#define MAX_LZW_BITS 12
@@ -73,6 +75,8 @@
#define BitSet(byte, bit) (((byte) & (bit)) == (bit))
#define LM_to_uint(a,b) (((b)<<8)|(a))
+
+
typedef unsigned char CMap[3][MAXCOLORMAPSIZE];
/* Possible states we can be in. */
@@ -173,6 +177,8 @@ struct _GifContext
static int GetDataBlock (GifContext *, unsigned char *);
+
+
#ifdef IO_GIFDEBUG
static int count = 0;
#endif
@@ -226,8 +232,6 @@ gif_read (GifContext *context, guchar *buffer, size_t len)
return 0;
}
-
-
/* Changes the stage to be GIF_GET_COLORMAP */
static void
gif_set_get_colormap (GifContext *context)
@@ -641,9 +645,11 @@ static int
gif_get_lzw (GifContext *context)
{
guchar *dest, *temp;
+ gint lower_bound, upper_bound; /* bounds for emitting the area_updated signal */
+ gboolean bound_flag;
+ gint first_pass; /* bounds for emitting the area_updated signal */
gint v;
-
if (context->pixbuf == NULL) {
context->pixbuf = gdk_pixbuf_new (ART_PIX_RGB,
context->gif89.transparent,
@@ -656,12 +662,17 @@ gif_get_lzw (GifContext *context)
}
dest = gdk_pixbuf_get_pixels (context->pixbuf);
+
+ bound_flag = FALSE;
+ lower_bound = upper_bound = context->draw_ypos;
+ first_pass = context->draw_pass;
+
while (TRUE) {
v = lzw_read_byte (context);
if (v < 0) {
- return v;
+ goto finished_data;
}
-
+ bound_flag = TRUE;
if (context->gif89.transparent) {
temp = dest + context->draw_ypos * gdk_pixbuf_get_rowstride (context->pixbuf) + context->draw_xpos * 4;
@@ -680,6 +691,7 @@ gif_get_lzw (GifContext *context)
gif_fill_in_lines (context, dest, v);
context->draw_xpos++;
+
if (context->draw_xpos == context->frame_len) {
context->draw_xpos = 0;
if (context->frame_interlace) {
@@ -715,6 +727,15 @@ gif_get_lzw (GifContext *context)
} else {
context->draw_ypos++;
}
+ if (context->draw_pass != first_pass) {
+ if (context->draw_ypos > lower_bound) {
+ lower_bound = 0;
+ upper_bound = context->frame_height;
+ } else {
+
+ }
+ } else
+ upper_bound = context->draw_ypos;
}
if (context->draw_ypos >= context->frame_height)
break;
@@ -722,7 +743,42 @@ gif_get_lzw (GifContext *context)
done:
/* we got enough data. there may be more (ie, newer layers) but we can quit now */
context->state = GIF_DONE;
- return 0;
+ v = 0;
+ finished_data:
+ if (bound_flag && context->update_func) {
+ if (lower_bound <= upper_bound && first_pass == context->draw_pass) {
+ (* context->update_func)
+ (context->pixbuf,
+ context->user_data,
+ 0, lower_bound,
+ gdk_pixbuf_get_width (context->pixbuf),
+ upper_bound - lower_bound);
+ } else {
+ if (lower_bound <= upper_bound) {
+ (* context->update_func)
+ (context->pixbuf,
+ context->user_data,
+ 0, 0,
+ gdk_pixbuf_get_width (context->pixbuf),
+ gdk_pixbuf_get_height (context->pixbuf));
+ } else {
+ (* context->update_func)
+ (context->pixbuf,
+ context->user_data,
+ 0, 0,
+ gdk_pixbuf_get_width (context->pixbuf),
+ upper_bound);
+ (* context->update_func)
+ (context->pixbuf,
+ context->user_data,
+ 0, lower_bound,
+ gdk_pixbuf_get_width (context->pixbuf),
+ gdk_pixbuf_get_height (context->pixbuf));
+ }
+ }
+ }
+
+ return v;
}
static void
@@ -978,6 +1034,7 @@ image_begin_load (ModulePreparedNotifyFunc prepare_func,
#endif
context = g_new (GifContext, 1);
context->prepare_func = prepare_func;
+ context->update_func = update_func;
context->user_data = user_data;
context->file = NULL;
context->pixbuf = NULL;