summaryrefslogtreecommitdiff
path: root/apps/plugins/imageviewer/gif/gif_decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/imageviewer/gif/gif_decoder.c')
-rw-r--r--apps/plugins/imageviewer/gif/gif_decoder.c26
1 files changed, 7 insertions, 19 deletions
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)
125 d->frames_count = 0; 125 d->frames_count = 0;
126} 126}
127 127
128static void set_canvas_background(GifPixelType *Line, pixel_t *out, 128static void set_canvas_background(pixel_t *out, GifFileType *GifFile)
129 GifFileType *GifFile)
130{ 129{
131 int i;
132
133 /* Reading Gif spec it seems one should always use background color 130 /* Reading Gif spec it seems one should always use background color
134 * in canvas but most real files omit this and sets background color to 0 131 * in canvas but most real files omit this and sets background color to 0
135 * (which IS valid index). We can choose to either conform to standard 132 * (which IS valid index). We can choose to either conform to standard
136 * (and wrongly display most of gifs with transparency) or stick to 133 * (and wrongly display most of gifs with transparency) or stick to
137 * common practise and treat background color 0 as transparent. 134 * common practise and treat background color 0 as transparent.
138 * I preffer the second. 135 * Moreover when dispose method is BACKGROUND spec suggest
136 * to reset canvas to global background color specified in gif BUT
137 * all renderers I know use transparency instead.
139 */ 138 */
140 if (GifFile->SColorMap && GifFile->SBackGroundColor != 0) 139 memset(out, PIXEL_TRANSPARENT, PIXELS_SZ);
141 {
142 memset(Line, GifFile->SBackGroundColor, GifFile->SWidth);
143
144 for(i=0; i<GifFile->SHeight; i++)
145 gif2pixels(Line, out, i, 0, GifFile->SWidth);
146 }
147 else
148 {
149 memset(out, PIXEL_TRANSPARENT, PIXELS_SZ);
150 }
151
152} 140}
153 141
154/* var names adhere to giflib coding style */ 142/* var names adhere to giflib coding style */
@@ -212,7 +200,7 @@ void gif_decode(struct gif_decoder *d,
212 } 200 }
213 201
214 /* Global background color */ 202 /* Global background color */
215 set_canvas_background(Line, pixels_buffer[0], GifFile); 203 set_canvas_background(pixels_buffer[0], GifFile);
216 204
217 bm.width = GifFile->SWidth; 205 bm.width = GifFile->SWidth;
218 bm.height = GifFile->SHeight; 206 bm.height = GifFile->SHeight;
@@ -335,7 +323,7 @@ void gif_decode(struct gif_decoder *d,
335 switch (GifFile->Image.GCB->DisposalMode) 323 switch (GifFile->Image.GCB->DisposalMode)
336 { 324 {
337 case DISPOSE_BACKGROUND: 325 case DISPOSE_BACKGROUND:
338 set_canvas_background(Line, pixels_buffer[buf_idx], 326 set_canvas_background(pixels_buffer[buf_idx],
339 GifFile); 327 GifFile);
340 break; 328 break;
341 329