blob: 54acd91b4057d18b43ec8eb7c12977cabf8b59f5 [file] [log] [blame]
scottmg@google.com26930032012-07-18 20:32:181/******************************************************************************
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 ******************************************************************************
8 * History:
9 * 14 Jun 89 - Version 1.0 by Gershon Elber.
10 * 3 Sep 90 - Version 1.1 by Gershon Elber (Support for Gif89, Unique names)
11 * 15 Sep 90 - Version 2.0 by Eric S. Raymond (Changes to suoport GIF slurp)
12 * 26 Jun 96 - Version 3.0 by Eric S. Raymond (Full GIF89 support)
13 * 17 Dec 98 - Version 4.0 by Toshio Kuratomi (Fix extension writing code)
14 *****************************************************************************/
15
16#ifndef _GIF_LIB_H_
17#define _GIF_LIB_H_ 1
18
19#ifdef __cplusplus
20extern "C" {
21#endif /* __cplusplus */
22
23#define GIF_LIB_VERSION " Version 4.1, "
24
25#define GIF_ERROR 0
26#define GIF_OK 1
27
28#ifndef TRUE
29#define TRUE 1
30#endif /* TRUE */
31#ifndef FALSE
32#define FALSE 0
33#endif /* FALSE */
34
35#ifndef NULL
36#define NULL 0
37#endif /* NULL */
38
39#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */
40#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1
41#define GIF_VERSION_POS 3 /* Version first character in stamp. */
42#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */
43#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */
44
45#define GIF_FILE_BUFFER_SIZE 16384 /* Files uses bigger buffers than usual. */
46
47typedef int GifBooleanType;
48typedef unsigned char GifPixelType;
49typedef unsigned char *GifRowType;
50typedef unsigned char GifByteType;
51#ifdef _GBA_OPTMEM
52 typedef unsigned short GifPrefixType;
53 typedef short GifWord;
54#else
55 typedef unsigned int GifPrefixType;
56 typedef int GifWord;
57#endif
58
59#define GIF_MESSAGE(Msg) fprintf(stderr, "\n%s: %s\n", PROGRAM_NAME, Msg)
60#define GIF_EXIT(Msg) { GIF_MESSAGE(Msg); exit(-3); }
61
62#ifdef SYSV
63#define VoidPtr char *
64#else
65#define VoidPtr void *
66#endif /* SYSV */
67
68typedef struct GifColorType {
69 GifByteType Red, Green, Blue;
70} GifColorType;
71
72typedef struct ColorMapObject {
73 int ColorCount;
74 int BitsPerPixel;
75 GifColorType *Colors; /* on malloc(3) heap */
76} ColorMapObject;
77
78typedef struct GifImageDesc {
79 GifWord Left, Top, Width, Height, /* Current image dimensions. */
80 Interlace; /* Sequential/Interlaced lines. */
81 ColorMapObject *ColorMap; /* The local color map */
82} GifImageDesc;
83
84typedef struct GifFileType {
85 GifWord SWidth, SHeight, /* Screen dimensions. */
86 SColorResolution, /* How many colors can we generate? */
87 SBackGroundColor; /* I hope you understand this one... */
88 ColorMapObject *SColorMap; /* NULL if not exists. */
89 int ImageCount; /* Number of current image */
90 GifImageDesc Image; /* Block describing current image */
91 struct SavedImage *SavedImages; /* Use this to accumulate file state */
92 VoidPtr UserData; /* hook to attach user data (TVT) */
93 VoidPtr Private; /* Don't mess with this! */
94} GifFileType;
95
96typedef enum {
97 UNDEFINED_RECORD_TYPE,
98 SCREEN_DESC_RECORD_TYPE,
99 IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */
100 EXTENSION_RECORD_TYPE, /* Begin with '!' */
101 TERMINATE_RECORD_TYPE /* Begin with ';' */
102} GifRecordType;
103
104/* DumpScreen2Gif routine constants identify type of window/screen to dump.
105 * Note all values below 1000 are reserved for the IBMPC different display
106 * devices (it has many!) and are compatible with the numbering TC2.0
107 * (Turbo C 2.0 compiler for IBM PC) gives to these devices.
108 */
109typedef enum {
110 GIF_DUMP_SGI_WINDOW = 1000,
111 GIF_DUMP_X_WINDOW = 1001
112} GifScreenDumpType;
113
114/* func type to read gif data from arbitrary sources (TVT) */
115typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
116
117/* func type to write gif data ro arbitrary targets.
118 * Returns count of bytes written. (MRB)
119 */
120typedef int (*OutputFunc) (GifFileType *, const GifByteType *, int);
121
122/******************************************************************************
123 * GIF89 extension function codes
124******************************************************************************/
125
126#define COMMENT_EXT_FUNC_CODE 0xfe /* comment */
127#define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control */
128#define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */
129#define APPLICATION_EXT_FUNC_CODE 0xff /* application block */
130
131/******************************************************************************
132 * O.K., here are the routines one can access in order to encode GIF file:
133 * (GIF_LIB file EGIF_LIB.C).
134******************************************************************************/
135
136GifFileType *EGifOpenFileName(const char *GifFileName,
137 int GifTestExistance);
138GifFileType *EGifOpenFileHandle(int GifFileHandle);
139GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc);
140
141int EGifSpew(GifFileType * GifFile);
142void EGifSetGifVersion(const char *Version);
143int EGifPutScreenDesc(GifFileType * GifFile,
144 int GifWidth, int GifHeight, int GifColorRes,
145 int GifBackGround,
146 const ColorMapObject * GifColorMap);
147int EGifPutImageDesc(GifFileType * GifFile, int GifLeft, int GifTop,
148 int Width, int GifHeight, int GifInterlace,
149 const ColorMapObject * GifColorMap);
150int EGifPutLine(GifFileType * GifFile, GifPixelType * GifLine,
151 int GifLineLen);
152int EGifPutPixel(GifFileType * GifFile, GifPixelType GifPixel);
153int EGifPutComment(GifFileType * GifFile, const char *GifComment);
154int EGifPutExtensionFirst(GifFileType * GifFile, int GifExtCode,
155 int GifExtLen, const VoidPtr GifExtension);
156int EGifPutExtensionNext(GifFileType * GifFile, int GifExtCode,
157 int GifExtLen, const VoidPtr GifExtension);
158int EGifPutExtensionLast(GifFileType * GifFile, int GifExtCode,
159 int GifExtLen, const VoidPtr GifExtension);
160int EGifPutExtension(GifFileType * GifFile, int GifExtCode, int GifExtLen,
161 const VoidPtr GifExtension);
162int EGifPutCode(GifFileType * GifFile, int GifCodeSize,
163 const GifByteType * GifCodeBlock);
164int EGifPutCodeNext(GifFileType * GifFile,
165 const GifByteType * GifCodeBlock);
166int EGifCloseFile(GifFileType * GifFile);
167
168#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */
169#define E_GIF_ERR_WRITE_FAILED 2
170#define E_GIF_ERR_HAS_SCRN_DSCR 3
171#define E_GIF_ERR_HAS_IMAG_DSCR 4
172#define E_GIF_ERR_NO_COLOR_MAP 5
173#define E_GIF_ERR_DATA_TOO_BIG 6
174#define E_GIF_ERR_NOT_ENOUGH_MEM 7
175#define E_GIF_ERR_DISK_IS_FULL 8
176#define E_GIF_ERR_CLOSE_FAILED 9
177#define E_GIF_ERR_NOT_WRITEABLE 10
178
179/******************************************************************************
180 * O.K., here are the routines one can access in order to decode GIF file:
181 * (GIF_LIB file DGIF_LIB.C).
182 *****************************************************************************/
183#ifndef _GBA_NO_FILEIO
184GifFileType *DGifOpenFileName(const char *GifFileName);
185GifFileType *DGifOpenFileHandle(int GifFileHandle);
186int DGifSlurp(GifFileType * GifFile);
187#endif /* _GBA_NO_FILEIO */
188GifFileType *DGifOpen(void *userPtr, InputFunc readFunc); /* new one
189 * (TVT) */
190int DGifGetScreenDesc(GifFileType * GifFile);
191int DGifGetRecordType(GifFileType * GifFile, GifRecordType * GifType);
192int DGifGetImageDesc(GifFileType * GifFile);
193int DGifGetLine(GifFileType * GifFile, GifPixelType * GifLine, int GifLineLen);
194int DGifGetPixel(GifFileType * GifFile, GifPixelType GifPixel);
195int DGifGetComment(GifFileType * GifFile, char *GifComment);
196int DGifGetExtension(GifFileType * GifFile, int *GifExtCode,
197 GifByteType ** GifExtension);
198int DGifGetExtensionNext(GifFileType * GifFile, GifByteType ** GifExtension);
199int DGifGetCode(GifFileType * GifFile, int *GifCodeSize,
200 GifByteType ** GifCodeBlock);
201int DGifGetCodeNext(GifFileType * GifFile, GifByteType ** GifCodeBlock);
202int DGifGetLZCodes(GifFileType * GifFile, int *GifCode);
203int DGifCloseFile(GifFileType * GifFile);
204
205#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */
206#define D_GIF_ERR_READ_FAILED 102
207#define D_GIF_ERR_NOT_GIF_FILE 103
208#define D_GIF_ERR_NO_SCRN_DSCR 104
209#define D_GIF_ERR_NO_IMAG_DSCR 105
210#define D_GIF_ERR_NO_COLOR_MAP 106
211#define D_GIF_ERR_WRONG_RECORD 107
212#define D_GIF_ERR_DATA_TOO_BIG 108
213#define D_GIF_ERR_NOT_ENOUGH_MEM 109
214#define D_GIF_ERR_CLOSE_FAILED 110
215#define D_GIF_ERR_NOT_READABLE 111
216#define D_GIF_ERR_IMAGE_DEFECT 112
217#define D_GIF_ERR_EOF_TOO_SOON 113
218
219/******************************************************************************
220 * O.K., here are the routines from GIF_LIB file QUANTIZE.C.
221******************************************************************************/
222int QuantizeBuffer(unsigned int Width, unsigned int Height,
223 int *ColorMapSize, GifByteType * RedInput,
224 GifByteType * GreenInput, GifByteType * BlueInput,
225 GifByteType * OutputBuffer,
226 GifColorType * OutputColorMap);
227
228/******************************************************************************
229 * O.K., here are the routines from GIF_LIB file QPRINTF.C.
230******************************************************************************/
231extern int GifQuietPrint;
232
233#ifdef HAVE_STDARG_H
234 extern void GifQprintf(char *Format, ...);
235#elif defined (HAVE_VARARGS_H)
236 extern void GifQprintf();
237#endif /* HAVE_STDARG_H */
238
239/******************************************************************************
240 * O.K., here are the routines from GIF_LIB file GIF_ERR.C.
241******************************************************************************/
242#ifndef _GBA_NO_FILEIO
243extern void PrintGifError(void);
244#endif /* _GBA_NO_FILEIO */
245extern int GifLastError(void);
246
247/******************************************************************************
248 * O.K., here are the routines from GIF_LIB file DEV2GIF.C.
249******************************************************************************/
250extern int DumpScreen2Gif(const char *FileName,
251 int ReqGraphDriver,
252 long ReqGraphMode1,
253 long ReqGraphMode2,
254 long ReqGraphMode3);
255
256/*****************************************************************************
257 *
258 * Everything below this point is new after version 1.2, supporting `slurp
259 * mode' for doing I/O in two big belts with all the image-bashing in core.
260 *
261 *****************************************************************************/
262
263/******************************************************************************
264 * Color Map handling from ALLOCGIF.C
265 *****************************************************************************/
266
267extern ColorMapObject *MakeMapObject(int ColorCount,
268 const GifColorType * ColorMap);
269extern void FreeMapObject(ColorMapObject * Object);
270extern ColorMapObject *UnionColorMap(const ColorMapObject * ColorIn1,
271 const ColorMapObject * ColorIn2,
272 GifPixelType ColorTransIn2[]);
273extern int BitSize(int n);
274
275/******************************************************************************
276 * Support for the in-core structures allocation (slurp mode).
277 *****************************************************************************/
278
279/* This is the in-core version of an extension record */
280typedef struct {
281 int ByteCount;
282 char *Bytes; /* on malloc(3) heap */
283 int Function; /* Holds the type of the Extension block. */
284} ExtensionBlock;
285
286/* This holds an image header, its unpacked raster bits, and extensions */
287typedef struct SavedImage {
288 GifImageDesc ImageDesc;
289 unsigned char *RasterBits; /* on malloc(3) heap */
290 int Function; /* DEPRECATED: Use ExtensionBlocks[x].Function instead */
291 int ExtensionBlockCount;
292 ExtensionBlock *ExtensionBlocks; /* on malloc(3) heap */
293} SavedImage;
294
295extern void ApplyTranslation(SavedImage * Image, GifPixelType Translation[]);
296extern void MakeExtension(SavedImage * New, int Function);
297extern int AddExtensionBlock(SavedImage * New, int Len,
298 unsigned char ExtData[]);
299extern void FreeExtension(SavedImage * Image);
300extern SavedImage *MakeSavedImage(GifFileType * GifFile,
301 const SavedImage * CopyFrom);
302extern void FreeSavedImages(GifFileType * GifFile);
303
304/******************************************************************************
305 * The library's internal utility font
306 *****************************************************************************/
307
308#define GIF_FONT_WIDTH 8
309#define GIF_FONT_HEIGHT 8
310extern unsigned char AsciiTable[][GIF_FONT_WIDTH];
311
312#ifdef _WIN32
313 extern void DrawGifText(SavedImage * Image,
314#else
315 extern void DrawText(SavedImage * Image,
316#endif
317 const int x, const int y,
318 const char *legend, const int color);
319
320extern void DrawBox(SavedImage * Image,
321 const int x, const int y,
322 const int w, const int d, const int color);
323
324void DrawRectangle(SavedImage * Image,
325 const int x, const int y,
326 const int w, const int d, const int color);
327
328extern void DrawBoxedText(SavedImage * Image,
329 const int x, const int y,
330 const char *legend,
331 const int border, const int bg, const int fg);
332
333#ifdef __cplusplus
334}
335#endif /* __cplusplus */
336#endif /* _GIF_LIB_H */