---
 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;