177 lines
4.5 KiB
C
177 lines
4.5 KiB
C
$NetBSD: patch-src_gifcodec.c,v 1.2 2013/09/19 11:53:56 obache Exp $
|
|
|
|
* fixes build with giflib>=5
|
|
|
|
--- src/gifcodec.c.orig 2011-01-13 22:28:19.000000000 +0000
|
|
+++ src/gifcodec.c
|
|
@@ -39,8 +39,12 @@ GUID gdip_gif_image_format_guid = {0xb96
|
|
|
|
#include "gifcodec.h"
|
|
|
|
-/* giflib declares this incorrectly as EgifOpen */
|
|
+/* giflib declares this incorrectly as EgifOpen up to 4.1.2
|
|
+ GIF_LIB_VERSION is defined up to 4.1.6, and prototype is changed in 5.0,
|
|
+ so it is safe to use it as check condition */
|
|
+#ifdef GIF_LIB_VERSION
|
|
extern GifFileType *EGifOpen(void *userData, OutputFunc writeFunc);
|
|
+#endif
|
|
|
|
/* Data structure used for callback */
|
|
typedef struct
|
|
@@ -129,7 +133,11 @@ AddExtensionBlockMono(SavedImage *New, i
|
|
|
|
if (ExtData) {
|
|
memcpy(ep->Bytes, ExtData, Len);
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ ep->Function = New->ExtensionBlocks[New->ExtensionBlockCount++].Function;
|
|
+#else
|
|
ep->Function = New->Function;
|
|
+#endif
|
|
}
|
|
|
|
return (GIF_OK);
|
|
@@ -232,7 +240,11 @@ DGifSlurpMono(GifFileType * GifFile, Sav
|
|
}
|
|
|
|
case EXTENSION_RECORD_TYPE: {
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ if (DGifGetExtension(GifFile, &temp_save.ExtensionBlocks[temp_save.ExtensionBlockCount].Function, &ExtData) == GIF_ERROR) {
|
|
+#else
|
|
if (DGifGetExtension(GifFile, &temp_save.Function, &ExtData) == GIF_ERROR) {
|
|
+#endif
|
|
return (GIF_ERROR);
|
|
}
|
|
|
|
@@ -245,7 +257,9 @@ DGifSlurpMono(GifFileType * GifFile, Sav
|
|
if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR) {
|
|
return (GIF_ERROR);
|
|
}
|
|
+#if GIFLIB_MAJOR < 5
|
|
temp_save.Function = 0;
|
|
+#endif
|
|
}
|
|
break;
|
|
}
|
|
@@ -304,9 +318,17 @@ gdip_load_gif_image (void *stream, GpIma
|
|
loop_counter = FALSE;
|
|
|
|
if (from_file) {
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ gif = DGifOpen(stream, &gdip_gif_fileinputfunc, NULL);
|
|
+#else
|
|
gif = DGifOpen(stream, &gdip_gif_fileinputfunc);
|
|
+#endif
|
|
} else {
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ gif = DGifOpen (stream, &gdip_gif_inputfunc, NULL);
|
|
+#else
|
|
gif = DGifOpen (stream, &gdip_gif_inputfunc);
|
|
+#endif
|
|
}
|
|
|
|
if (gif == NULL) {
|
|
@@ -662,9 +684,17 @@ gdip_save_gif_image (void *stream, GpIma
|
|
}
|
|
|
|
if (from_file) {
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ fp = EGifOpenFileName (stream, 0, NULL);
|
|
+#else
|
|
fp = EGifOpenFileName (stream, 0);
|
|
+#endif
|
|
} else {
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ fp = EGifOpen (stream, gdip_gif_outputfunc, NULL);
|
|
+#else
|
|
fp = EGifOpen (stream, gdip_gif_outputfunc);
|
|
+#endif
|
|
}
|
|
|
|
if (!fp) {
|
|
@@ -703,7 +733,11 @@ gdip_save_gif_image (void *stream, GpIma
|
|
goto error;
|
|
}
|
|
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ cmap = GifMakeMapObject(cmap_size, 0);
|
|
+#else
|
|
cmap = MakeMapObject(cmap_size, 0);
|
|
+#endif
|
|
|
|
pixbuf = GdipAlloc(pixbuf_size);
|
|
if (pixbuf == NULL) {
|
|
@@ -794,7 +828,11 @@ gdip_save_gif_image (void *stream, GpIma
|
|
pixbuf = pixbuf_org;
|
|
} else {
|
|
cmap_size = 256;
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ cmap = GifMakeMapObject (cmap_size, 0);
|
|
+#else
|
|
cmap = MakeMapObject (cmap_size, 0);
|
|
+#endif
|
|
|
|
red = GdipAlloc(pixbuf_size);
|
|
green = GdipAlloc(pixbuf_size);
|
|
@@ -825,13 +863,21 @@ gdip_save_gif_image (void *stream, GpIma
|
|
v += 4;
|
|
}
|
|
}
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ if (GifQuantizeBuffer(bitmap_data->width, bitmap_data->height, &cmap_size,
|
|
+#else
|
|
if (QuantizeBuffer(bitmap_data->width, bitmap_data->height, &cmap_size,
|
|
+#endif
|
|
red, green, blue, pixbuf, cmap->Colors) == GIF_ERROR) {
|
|
goto error;
|
|
}
|
|
}
|
|
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ cmap->BitsPerPixel = GifBitSize (cmap_size);
|
|
+#else
|
|
cmap->BitsPerPixel = BitSize (cmap_size);
|
|
+#endif
|
|
cmap->ColorCount = 1 << cmap->BitsPerPixel;
|
|
|
|
if ((frame == 0) && (k == 0)) {
|
|
@@ -849,8 +895,15 @@ gdip_save_gif_image (void *stream, GpIma
|
|
Buffer[0] = 1;
|
|
Buffer[1] = ptr[0];
|
|
Buffer[2] = ptr[1];
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ EGifPutExtensionLeader(fp, APPLICATION_EXT_FUNC_CODE);
|
|
+ EGifPutExtensionBlock(fp, 11, "NETSCAPE2.0");
|
|
+ EGifPutExtensionBlock(fp, 3, Buffer);
|
|
+ EGifPutExtensionTrailer(fp);
|
|
+#else
|
|
EGifPutExtensionFirst(fp, APPLICATION_EXT_FUNC_CODE, 11, "NETSCAPE2.0");
|
|
EGifPutExtensionLast(fp, APPLICATION_EXT_FUNC_CODE, 3, Buffer);
|
|
+#endif
|
|
}
|
|
}
|
|
|
|
@@ -902,7 +955,11 @@ gdip_save_gif_image (void *stream, GpIma
|
|
pixbuf += bitmap_data->width;
|
|
}
|
|
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ GifFreeMapObject (cmap);
|
|
+#else
|
|
FreeMapObject (cmap);
|
|
+#endif
|
|
if (red != NULL) {
|
|
GdipFree (red);
|
|
}
|
|
@@ -930,7 +987,11 @@ gdip_save_gif_image (void *stream, GpIma
|
|
|
|
error:
|
|
if (cmap != NULL) {
|
|
+#if GIFLIB_MAJOR >= 5
|
|
+ GifFreeMapObject (cmap);
|
|
+#else
|
|
FreeMapObject (cmap);
|
|
+#endif
|
|
}
|
|
|
|
if (red != NULL) {
|