--- src/gifcodec.c | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) Index: libgdiplus-2.10.9/src/gifcodec.c =================================================================== --- libgdiplus-2.10.9.orig/src/gifcodec.c +++ libgdiplus-2.10.9/src/gifcodec.c @@ -39,8 +39,15 @@ GUID gdip_gif_image_format_guid = {0xb96 #include "gifcodec.h" +#if !defined(GIFLIB_MAJOR) || GIFLIB_MAJOR < 5 /* giflib declares this incorrectly as EgifOpen */ extern GifFileType *EGifOpen(void *userData, OutputFunc writeFunc); +#endif +#if !defined(GIFLIB_MAJOR) || !(GIFLIB_MAJOR > 5 || \ + (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1)) +# define DGifCloseFile(a, b) DGifCloseFile(a) +# define EGifCloseFile(a, b) EGifCloseFile(a) +#endif /* Data structure used for callback */ typedef struct @@ -105,7 +112,7 @@ gdip_gif_inputfunc (GifFileType *gif, Gi */ static int -AddExtensionBlockMono(SavedImage *New, int Len, BYTE ExtData[]) +AddExtensionBlockMono(SavedImage *New, int Len, int func, BYTE ExtData[]) { ExtensionBlock *ep; @@ -129,7 +136,7 @@ AddExtensionBlockMono(SavedImage *New, i if (ExtData) { memcpy(ep->Bytes, ExtData, Len); - ep->Function = New->Function; + ep->Function = func; } return (GIF_OK); @@ -232,20 +239,20 @@ DGifSlurpMono(GifFileType * GifFile, Sav } case EXTENSION_RECORD_TYPE: { - if (DGifGetExtension(GifFile, &temp_save.Function, &ExtData) == GIF_ERROR) { + int func; + if (DGifGetExtension(GifFile, &func, &ExtData) == GIF_ERROR) { return (GIF_ERROR); } while (ExtData != NULL) { /* Create an extension block with our data */ - if (AddExtensionBlockMono(&temp_save, ExtData[0], &ExtData[1]) == GIF_ERROR) { + if (AddExtensionBlockMono(&temp_save, func, ExtData[0], &ExtData[1]) == GIF_ERROR) { return (GIF_ERROR); } if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR) { return (GIF_ERROR); } - temp_save.Function = 0; } break; } @@ -303,12 +310,19 @@ gdip_load_gif_image (void *stream, GpIma result = NULL; loop_counter = FALSE; +#if GIFLIB_MAJOR < 5 if (from_file) { gif = DGifOpen(stream, &gdip_gif_fileinputfunc); } else { gif = DGifOpen (stream, &gdip_gif_inputfunc); } - +#else + if (from_file) + gif = DGifOpen(stream, &gdip_gif_fileinputfunc, NULL); + else + gif = DGifOpen(stream, &gdip_gif_inputfunc, NULL); +#endif + if (gif == NULL) { goto error; } @@ -581,7 +595,7 @@ gdip_load_gif_image (void *stream, GpIma } FreeExtensionMono(&global_extensions); - DGifCloseFile (gif); + DGifCloseFile (gif, NULL); *image = result; return Ok; @@ -597,7 +611,7 @@ error: if (gif != NULL) { FreeExtensionMono (&global_extensions); - DGifCloseFile (gif); + DGifCloseFile (gif, NULL); } *image = NULL; @@ -660,11 +674,22 @@ gdip_save_gif_image (void *stream, GpIma return InvalidParameter; } +#if GIFLIB_MAJOR < 5 if (from_file) { fp = EGifOpenFileName (stream, 0); } else { fp = EGifOpen (stream, gdip_gif_outputfunc); } +#else + if (from_file) + fp = EGifOpenFileName (stream, 0, NULL); + else + fp = EGifOpen (stream, gdip_gif_outputfunc, NULL); +#define MakeMapObject GifMakeMapObject +#define FreeMapObject GifFreeMapObject +#define QuantizeBuffer GifQuantizeBuffer +#define BitSize GifBitSize +#endif if (!fp) { return FileNotFound; @@ -848,8 +873,15 @@ gdip_save_gif_image (void *stream, GpIma Buffer[0] = 1; Buffer[1] = ptr[0]; Buffer[2] = ptr[1]; +#if GIFLIB_MAJOR < 5 EGifPutExtensionFirst(fp, APPLICATION_EXT_FUNC_CODE, 11, "NETSCAPE2.0"); EGifPutExtensionLast(fp, APPLICATION_EXT_FUNC_CODE, 3, Buffer); +#else + EGifPutExtensionLeader(fp, APPLICATION_EXT_FUNC_CODE); + EGifPutExtensionBlock(fp, 11, "NETSCAPE2.0"); + EGifPutExtensionBlock(fp, 3, Buffer); + EGifPutExtensionTrailer(fp); +#endif } } @@ -923,7 +955,7 @@ gdip_save_gif_image (void *stream, GpIma } } - EGifCloseFile (fp); + EGifCloseFile (fp, NULL); return Ok;