From 83bda553c0b1451d75d48bc6e43627765cfca0df Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 21 Jun 2003 00:35:24 +0000 Subject: [PATCH] Don't stop on empty frames. (gif_get_lzw): Handle empty frames as 1x1 2003-06-21 Matthias Clasen * io-gif.c (gif_get_frame_info): Don't stop on empty frames. (gif_get_lzw): Handle empty frames as 1x1 transparent pixbufs. (#106962, Federico Mena Quintero) --- gdk-pixbuf/ChangeLog | 6 ++++++ gdk-pixbuf/io-gif.c | 43 ++++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index f31d752393..9d49a6e935 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,9 @@ +2003-06-21 Matthias Clasen + + * io-gif.c (gif_get_frame_info): Don't stop on empty frames. + (gif_get_lzw): Handle empty frames as 1x1 transparent + pixbufs. (#106962, Federico Mena Quintero) + 2003-06-21 Matthias Clasen * io-gif.c (gif_get_lzw): Correct the calls to update_func() to diff --git a/gdk-pixbuf/io-gif.c b/gdk-pixbuf/io-gif.c index 1b97bb4a35..e5e7657ec9 100644 --- a/gdk-pixbuf/io-gif.c +++ b/gdk-pixbuf/io-gif.c @@ -64,6 +64,7 @@ #undef DUMP_IMAGE_DETAILS +#undef IO_GIFDEBUG #define MAXCOLORMAPSIZE 256 #define MAX_LZW_BITS 12 @@ -792,12 +793,31 @@ gif_get_lzw (GifContext *context) context->frame->composited = NULL; context->frame->revert = NULL; - context->frame->pixbuf = - gdk_pixbuf_new (GDK_COLORSPACE_RGB, - TRUE, - 8, - context->frame_len, - context->frame_height); + if (context->frame_len == 0 || context->frame_height == 0) { + /* An empty frame, we just output a single transparent + * pixel at (0, 0). + */ + context->x_offset = 0; + context->y_offset = 0; + context->frame_len = 1; + context->frame_height = 1; + context->frame->pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, 1, 1); + if (context->frame->pixbuf) { + guchar *pixels; + + pixels = gdk_pixbuf_get_pixels (context->frame->pixbuf); + pixels[0] = 0; + pixels[1] = 0; + pixels[2] = 0; + pixels[3] = 0; + } + } else + context->frame->pixbuf = + gdk_pixbuf_new (GDK_COLORSPACE_RGB, + TRUE, + 8, + context->frame_len, + context->frame_height); if (!context->frame->pixbuf) { g_free (context->frame); g_set_error (context->error, @@ -1180,17 +1200,6 @@ gif_get_frame_info (GifContext *context) context->x_offset = LM_to_uint (buf[0], buf[1]); context->y_offset = LM_to_uint (buf[2], buf[3]); - if ((context->frame_height == 0) || (context->frame_len == 0)) { - context->state = GIF_DONE; - - g_set_error (context->error, - GDK_PIXBUF_ERROR, - GDK_PIXBUF_ERROR_CORRUPT_IMAGE, - _("GIF image contained a frame with height or width 0.")); - - return -2; - } - if (((context->frame_height + context->y_offset) > context->height) || ((context->frame_len + context->x_offset) > context->width)) { /* All frames must fit in the image bounds */