#define myGifError(gif) ((gif)->Error)
#define MakeMapObject GifMakeMapObject
#define FreeMapObject GifFreeMapObject
-
+#define gif_mutex_lock(mutex)
+#define gif_mutex_unlock(mutex)
#else
#define PRE_SET_VERSION
static GifFileType *
return result;
}
#define myGifError(gif) GifLastError()
+#define gif_mutex_lock(mutex) i_mutex_lock(mutex)
+#define gif_mutex_unlock(mutex) i_mutex_unlock(mutex)
#endif
InterlacedOffset[] = { 0, 4, 2, 1 }, /* The way Interlaced image should. */
InterlacedJumps[] = { 8, 8, 4, 2 }; /* be read - offsets and jumps... */
+#if !defined(GIFLIB_MAJOR) || GIFLIB_MAJOR < 5
+static i_mutex_t mutex;
+#endif
+
+void
+i_init_gif(void) {
+#if !defined(GIFLIB_MAJOR) || GIFLIB_MAJOR < 5
+ mutex = i_mutex_new();
+#endif
+}
+
static
void
i_colortable_copy(int **colour_table, int *colours, ColorMapObject *colourmap) {
i_readgif_low(GifFileType *GifFile, int **colour_table, int *colours) {
i_img *im;
int i, j, Size, Row, Col, Width, Height, ExtCode, Count, x;
- int cmapcnt = 0, ImageNum = 0, BackGround = 0, ColorMapSize = 0;
+ int cmapcnt = 0, ImageNum = 0;
ColorMapObject *ColorMap;
GifRecordType RecordType;
*/
if (colour_table) *colour_table = NULL;
- BackGround = GifFile->SBackGroundColor;
ColorMap = (GifFile->Image.ColorMap ? GifFile->Image.ColorMap : GifFile->SColorMap);
if (ColorMap) {
- ColorMapSize = ColorMap->ColorCount;
i_colortable_copy(colour_table, colours, ColorMap);
cmapcnt++;
}
if (( ColorMap = (GifFile->Image.ColorMap ? GifFile->Image.ColorMap : GifFile->SColorMap) )) {
mm_log((1, "Adding local colormap\n"));
- ColorMapSize = ColorMap->ColorCount;
if ( cmapcnt == 0) {
i_colortable_copy(colour_table, colours, ColorMap);
cmapcnt++;
i_readgif_multi_low(GifFileType *GifFile, int *count, int page) {
i_img *img;
int i, j, Size, Width, Height, ExtCode, Count;
- int ImageNum = 0, BackGround = 0, ColorMapSize = 0;
+ int ImageNum = 0, ColorMapSize = 0;
ColorMapObject *ColorMap;
GifRecordType RecordType;
mm_log((1,"i_readgif_multi_low(GifFile %p, , count %p)\n", GifFile, count));
- BackGround = GifFile->SBackGroundColor;
-
Size = GifFile->SWidth * sizeof(GifPixelType);
GifRow = (GifRowType) mymalloc(Size);
i_readgif_multi_wiol(io_glue *ig, int *count) {
GifFileType *GifFile;
int gif_error;
+ i_img **result;
+
+ gif_mutex_lock(mutex);
i_clear_error();
gif_push_error(gif_error);
i_push_error(0, "Cannot create giflib callback object");
mm_log((1,"i_readgif_multi_wiol: Unable to open callback datasource.\n"));
+ gif_mutex_unlock(mutex);
return NULL;
}
- return i_readgif_multi_low(GifFile, count, -1);
+ result = i_readgif_multi_low(GifFile, count, -1);
+
+ gif_mutex_unlock(mutex);
+
+ return result;
}
static int
i_readgif_wiol(io_glue *ig, int **color_table, int *colors) {
GifFileType *GifFile;
int gif_error;
+ i_img *result;
+
+ gif_mutex_lock(mutex);
i_clear_error();
gif_push_error(gif_error);
i_push_error(0, "Cannot create giflib callback object");
mm_log((1,"i_readgif_wiol: Unable to open callback datasource.\n"));
+ gif_mutex_unlock(mutex);
return NULL;
}
- return i_readgif_low(GifFile, color_table, colors);
+ result = i_readgif_low(GifFile, color_table, colors);
+
+ gif_mutex_unlock(mutex);
+
+ return result;
}
/*
i_readgif_single_wiol(io_glue *ig, int page) {
GifFileType *GifFile;
int gif_error;
+ i_img *result;
i_clear_error();
if (page < 0) {
return NULL;
}
+ gif_mutex_lock(mutex);
if ((GifFile = myDGifOpen((void *)ig, io_glue_read_cb, &gif_error )) == NULL) {
gif_push_error(gif_error);
i_push_error(0, "Cannot create giflib callback object");
mm_log((1,"i_readgif_wiol: Unable to open callback datasource.\n"));
+ gif_mutex_unlock(mutex);
return NULL;
}
- return i_readgif_single_low(GifFile, page);
+ result = i_readgif_single_low(GifFile, page);
+
+ gif_mutex_unlock(mutex);
+
+ return result;
}
/*
int gif_error;
int result;
+ gif_mutex_lock(mutex);
+
i_clear_error();
#ifdef PRE_SET_VERSION
gif_push_error(gif_error);
i_push_error(0, "Cannot create giflib callback object");
mm_log((1,"i_writegif_wiol: Unable to open callback datasource.\n"));
+ gif_mutex_unlock(mutex);
return 0;
}
result = i_writegif_low(quant, GifFile, imgs, count);
+ gif_mutex_unlock(mutex);
+
if (i_io_close(ig))
return 0;
Arnar M. Hrafnkelsson, addi@umich.edu
+Tony Cook <tonyc@cpan.org>
+
=head1 SEE ALSO
perl(1), Imager(3)