diff src/gifrlib.h @ 373:6240c7796c7a r21-2b2

Import from CVS: tag r21-2b2
author cvs
date Mon, 13 Aug 2007 11:04:06 +0200
parents 33bdb3d4b97f
children 19dcec799385
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gifrlib.h	Mon Aug 13 11:04:06 2007 +0200
@@ -0,0 +1,272 @@
+/******************************************************************************
+* In order to make life a little bit easier when using the GIF file format,   *
+* this library was written, and which does all the dirty work...	      *
+*									      *
+*					Written by Gershon Elber,  Jun. 1989  *
+*					Hacks by Eric S. Raymond,  Sep. 1992  *
+*                                             and Jareth Hein,     Jan. 1998  *
+*******************************************************************************
+* History:								      *
+* 14 Jun 89 - Version 1.0 by Gershon Elber.				      *
+*  3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names). *
+* 15 Sep 90 - Version 2.0 by Eric S. Raymond (Changes to suoport GIF slurp)   *
+* 26 Jun 96 - Version 3.0 by Eric S. Raymond (Full GIF89 support)             *
+* 19 Jan 98 - Version 3.1 by Jareth Hein (Support for user-defined I/O).      *
+******************************************************************************/
+
+#ifndef GIF_LIB_H
+#define GIF_LIB_H
+
+#define	GIF_ERROR	0
+#define GIF_OK		1
+
+#ifndef TRUE
+#define TRUE		1
+#define FALSE		0
+#endif
+
+#ifndef NULL
+#define NULL		0
+#endif /* NULL */
+
+#define GIF_FILE_BUFFER_SIZE 16384  /* Files uses bigger buffers than usual. */
+
+typedef	int		GifBooleanType;
+typedef	unsigned char	GifPixelType;
+typedef unsigned char *	GifRowType;
+typedef unsigned char	GifByteType;
+
+#ifdef SYSV
+#define VoidPtr char *
+#else
+#define VoidPtr void *
+#endif /* SYSV */
+
+typedef struct GifColorType {
+    GifByteType Red, Green, Blue;
+} GifColorType;
+
+typedef struct ColorMapObject
+{
+    int	ColorCount;
+    int BitsPerPixel;
+    GifColorType *Colors;		/* on malloc(3) heap */
+}
+ColorMapObject;
+
+typedef struct GifImageDesc {
+    int Left, Top, Width, Height,	/* Current image dimensions. */
+	Interlace;			/* Sequential/Interlaced lines. */
+    ColorMapObject *ColorMap;		/* The local color map */
+} GifImageDesc;
+
+/* I/O operations.  If you roll your own, they need to be semantically equivilent to
+   fread/fwrite, with an additional paramater to hold data local to your method. */
+typedef size_t (*Gif_rw_func)(GifByteType *buffer, size_t size, VoidPtr method_data);
+/* Finish up stream. Non-zero return indicates failure */
+typedef int (*Gif_close_func)(VoidPtr close_data);
+/* Error handling function */
+typedef void (*Gif_error_func)(const char *string, VoidPtr error_data);
+
+typedef struct GifFileType {
+    int SWidth, SHeight,		/* Screen dimensions. */
+	SColorResolution, 		/* How many colors can we generate? */
+	SBackGroundColor;		/* I hope you understand this one... */
+    ColorMapObject *SColorMap;		/* NULL if it doesn't exist. */
+    int ImageCount;			/* Number of current image */
+    GifImageDesc Image;			/* Block describing current image */
+    struct SavedImage *SavedImages;	/* Use this to accumulate file state */
+    VoidPtr Private;	  		/* Don't mess with this! */
+    VoidPtr GifIO;			/* Contains all information for I/O */
+} GifFileType;
+
+typedef enum {
+    UNDEFINED_RECORD_TYPE,
+    SCREEN_DESC_RECORD_TYPE,
+    IMAGE_DESC_RECORD_TYPE,		/* Begin with ',' */
+    EXTENSION_RECORD_TYPE,		/* Begin with '!' */
+    TERMINATE_RECORD_TYPE		/* Begin with ';' */
+} GifRecordType;
+
+/******************************************************************************
+*  GIF89 extension function codes                                             *
+******************************************************************************/
+
+#define COMMENT_EXT_FUNC_CODE		0xfe	/* comment */
+#define GRAPHICS_EXT_FUNC_CODE		0xf9	/* graphics control */
+#define PLAINTEXT_EXT_FUNC_CODE		0x01	/* plaintext */
+#define APPLICATION_EXT_FUNC_CODE	0xff	/* application block */
+
+/******************************************************************************
+* IO related routines.  Defined in gif_io.c                                   *
+******************************************************************************/
+GifFileType *GifSetup(void);
+void GifFree(GifFileType *GifFile);
+void GifSetReadFunc (GifFileType *GifFile, Gif_rw_func func, VoidPtr data);
+void GifSetWriteFunc(GifFileType *GifFile, Gif_rw_func func, VoidPtr data);
+void GifSetCloseFunc(GifFileType *GifFile, Gif_close_func func, VoidPtr data);
+
+/******************************************************************************
+* O.K., here are the routines one can access in order to decode GIF file:     *
+******************************************************************************/
+
+void DGifOpenFileName(GifFileType *GifFile, const char *GifFileName);
+void DGifOpenFileHandle(GifFileType *GifFile, int GifFileHandle);
+void DGifInitRead(GifFileType *GifFile);
+void DGifSlurp(GifFileType *GifFile);
+void DGifGetScreenDesc(GifFileType *GifFile);
+void DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType);
+void DGifGetImageDesc(GifFileType *GifFile);
+void DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen);
+void DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel);
+void DGifGetComment(GifFileType *GifFile, char *GifComment);
+void DGifGetExtension(GifFileType *GifFile, int *GifExtCode,
+						GifByteType **GifExtension);
+void DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension);
+void DGifGetCode(GifFileType *GifFile, int *GifCodeSize,
+						GifByteType **GifCodeBlock);
+void DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock);
+void DGifGetLZCodes(GifFileType *GifFile, int *GifCode);
+int DGifCloseFile(GifFileType *GifFile);
+
+#define	D_GIF_ERR_OPEN_FAILED	101		/* And DGif possible errors. */
+#define	D_GIF_ERR_READ_FAILED	102
+#define	D_GIF_ERR_NOT_GIF_FILE	103
+#define D_GIF_ERR_NO_SCRN_DSCR	104
+#define D_GIF_ERR_NO_IMAG_DSCR	105
+#define D_GIF_ERR_NO_COLOR_MAP	106
+#define D_GIF_ERR_WRONG_RECORD	107
+#define D_GIF_ERR_DATA_TOO_BIG	108
+#define GIF_ERR_NOT_ENOUGH_MEM 109
+#define D_GIF_ERR_NOT_ENOUGH_MEM 109
+#define D_GIF_ERR_CLOSE_FAILED	110
+#define D_GIF_ERR_NOT_READABLE	111
+#define D_GIF_ERR_IMAGE_DEFECT	112
+#define D_GIF_ERR_EOF_TOO_SOON	113
+
+/******************************************************************************
+* O.K., here are the error routines 					      *
+******************************************************************************/
+extern void GifSetErrorFunc(GifFileType *GifFile, Gif_error_func func, VoidPtr data);
+extern void GifSetWarningFunc(GifFileType *GifFile, Gif_error_func func, VoidPtr data);
+extern void GifInternError(GifFileType *GifFile, int errnum);
+extern void GifInternWarning(GifFileType *GifFile, int errnum);
+extern void GifError(GifFileType *GifFile, const char *err_str);
+extern void GifWarning(GifFileType *GifFile, const char *err_str);
+
+/*****************************************************************************
+ *
+ * Everything below this point is new after version 1.2, supporting `slurp
+ * mode' for doing I/O in two big belts with all the image-bashing in core.
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+* Support for the in-core structures allocation (slurp mode).		      *
+******************************************************************************/
+
+/* This is the in-core version of an extension record */
+typedef struct {
+    int		ByteCount;
+    char	*Bytes;		/* on malloc(3) heap */
+} ExtensionBlock;
+
+/* This holds an image header, its unpacked raster bits, and extensions */
+typedef struct SavedImage {
+    GifImageDesc	ImageDesc;
+
+    char		*RasterBits;		/* on malloc(3) heap */
+
+    int			Function;
+    int			ExtensionBlockCount;
+    ExtensionBlock	*ExtensionBlocks;	/* on malloc(3) heap */
+} SavedImage;
+
+extern void ApplyTranslation(SavedImage *Image, GifPixelType Translation[]);
+
+extern void MakeExtension(SavedImage *New, int Function);
+extern int AddExtensionBlock(SavedImage *New, int Length, GifByteType *data);
+extern void FreeExtension(SavedImage *Image);
+
+extern SavedImage *MakeSavedImage(GifFileType *GifFile, SavedImage *CopyFrom);
+extern void FreeSavedImages(GifFileType *GifFile);
+
+/*   Common defines used by encode/decode functions */
+
+#define COMMENT_EXT_FUNC_CODE	0xfe /* Extension function code for comment. */
+#define GIF_STAMP	"GIFVER"	 /* First chars in file - GIF stamp. */
+#define GIF_STAMP_LEN	sizeof(GIF_STAMP) - 1
+#define GIF_VERSION_POS	3		/* Version first character in stamp. */
+#define GIF87_STAMP	"GIF87a"         /* First chars in file - GIF stamp. */
+#define GIF89_STAMP	"GIF89a"         /* First chars in file - GIF stamp. */
+
+#define LZ_MAX_CODE	4095		/* Biggest code possible in 12 bits. */
+#define LZ_BITS		12
+
+#define FILE_STATE_READ		0x01
+#define FILE_STATE_WRITE	0x01
+#define FILE_STATE_SCREEN	0x02
+#define FILE_STATE_IMAGE	0x04
+
+#define FLUSH_OUTPUT		4096    /* Impossible code, to signal flush. */
+#define FIRST_CODE		4097    /* Impossible code, to signal first. */
+#define NO_SUCH_CODE		4098    /* Impossible code, to signal empty. */
+
+#define IS_READABLE(Private)	(!(Private->FileState & FILE_STATE_READ))
+#define IS_WRITEABLE(Private)	(Private->FileState & FILE_STATE_WRITE)
+
+typedef struct GifFilePrivateType {
+    int FileState,
+	BitsPerPixel,	    /* Bits per pixel (Codes uses at list this + 1). */
+	ClearCode,				       /* The CLEAR LZ code. */
+	EOFCode,				         /* The EOF LZ code. */
+	RunningCode,		    /* The next code algorithm can generate. */
+	RunningBits,/* The number of bits required to represent RunningCode. */
+	MaxCode1,  /* 1 bigger than max. possible code, in RunningBits bits. */
+	LastCode,		        /* The code before the current code. */
+	CrntCode,				  /* Current algorithm code. */
+	StackPtr,		         /* For character stack (see below). */
+	CrntShiftState;		        /* Number of bits in CrntShiftDWord. */
+    unsigned long CrntShiftDWord;     /* For bytes decomposition into codes. */
+    unsigned long PixelCount;		       /* Number of pixels in image. */
+    GifByteType Buf[256];	       /* Compressed input is buffered here. */
+    GifByteType Stack[LZ_MAX_CODE];	 /* Decoded pixels are stacked here. */
+    GifByteType Suffix[LZ_MAX_CODE+1];	       /* So we can trace the codes. */
+    unsigned int Prefix[LZ_MAX_CODE+1];
+} GifFilePrivateType;
+
+typedef struct GifIODataType {
+    Gif_rw_func ReadFunc, WriteFunc;	/* Pointers to the functions that will do the I/O */
+    Gif_close_func CloseFunc;    
+    VoidPtr ReadFunc_data;		/* data to be passed to the read function */
+    VoidPtr WriteFunc_data;		/* data to be passed to the write function */
+    VoidPtr CloseFunc_data;		/* data to be passed to the close function */
+    Gif_error_func ErrorFunc;	/* MUST NOT RETURN (use lng_jmp or exit)!  */
+    Gif_error_func WarningFunc;	/* For warning messages (can be ignored) */
+    VoidPtr ErrorFunc_data;
+    VoidPtr WarningFunc_data;
+} GifIODataType;
+
+typedef struct GifStdIODataType {
+  FILE *File;
+  int FileHandle;
+} GifStdIODataType;
+
+/* Install StdIO funcs on FILE into GifFile */
+void GifStdIOInit(GifFileType *GifFile, FILE *file, int filehandle);
+
+/* Error checking reads, writes and closes */
+void GifRead(GifByteType *buf, size_t size, GifFileType *GifFile);
+void GifWrite(GifByteType *buf, size_t size, GifFileType *GifFile);
+int GifClose(GifFileType *GifFile);
+
+/* The default Read and Write functions for files */
+size_t GifStdRead(GifByteType *buf, size_t size, VoidPtr method_data);
+size_t GifStdWrite(GifByteType *buf, size_t size, VoidPtr method_data);
+int GifStdFileClose(VoidPtr method_data);
+
+ColorMapObject *MakeMapObject(int ColorCount, GifColorType *ColorMap);
+void FreeMapObject(ColorMapObject *Object);
+
+
+#endif /* GIF_LIB_H */