137 lines
3.5 KiB
Diff
137 lines
3.5 KiB
Diff
---
|
|
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
|
|
@@ -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;
|