-#include "image.h"
+#include "imagei.h"
#include <gif_lib.h>
#ifdef _MSCVER
#include <io.h>
cmapcnt++;
}
+ if (!i_int_check_image_file_limits(GifFile->SWidth, GifFile->SHeight, 3, sizeof(i_sample_t))) {
+ if (colour_table && *colour_table) {
+ myfree(*colour_table);
+ *colour_table = NULL;
+ }
+ DGifCloseFile(GifFile);
+ mm_log((1, "i_readgif: image size exceeds limits\n"));
+ return NULL;
+ }
im = i_img_empty_ch(NULL, GifFile->SWidth, GifFile->SHeight, 3);
+ if (!im) {
+ if (colour_table && *colour_table) {
+ myfree(*colour_table);
+ *colour_table = NULL;
+ }
+ DGifCloseFile(GifFile);
+ return NULL;
+ }
Size = GifFile->SWidth * sizeof(GifPixelType);
i_img_destroy(im);
return NULL;
}
+
+ i_tags_add(&im->tags, "i_format", 0, "gif", -1, 0);
+
return im;
}
i_img **i_readgif_multi_low(GifFileType *GifFile, int *count) {
i_img *img;
- int i, j, Size, Width, Height, ExtCode, Count, x;
+ int i, j, Size, Width, Height, ExtCode, Count;
int ImageNum = 0, BackGround = 0, ColorMapSize = 0;
ColorMapObject *ColorMap;
channels = 3;
if (got_gce && trans_index >= 0)
channels = 4;
+ if (!i_int_check_image_file_limits(Width, Height, channels, sizeof(i_sample_t))) {
+ free_images(results, *count);
+ mm_log((1, "i_readgif: image size exceeds limits\n"));
+ return NULL;
+ }
img = i_img_pal_new(Width, Height, channels, 256);
+ if (!img) {
+ free_images(results, *count);
+ return NULL;
+ }
/* populate the palette of the new image */
mm_log((1, "ColorMapSize %d\n", ColorMapSize));
for (i = 0; i < ColorMapSize; ++i) {
}
}
results[*count-1] = img;
+ i_tags_add(&img->tags, "i_format", 0, "gif", -1, 0);
i_tags_addn(&img->tags, "gif_left", 0, GifFile->Image.Left);
/**(char *)0 = 1;*/
i_tags_addn(&img->tags, "gif_top", 0, GifFile->Image.Top);
has_common_palette(i_img **imgs, int count, i_quantize *quant,
int want_trans) {
int size = quant->mc_count;
- int i, j;
+ int i;
int imgn;
- int x, y;
char used[256];
/* we try to build a common palette here, if we can manage that, then
i_color *orig_colors = quant->mc_colors;
i_color *glob_colors = NULL;
int glob_color_count;
- int glob_map_size;
int glob_want_trans;
int glob_paletted; /* the global map was made from the image palettes */
int colors_paletted;
if ((map = make_gif_map(quant, imgs[0], want_trans)) == NULL) {
i_mempool_destroy(&mp);
EGifCloseFile(gf);
+ quant->mc_colors = orig_colors;
mm_log((1, "Error in MakeMapObject"));
return 0;
}
result = quant_paletted(quant, imgs[0]);
else
result = quant_translate(quant, imgs[0]);
+ if (!result) {
+ i_mempool_destroy(&mp);
+ quant->mc_colors = orig_colors;
+ EGifCloseFile(gf);
+ return 0;
+ }
if (want_trans) {
quant_transparent(quant, result, imgs[0], quant->mc_count);
trans_index = quant->mc_count;
quant_makemap(quant, imgs+imgn, 1);
result = quant_translate(quant, imgs[imgn]);
}
+ if (!result) {
+ i_mempool_destroy(&mp);
+ quant->mc_colors = orig_colors;
+ EGifCloseFile(gf);
+ mm_log((1, "error in quant_translate()"));
+ return 0;
+ }
if (want_trans) {
quant_transparent(quant, result, imgs[imgn], quant->mc_count);
trans_index = quant->mc_count;
mm_log((1, "Error in EGifCloseFile\n"));
return 0;
}
+ if (glob_colors) {
+ int i;
+ for (i = 0; i < glob_color_count; ++i)
+ orig_colors[i] = glob_colors[i];
+ }
+
i_mempool_destroy(&mp);
quant->mc_colors = orig_colors;