1 #include "evas_common.h"
2 #include "evas_private.h"
11 int evas_image_load_file_head_gif(Image_Entry *ie, const char *file, const char *key);
12 int evas_image_load_file_data_gif(Image_Entry *ie, const char *file, const char *key);
14 Evas_Image_Load_Func evas_image_load_gif_func =
16 evas_image_load_file_head_gif,
17 evas_image_load_file_data_gif
22 evas_image_load_file_head_gif(Image_Entry *ie, const char *file, const char *key)
40 fd = open(file, O_RDONLY);
42 fd = open(file, O_RDONLY | O_BINARY);
47 gif = DGifOpenFileHandle(fd);
56 if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
58 /* PrintGifError(); */
59 rec = TERMINATE_RECORD_TYPE;
61 if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done))
63 if (DGifGetImageDesc(gif) == GIF_ERROR)
65 /* PrintGifError(); */
66 rec = TERMINATE_RECORD_TYPE;
69 h = gif->Image.Height;
70 if ((w < 1) || (h < 1) || (w > 8192) || (h > 8192))
77 else if (rec == EXTENSION_RECORD_TYPE)
83 DGifGetExtension(gif, &ext_code, &ext);
86 if ((ext_code == 0xf9) && (ext[1] & 1) && (alpha < 0))
91 DGifGetExtensionNext(gif, &ext);
94 } while (rec != TERMINATE_RECORD_TYPE);
96 if (alpha >= 0) ie->flags.alpha = 1;
105 evas_image_load_file_data_gif(Image_Entry *ie, const char *file, const char *key)
107 int intoffset[] = { 0, 4, 2, 1 };
108 int intjump[] = { 8, 8, 4, 2 };
115 ColorMapObject *cmap;
142 fd = open(file, O_RDONLY);
144 fd = open(file, O_RDONLY | O_BINARY);
149 gif = DGifOpenFileHandle(fd);
157 if (DGifGetRecordType(gif, &rec) == GIF_ERROR)
159 /* PrintGifError(); */
160 rec = TERMINATE_RECORD_TYPE;
162 if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done))
164 if (DGifGetImageDesc(gif) == GIF_ERROR)
166 /* PrintGifError(); */
167 rec = TERMINATE_RECORD_TYPE;
169 w = gif->Image.Width;
170 h = gif->Image.Height;
171 rows = malloc(h * sizeof(GifRowType *));
177 for (i = 0; i < h; i++)
181 for (i = 0; i < h; i++)
183 rows[i] = malloc(w * sizeof(GifPixelType));
187 for (i = 0; i < h; i++)
198 if (gif->Image.Interlace)
200 for (i = 0; i < 4; i++)
202 for (j = intoffset[i]; j < h; j += intjump[i])
204 DGifGetLine(gif, rows[j], w);
210 for (i = 0; i < h; i++)
212 DGifGetLine(gif, rows[i], w);
217 else if (rec == EXTENSION_RECORD_TYPE)
223 DGifGetExtension(gif, &ext_code, &ext);
226 if ((ext_code == 0xf9) && (ext[1] & 1) && (alpha < 0))
231 DGifGetExtensionNext(gif, &ext);
234 } while (rec != TERMINATE_RECORD_TYPE);
236 if (alpha >= 0) ie->flags.alpha = 1;
237 evas_cache_image_surface_alloc(ie, w, h);
238 if (!evas_cache_image_pixels(ie))
241 for (i = 0; i < h; i++)
249 bg = gif->SBackGroundColor;
250 cmap = (gif->Image.ColorMap ? gif->Image.ColorMap : gif->SColorMap);
252 ptr = evas_cache_image_pixels(ie);
253 per_inc = 100.0 / (((double)w) * h);
255 for (i = 0; i < h; i++)
257 for (j = 0; j < w; j++)
259 if (rows[i][j] == alpha)
261 r = cmap->Colors[bg].Red;
262 g = cmap->Colors[bg].Green;
263 b = cmap->Colors[bg].Blue;
264 *ptr++ = 0x00ffffff & ((r << 16) | (g << 8) | b);
268 r = cmap->Colors[rows[i][j]].Red;
269 g = cmap->Colors[rows[i][j]].Green;
270 b = cmap->Colors[rows[i][j]].Blue;
271 *ptr++ = (0xff << 24) | (r << 16) | (g << 8) | b;
276 evas_common_image_premul(ie);
278 for (i = 0; i < h; i++)
288 module_open(Evas_Module *em)
291 em->functions = (void *)(&evas_image_load_gif_func);
301 EAPI Evas_Module_Api evas_modapi =
303 EVAS_MODULE_API_VERSION,
304 EVAS_MODULE_TYPE_IMAGE_LOADER,