From 62cb84a57c6faa84e249e1a62e9e08af824b7ff2 Mon Sep 17 00:00:00 2001 From: Marcin Bukat Date: Thu, 18 Apr 2013 09:36:05 +0200 Subject: [PATCH] imageviewer: fix animated gifs handling If disposal method is set to BACKGROUND one would expect that canvas should be restored to global background color. That is what gif standard suggests. Most (all?) decoders however treat this as reseting canvas to transparency or fixed, decoder specific background color. Virtually all gifs are prepared with this in mind so to not break them we can't follow standard here. Change-Id: I90ca712bba89d4190771eb5320eabda353d3e2bb --- apps/plugins/imageviewer/gif/gif.c | 7 +++--- apps/plugins/imageviewer/gif/gif_decoder.c | 26 ++++++---------------- 2 files changed, 10 insertions(+), 23 deletions(-) diff --git a/apps/plugins/imageviewer/gif/gif.c b/apps/plugins/imageviewer/gif/gif.c index c3cad71e10..31fd11d9a6 100644 --- a/apps/plugins/imageviewer/gif/gif.c +++ b/apps/plugins/imageviewer/gif/gif.c @@ -110,10 +110,9 @@ static int load_image(char *filename, struct image_info *info, if (!iv->running_slideshow) { - rb->lcd_putsf(0, 2, "image %dx%d", - p_decoder->width, - p_decoder->height); - rb->lcd_putsf(0, 3, "decoding %d*%d", + rb->lcd_putsf(0, 2, "file: %s", + filename); + rb->lcd_putsf(0, 3, "size: %dx%d", p_decoder->width, p_decoder->height); rb->lcd_update(); diff --git a/apps/plugins/imageviewer/gif/gif_decoder.c b/apps/plugins/imageviewer/gif/gif_decoder.c index 74330c3d1d..e45814cbef 100644 --- a/apps/plugins/imageviewer/gif/gif_decoder.c +++ b/apps/plugins/imageviewer/gif/gif_decoder.c @@ -125,30 +125,18 @@ void gif_open(char *filename, struct gif_decoder *d) d->frames_count = 0; } -static void set_canvas_background(GifPixelType *Line, pixel_t *out, - GifFileType *GifFile) +static void set_canvas_background(pixel_t *out, GifFileType *GifFile) { - int i; - /* Reading Gif spec it seems one should always use background color * in canvas but most real files omit this and sets background color to 0 * (which IS valid index). We can choose to either conform to standard * (and wrongly display most of gifs with transparency) or stick to * common practise and treat background color 0 as transparent. - * I preffer the second. + * Moreover when dispose method is BACKGROUND spec suggest + * to reset canvas to global background color specified in gif BUT + * all renderers I know use transparency instead. */ - if (GifFile->SColorMap && GifFile->SBackGroundColor != 0) - { - memset(Line, GifFile->SBackGroundColor, GifFile->SWidth); - - for(i=0; iSHeight; i++) - gif2pixels(Line, out, i, 0, GifFile->SWidth); - } - else - { - memset(out, PIXEL_TRANSPARENT, PIXELS_SZ); - } - + memset(out, PIXEL_TRANSPARENT, PIXELS_SZ); } /* var names adhere to giflib coding style */ @@ -212,7 +200,7 @@ void gif_decode(struct gif_decoder *d, } /* Global background color */ - set_canvas_background(Line, pixels_buffer[0], GifFile); + set_canvas_background(pixels_buffer[0], GifFile); bm.width = GifFile->SWidth; bm.height = GifFile->SHeight; @@ -335,7 +323,7 @@ void gif_decode(struct gif_decoder *d, switch (GifFile->Image.GCB->DisposalMode) { case DISPOSE_BACKGROUND: - set_canvas_background(Line, pixels_buffer[buf_idx], + set_canvas_background(pixels_buffer[buf_idx], GifFile); break;