• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  ******************************************************************************
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
20 extern "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 
47 typedef int GifBooleanType;
48 typedef unsigned char GifPixelType;
49 typedef unsigned char *GifRowType;
50 typedef 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 
68 typedef struct GifColorType {
69     GifByteType Red, Green, Blue;
70 } GifColorType;
71 
72 typedef struct ColorMapObject {
73     int ColorCount;
74     int BitsPerPixel;
75     GifColorType *Colors;    /* on malloc(3) heap */
76 } ColorMapObject;
77 
78 typedef 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 
84 typedef 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 
96 typedef 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  */
109 typedef 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) */
115 typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
116 
117 /* func type to write gif data ro arbitrary targets.
118  * Returns count of bytes written. (MRB)
119  */
120 typedef 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 
136 GifFileType *EGifOpenFileName(const char *GifFileName,
137                               int GifTestExistance);
138 GifFileType *EGifOpenFileHandle(int GifFileHandle);
139 GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc);
140 
141 int EGifSpew(GifFileType * GifFile);
142 void EGifSetGifVersion(const char *Version);
143 int EGifPutScreenDesc(GifFileType * GifFile,
144                       int GifWidth, int GifHeight, int GifColorRes,
145                       int GifBackGround,
146                       const ColorMapObject * GifColorMap);
147 int EGifPutImageDesc(GifFileType * GifFile, int GifLeft, int GifTop,
148                      int Width, int GifHeight, int GifInterlace,
149                      const ColorMapObject * GifColorMap);
150 int EGifPutLine(GifFileType * GifFile, GifPixelType * GifLine,
151                 int GifLineLen);
152 int EGifPutPixel(GifFileType * GifFile, GifPixelType GifPixel);
153 int EGifPutComment(GifFileType * GifFile, const char *GifComment);
154 int EGifPutExtensionFirst(GifFileType * GifFile, int GifExtCode,
155                           int GifExtLen, const VoidPtr GifExtension);
156 int EGifPutExtensionNext(GifFileType * GifFile, int GifExtCode,
157                          int GifExtLen, const VoidPtr GifExtension);
158 int EGifPutExtensionLast(GifFileType * GifFile, int GifExtCode,
159                          int GifExtLen, const VoidPtr GifExtension);
160 int EGifPutExtension(GifFileType * GifFile, int GifExtCode, int GifExtLen,
161                      const VoidPtr GifExtension);
162 int EGifPutCode(GifFileType * GifFile, int GifCodeSize,
163                 const GifByteType * GifCodeBlock);
164 int EGifPutCodeNext(GifFileType * GifFile,
165                     const GifByteType * GifCodeBlock);
166 int 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
184 GifFileType *DGifOpenFileName(const char *GifFileName);
185 GifFileType *DGifOpenFileHandle(int GifFileHandle);
186 int DGifSlurp(GifFileType * GifFile);
187 #endif /* _GBA_NO_FILEIO */
188 GifFileType *DGifOpen(void *userPtr, InputFunc readFunc);    /* new one
189                                                              * (TVT) */
190 int DGifGetScreenDesc(GifFileType * GifFile);
191 int DGifGetRecordType(GifFileType * GifFile, GifRecordType * GifType);
192 int DGifGetImageDesc(GifFileType * GifFile);
193 int DGifGetLine(GifFileType * GifFile, GifPixelType * GifLine, int GifLineLen);
194 int DGifGetPixel(GifFileType * GifFile, GifPixelType GifPixel);
195 int DGifGetComment(GifFileType * GifFile, char *GifComment);
196 int DGifGetExtension(GifFileType * GifFile, int *GifExtCode,
197                      GifByteType ** GifExtension);
198 int DGifGetExtensionNext(GifFileType * GifFile, GifByteType ** GifExtension);
199 int DGifGetCode(GifFileType * GifFile, int *GifCodeSize,
200                 GifByteType ** GifCodeBlock);
201 int DGifGetCodeNext(GifFileType * GifFile, GifByteType ** GifCodeBlock);
202 int DGifGetLZCodes(GifFileType * GifFile, int *GifCode);
203 int 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 ******************************************************************************/
222 int 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 ******************************************************************************/
231 extern 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
243 extern void PrintGifError(void);
244 #endif /* _GBA_NO_FILEIO */
245 extern int GifLastError(void);
246 
247 /******************************************************************************
248  * O.K., here are the routines from GIF_LIB file DEV2GIF.C.
249 ******************************************************************************/
250 extern 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 
267 extern ColorMapObject *MakeMapObject(int ColorCount,
268                                      const GifColorType * ColorMap);
269 extern void FreeMapObject(ColorMapObject * Object);
270 extern ColorMapObject *UnionColorMap(const ColorMapObject * ColorIn1,
271                                      const ColorMapObject * ColorIn2,
272                                      GifPixelType ColorTransIn2[]);
273 extern 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 */
280 typedef 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 */
287 typedef 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 
295 extern void ApplyTranslation(SavedImage * Image, GifPixelType Translation[]);
296 extern void MakeExtension(SavedImage * New, int Function);
297 extern int AddExtensionBlock(SavedImage * New, int Len,
298                              unsigned char ExtData[]);
299 extern void FreeExtension(SavedImage * Image);
300 extern SavedImage *MakeSavedImage(GifFileType * GifFile,
301                                   const SavedImage * CopyFrom);
302 extern 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
310 extern unsigned char AsciiTable[][GIF_FONT_WIDTH];
311 
312 #ifdef _WIN32
313     extern void DrawGifText(SavedImage * Image,
314 #else
315     extern void DrawGifText(SavedImage * Image,
316 #endif
317                      const int x, const int y,
318                      const char *legend, const int color);
319 
320 extern void DrawBox(SavedImage * Image,
321                     const int x, const int y,
322                     const int w, const int d, const int color);
323 
324 void DrawRectangle(SavedImage * Image,
325                    const int x, const int y,
326                    const int w, const int d, const int color);
327 
328 extern 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 */
337