428
|
1 /******************************************************************************
|
|
2 * In order to make life a little bit easier when using the GIF file format, *
|
|
3 * this library was written, and which does all the dirty work... *
|
|
4 * *
|
|
5 * Written by Gershon Elber, Jun. 1989 *
|
|
6 * Hacks by Eric S. Raymond, Sep. 1992 *
|
|
7 * and Jareth Hein, Jan. 1998 *
|
|
8 *******************************************************************************
|
|
9 * History: *
|
|
10 * 14 Jun 89 - Version 1.0 by Gershon Elber. *
|
|
11 * 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names). *
|
|
12 * 15 Sep 90 - Version 2.0 by Eric S. Raymond (Changes to suoport GIF slurp) *
|
|
13 * 26 Jun 96 - Version 3.0 by Eric S. Raymond (Full GIF89 support) *
|
|
14 * 19 Jan 98 - Version 3.1 by Jareth Hein (Support for user-defined I/O). *
|
|
15 ******************************************************************************/
|
|
16
|
440
|
17 #ifndef INCLUDED_gifrlib_h_
|
|
18 #define INCLUDED_gifrlib_h_
|
428
|
19
|
|
20 #define GIF_ERROR 0
|
|
21 #define GIF_OK 1
|
|
22
|
|
23 #ifndef TRUE
|
|
24 #define TRUE 1
|
|
25 #define FALSE 0
|
|
26 #endif
|
|
27
|
|
28 #ifndef NULL
|
|
29 #define NULL 0
|
|
30 #endif /* NULL */
|
|
31
|
|
32 #define GIF_FILE_BUFFER_SIZE 16384 /* Files uses bigger buffers than usual. */
|
|
33
|
|
34 typedef int GifBooleanType;
|
|
35 typedef unsigned char GifPixelType;
|
|
36 typedef unsigned char * GifRowType;
|
|
37 typedef unsigned char GifByteType;
|
|
38
|
|
39 #define VoidPtr void *
|
|
40
|
|
41 typedef struct GifColorType {
|
|
42 GifByteType Red, Green, Blue;
|
|
43 } GifColorType;
|
|
44
|
|
45 typedef struct ColorMapObject
|
|
46 {
|
|
47 int ColorCount;
|
|
48 int BitsPerPixel;
|
|
49 GifColorType *Colors; /* on malloc(3) heap */
|
|
50 }
|
|
51 ColorMapObject;
|
|
52
|
|
53 typedef struct GifImageDesc {
|
|
54 int Left, Top, Width, Height, /* Current image dimensions. */
|
|
55 Interlace; /* Sequential/Interlaced lines. */
|
|
56 ColorMapObject *ColorMap; /* The local color map */
|
|
57 } GifImageDesc;
|
|
58
|
|
59 /* I/O operations. If you roll your own, they need to be semantically equivilent to
|
|
60 fread/fwrite, with an additional paramater to hold data local to your method. */
|
665
|
61 typedef Bytecount (*Gif_rw_func)(GifByteType *buffer, Bytecount size, VoidPtr method_data);
|
428
|
62 /* Finish up stream. Non-zero return indicates failure */
|
|
63 typedef int (*Gif_close_func)(VoidPtr close_data);
|
|
64 /* Error handling function */
|
|
65 typedef void (*Gif_error_func)(const char *string, VoidPtr error_data);
|
|
66
|
|
67 typedef struct GifFileType {
|
|
68 int SWidth, SHeight, /* Screen dimensions. */
|
|
69 SColorResolution, /* How many colors can we generate? */
|
|
70 SBackGroundColor; /* I hope you understand this one... */
|
|
71 ColorMapObject *SColorMap; /* NULL if it doesn't exist. */
|
|
72 int ImageCount; /* Number of current image */
|
|
73 GifImageDesc Image; /* Block describing current image */
|
|
74 struct SavedImage *SavedImages; /* Use this to accumulate file state */
|
|
75 VoidPtr Private; /* Don't mess with this! */
|
|
76 VoidPtr GifIO; /* Contains all information for I/O */
|
|
77 } GifFileType;
|
|
78
|
|
79 typedef enum {
|
|
80 UNDEFINED_RECORD_TYPE,
|
|
81 SCREEN_DESC_RECORD_TYPE,
|
|
82 IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */
|
|
83 EXTENSION_RECORD_TYPE, /* Begin with '!' */
|
|
84 TERMINATE_RECORD_TYPE /* Begin with ';' */
|
|
85 } GifRecordType;
|
|
86
|
|
87 /******************************************************************************
|
|
88 * GIF89 extension function codes *
|
|
89 ******************************************************************************/
|
|
90
|
|
91 #define COMMENT_EXT_FUNC_CODE 0xfe /* comment */
|
|
92 #define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control */
|
|
93 #define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */
|
|
94 #define APPLICATION_EXT_FUNC_CODE 0xff /* application block */
|
|
95
|
|
96 /******************************************************************************
|
|
97 * IO related routines. Defined in gif_io.c *
|
|
98 ******************************************************************************/
|
|
99 GifFileType *GifSetup(void);
|
|
100 void GifFree(GifFileType *GifFile);
|
|
101 void GifSetReadFunc (GifFileType *GifFile, Gif_rw_func func, VoidPtr data);
|
|
102 void GifSetWriteFunc(GifFileType *GifFile, Gif_rw_func func, VoidPtr data);
|
|
103 void GifSetCloseFunc(GifFileType *GifFile, Gif_close_func func, VoidPtr data);
|
|
104
|
|
105 /******************************************************************************
|
|
106 * O.K., here are the routines one can access in order to decode GIF file: *
|
|
107 ******************************************************************************/
|
|
108
|
|
109 void DGifOpenFileName(GifFileType *GifFile, const char *GifFileName);
|
|
110 void DGifOpenFileHandle(GifFileType *GifFile, int GifFileHandle);
|
|
111 void DGifInitRead(GifFileType *GifFile);
|
|
112 void DGifSlurp(GifFileType *GifFile);
|
|
113 void DGifGetScreenDesc(GifFileType *GifFile);
|
|
114 void DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType);
|
|
115 void DGifGetImageDesc(GifFileType *GifFile);
|
|
116 void DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen);
|
|
117 void DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel);
|
|
118 void DGifGetComment(GifFileType *GifFile, char *GifComment);
|
|
119 void DGifGetExtension(GifFileType *GifFile, int *GifExtCode,
|
|
120 GifByteType **GifExtension);
|
|
121 void DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension);
|
|
122 void DGifGetCode(GifFileType *GifFile, int *GifCodeSize,
|
|
123 GifByteType **GifCodeBlock);
|
|
124 void DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock);
|
|
125 void DGifGetLZCodes(GifFileType *GifFile, int *GifCode);
|
|
126 int DGifCloseFile(GifFileType *GifFile);
|
|
127
|
|
128 #define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */
|
|
129 #define D_GIF_ERR_READ_FAILED 102
|
|
130 #define D_GIF_ERR_NOT_GIF_FILE 103
|
|
131 #define D_GIF_ERR_NO_SCRN_DSCR 104
|
|
132 #define D_GIF_ERR_NO_IMAG_DSCR 105
|
|
133 #define D_GIF_ERR_NO_COLOR_MAP 106
|
|
134 #define D_GIF_ERR_WRONG_RECORD 107
|
|
135 #define D_GIF_ERR_DATA_TOO_BIG 108
|
|
136 #define GIF_ERR_NOT_ENOUGH_MEM 109
|
|
137 #define D_GIF_ERR_NOT_ENOUGH_MEM 109
|
|
138 #define D_GIF_ERR_CLOSE_FAILED 110
|
|
139 #define D_GIF_ERR_NOT_READABLE 111
|
|
140 #define D_GIF_ERR_IMAGE_DEFECT 112
|
|
141 #define D_GIF_ERR_EOF_TOO_SOON 113
|
|
142
|
|
143 /******************************************************************************
|
|
144 * O.K., here are the error routines *
|
|
145 ******************************************************************************/
|
|
146 extern void GifSetErrorFunc(GifFileType *GifFile, Gif_error_func func, VoidPtr data);
|
|
147 extern void GifSetWarningFunc(GifFileType *GifFile, Gif_error_func func, VoidPtr data);
|
2274
|
148 DECLARE_DOESNT_RETURN (GifInternError(GifFileType *GifFile, int errnum));
|
428
|
149 extern void GifInternWarning(GifFileType *GifFile, int errnum);
|
2274
|
150 DECLARE_DOESNT_RETURN (GifError(GifFileType *GifFile, const char *err_str));
|
428
|
151 extern void GifWarning(GifFileType *GifFile, const char *err_str);
|
|
152
|
|
153 /*****************************************************************************
|
|
154 *
|
|
155 * Everything below this point is new after version 1.2, supporting `slurp
|
|
156 * mode' for doing I/O in two big belts with all the image-bashing in core.
|
|
157 *
|
|
158 *****************************************************************************/
|
|
159
|
|
160 /******************************************************************************
|
|
161 * Support for the in-core structures allocation (slurp mode). *
|
|
162 ******************************************************************************/
|
|
163
|
|
164 /* This is the in-core version of an extension record */
|
|
165 typedef struct {
|
|
166 int ByteCount;
|
|
167 GifByteType *Bytes; /* on malloc(3) heap */
|
|
168 } ExtensionBlock;
|
|
169
|
|
170 /* This holds an image header, its unpacked raster bits, and extensions */
|
|
171 typedef struct SavedImage {
|
|
172 GifImageDesc ImageDesc;
|
|
173
|
|
174 GifPixelType *RasterBits; /* on malloc(3) heap */
|
|
175
|
|
176 int Function;
|
|
177 int ExtensionBlockCount;
|
|
178 ExtensionBlock *ExtensionBlocks; /* on malloc(3) heap */
|
|
179 } SavedImage;
|
|
180
|
|
181 extern void ApplyTranslation(SavedImage *Image, GifPixelType Translation[]);
|
|
182
|
|
183 extern void MakeExtension(SavedImage *New, int Function);
|
|
184 extern int AddExtensionBlock(SavedImage *New, int Length, GifByteType *data);
|
|
185 extern void FreeExtension(SavedImage *Image);
|
|
186
|
|
187 extern SavedImage *MakeSavedImage(GifFileType *GifFile, SavedImage *CopyFrom);
|
|
188 extern void FreeSavedImages(GifFileType *GifFile);
|
|
189
|
|
190 /* Common defines used by encode/decode functions */
|
|
191
|
|
192 #define COMMENT_EXT_FUNC_CODE 0xfe /* Extension function code for comment. */
|
|
193 #define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */
|
|
194 #define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1
|
|
195 #define GIF_VERSION_POS 3 /* Version first character in stamp. */
|
|
196 #define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */
|
|
197 #define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */
|
|
198
|
|
199 #define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */
|
|
200 #define LZ_BITS 12
|
|
201
|
|
202 #define FILE_STATE_READ 0x01
|
|
203 #define FILE_STATE_WRITE 0x01
|
|
204 #define FILE_STATE_SCREEN 0x02
|
|
205 #define FILE_STATE_IMAGE 0x04
|
|
206
|
|
207 #define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */
|
|
208 #define FIRST_CODE 4097 /* Impossible code, to signal first. */
|
|
209 #define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */
|
|
210
|
|
211 #define IS_READABLE(Private) (!(Private->FileState & FILE_STATE_READ))
|
|
212 #define IS_WRITEABLE(Private) (Private->FileState & FILE_STATE_WRITE)
|
|
213
|
|
214 typedef struct GifFilePrivateType {
|
|
215 int FileState,
|
|
216 BitsPerPixel, /* Bits per pixel (Codes uses at list this + 1). */
|
|
217 ClearCode, /* The CLEAR LZ code. */
|
|
218 EOFCode, /* The EOF LZ code. */
|
|
219 RunningCode, /* The next code algorithm can generate. */
|
|
220 RunningBits,/* The number of bits required to represent RunningCode. */
|
|
221 MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */
|
|
222 LastCode, /* The code before the current code. */
|
|
223 CrntCode, /* Current algorithm code. */
|
|
224 StackPtr, /* For character stack (see below). */
|
|
225 CrntShiftState; /* Number of bits in CrntShiftDWord. */
|
|
226 unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */
|
|
227 unsigned long PixelCount; /* Number of pixels in image. */
|
|
228 GifByteType Buf[256]; /* Compressed input is buffered here. */
|
|
229 GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */
|
|
230 GifByteType Suffix[LZ_MAX_CODE+1]; /* So we can trace the codes. */
|
|
231 unsigned int Prefix[LZ_MAX_CODE+1];
|
|
232 } GifFilePrivateType;
|
|
233
|
|
234 typedef struct GifIODataType {
|
|
235 Gif_rw_func ReadFunc, WriteFunc; /* Pointers to the functions that will do the I/O */
|
|
236 Gif_close_func CloseFunc;
|
|
237 VoidPtr ReadFunc_data; /* data to be passed to the read function */
|
|
238 VoidPtr WriteFunc_data; /* data to be passed to the write function */
|
|
239 VoidPtr CloseFunc_data; /* data to be passed to the close function */
|
|
240 Gif_error_func ErrorFunc; /* MUST NOT RETURN (use lng_jmp or exit)! */
|
|
241 Gif_error_func WarningFunc; /* For warning messages (can be ignored) */
|
|
242 VoidPtr ErrorFunc_data;
|
|
243 VoidPtr WarningFunc_data;
|
|
244 } GifIODataType;
|
|
245
|
|
246 typedef struct GifStdIODataType {
|
|
247 FILE *File;
|
|
248 int FileHandle;
|
|
249 } GifStdIODataType;
|
|
250
|
|
251 /* Install StdIO funcs on FILE into GifFile */
|
|
252 void GifStdIOInit(GifFileType *GifFile, FILE *file, int filehandle);
|
|
253
|
|
254 /* Error checking reads, writes and closes */
|
665
|
255 void GifRead(GifByteType *buf, Bytecount size, GifFileType *GifFile);
|
|
256 void GifWrite(GifByteType *buf, Bytecount size, GifFileType *GifFile);
|
428
|
257 int GifClose(GifFileType *GifFile);
|
|
258
|
|
259 /* The default Read and Write functions for files */
|
665
|
260 Bytecount GifStdRead(GifByteType *buf, Bytecount size, VoidPtr method_data);
|
|
261 Bytecount GifStdWrite(GifByteType *buf, Bytecount size, VoidPtr method_data);
|
428
|
262 int GifStdFileClose(VoidPtr method_data);
|
|
263
|
|
264 ColorMapObject *MakeMapObject(int ColorCount, GifColorType *ColorMap);
|
|
265 void FreeMapObject(ColorMapObject *Object);
|
|
266
|
440
|
267 #endif /* INCLUDED_gifrlib_h_ */
|