diff options
Diffstat (limited to 'libraries/libgdiplus/libgdiplus-giflib.patch')
-rw-r--r-- | libraries/libgdiplus/libgdiplus-giflib.patch | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/libraries/libgdiplus/libgdiplus-giflib.patch b/libraries/libgdiplus/libgdiplus-giflib.patch new file mode 100644 index 0000000000..149820ddf6 --- /dev/null +++ b/libraries/libgdiplus/libgdiplus-giflib.patch @@ -0,0 +1,195 @@ +--- libgdiplus-3.12/src/gifcodec.c.orig 2015-01-05 11:27:06.000000000 +0100 ++++ libgdiplus-3.12/src/gifcodec.c 2015-01-25 17:25:58.991762538 +0100 +@@ -39,11 +39,6 @@ GUID gdip_gif_image_format_guid = {0xb96 + + #include "gifcodec.h" + +-#ifdef EgifOpen +-/* giflib declares this incorrectly as EgifOpen */ +-extern GifFileType *EGifOpen(void *userData, OutputFunc writeFunc); +-#endif +- + /* Data structure used for callback */ + typedef struct + { +@@ -107,7 +102,7 @@ gdip_gif_inputfunc (GifFileType *gif, Gi + */ + + static int +-AddExtensionBlockMono(SavedImage *New, int Len, BYTE ExtData[]) ++AddExtensionBlockMono(SavedImage *New, int Function, int Len, BYTE ExtData[]) + { + ExtensionBlock *ep; + +@@ -123,15 +118,15 @@ AddExtensionBlockMono(SavedImage *New, i + + ep = &New->ExtensionBlocks[New->ExtensionBlockCount++]; + ++ ep->Function = Function; + ep->ByteCount=Len; +- ep->Bytes = (char *)GdipAlloc(ep->ByteCount); ++ ep->Bytes = (GifByteType *)GdipAlloc(ep->ByteCount); + if (ep->Bytes == NULL) { + return (GIF_ERROR); + } + + if (ExtData) { + memcpy(ep->Bytes, ExtData, Len); +- ep->Function = New->Function; + } + + return (GIF_OK); +@@ -168,6 +163,7 @@ static int + DGifSlurpMono(GifFileType * GifFile, SavedImage *TrailingExtensions) + { + int ImageSize; ++ int Function; + GifRecordType RecordType; + SavedImage *sp; + GifByteType *ExtData; +@@ -234,20 +230,19 @@ DGifSlurpMono(GifFileType * GifFile, Sav + } + + case EXTENSION_RECORD_TYPE: { +- if (DGifGetExtension(GifFile, &temp_save.Function, &ExtData) == GIF_ERROR) { ++ if (DGifGetExtension(GifFile, &Function, &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, Function, ExtData[0], &ExtData[1]) == GIF_ERROR) { + return (GIF_ERROR); + } + + if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR) { + return (GIF_ERROR); + } +- temp_save.Function = 0; + } + break; + } +@@ -306,9 +301,9 @@ gdip_load_gif_image (void *stream, GpIma + loop_counter = FALSE; + + if (from_file) { +- gif = DGifOpen(stream, &gdip_gif_fileinputfunc); ++ gif = DGifOpen(stream, &gdip_gif_fileinputfunc, NULL); + } else { +- gif = DGifOpen (stream, &gdip_gif_inputfunc); ++ gif = DGifOpen (stream, &gdip_gif_inputfunc, NULL); + } + + if (gif == NULL) { +@@ -583,7 +578,11 @@ gdip_load_gif_image (void *stream, GpIma + } + + FreeExtensionMono(&global_extensions); ++#if (GIFLIB_MAJOR > 5) || ((GIFLIB_MAJOR == 5) && (GIFLIB_MINOR >= 1)) ++ DGifCloseFile (gif, NULL); ++#else + DGifCloseFile (gif); ++#endif + + *image = result; + return Ok; +@@ -599,7 +598,11 @@ error: + + if (gif != NULL) { + FreeExtensionMono (&global_extensions); ++#if (GIFLIB_MAJOR > 5) || ((GIFLIB_MAJOR == 5) && (GIFLIB_MINOR >= 1)) ++ DGifCloseFile (gif, NULL); ++#else + DGifCloseFile (gif); ++#endif + } + + *image = NULL; +@@ -663,9 +666,9 @@ gdip_save_gif_image (void *stream, GpIma + } + + if (from_file) { +- fp = EGifOpenFileName (stream, 0); ++ fp = EGifOpenFileName (stream, 0, NULL); + } else { +- fp = EGifOpen (stream, gdip_gif_outputfunc); ++ fp = EGifOpen (stream, gdip_gif_outputfunc, NULL); + } + + if (!fp) { +@@ -704,7 +707,7 @@ gdip_save_gif_image (void *stream, GpIma + goto error; + } + +- cmap = MakeMapObject(cmap_size, 0); ++ cmap = GifMakeMapObject(cmap_size, 0); + + pixbuf = GdipAlloc(pixbuf_size); + if (pixbuf == NULL) { +@@ -795,7 +798,7 @@ gdip_save_gif_image (void *stream, GpIma + pixbuf = pixbuf_org; + } else { + cmap_size = 256; +- cmap = MakeMapObject (cmap_size, 0); ++ cmap = GifMakeMapObject (cmap_size, 0); + + red = GdipAlloc(pixbuf_size); + green = GdipAlloc(pixbuf_size); +@@ -826,13 +829,13 @@ gdip_save_gif_image (void *stream, GpIma + v += 4; + } + } +- if (QuantizeBuffer(bitmap_data->width, bitmap_data->height, &cmap_size, ++ if (GifQuantizeBuffer(bitmap_data->width, bitmap_data->height, &cmap_size, + red, green, blue, pixbuf, cmap->Colors) == GIF_ERROR) { + goto error; + } + } + +- cmap->BitsPerPixel = BitSize (cmap_size); ++ cmap->BitsPerPixel = GifBitSize (cmap_size); + cmap->ColorCount = 1 << cmap->BitsPerPixel; + + if ((frame == 0) && (k == 0)) { +@@ -850,8 +853,10 @@ gdip_save_gif_image (void *stream, GpIma + Buffer[0] = 1; + Buffer[1] = ptr[0]; + Buffer[2] = ptr[1]; +- EGifPutExtensionFirst(fp, APPLICATION_EXT_FUNC_CODE, 11, "NETSCAPE2.0"); +- EGifPutExtensionLast(fp, APPLICATION_EXT_FUNC_CODE, 3, Buffer); ++ EGifPutExtensionLeader(fp, APPLICATION_EXT_FUNC_CODE); ++ EGifPutExtensionBlock(fp, 11, "NETSCAPE2.0"); ++ EGifPutExtensionBlock(fp, 3, Buffer); ++ EGifPutExtensionTrailer(fp); + } + } + +@@ -903,7 +908,7 @@ gdip_save_gif_image (void *stream, GpIma + pixbuf += bitmap_data->width; + } + +- FreeMapObject (cmap); ++ GifFreeMapObject (cmap); + if (red != NULL) { + GdipFree (red); + } +@@ -925,13 +930,17 @@ gdip_save_gif_image (void *stream, GpIma + } + } + ++#if (GIFLIB_MAJOR > 5) || ((GIFLIB_MAJOR == 5) && (GIFLIB_MINOR >= 1)) ++ EGifCloseFile (fp, NULL); ++#else + EGifCloseFile (fp); ++#endif + + return Ok; + + error: + if (cmap != NULL) { +- FreeMapObject (cmap); ++ GifFreeMapObject (cmap); + } + + if (red != NULL) { |