1/*
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation.  Oracle designates this
7 * particular file as subject to the "Classpath" exception as provided
8 * by Oracle in the LICENSE file that accompanied this code.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25/******************************************************************************
26
27gif_lib.h - service library for decoding and encoding GIF images
28
29*****************************************************************************/
30
31#ifndef _GIF_LIB_H_
32#define _GIF_LIB_H_ 1
33
34#ifdef __cplusplus
35extern "C" {
36#endif /* __cplusplus */
37
38#define GIFLIB_MAJOR 5
39#define GIFLIB_MINOR 1
40#define GIFLIB_RELEASE 4
41
42#define GIF_ERROR   0
43#define GIF_OK      1
44
45#include <stddef.h>
46
47#ifdef bool
48#undef bool
49#endif
50typedef int bool;
51#define false 0
52#define true 1
53
54#define GIF_STAMP "GIFVER"          /* First chars in file - GIF stamp.  */
55#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1
56#define GIF_VERSION_POS 3           /* Version first character in stamp. */
57#define GIF87_STAMP "GIF87a"        /* First chars in file - GIF stamp.  */
58#define GIF89_STAMP "GIF89a"        /* First chars in file - GIF stamp.  */
59
60typedef unsigned char GifPixelType;
61typedef unsigned char *GifRowType;
62typedef unsigned char GifByteType;
63typedef unsigned int GifPrefixType;
64typedef int GifWord;
65
66typedef struct GifColorType {
67    GifByteType Red, Green, Blue;
68} GifColorType;
69
70typedef struct ColorMapObject {
71    int ColorCount;
72    int BitsPerPixel;
73    bool SortFlag;
74    GifColorType *Colors;    /* on malloc(3) heap */
75} ColorMapObject;
76
77typedef struct GifImageDesc {
78    GifWord Left, Top, Width, Height;   /* Current image dimensions. */
79    bool Interlace;                     /* Sequential/Interlaced lines. */
80    ColorMapObject *ColorMap;           /* The local color map */
81} GifImageDesc;
82
83typedef struct ExtensionBlock {
84    int ByteCount;
85    GifByteType *Bytes; /* on malloc(3) heap */
86    int Function;       /* The block function code */
87#define CONTINUE_EXT_FUNC_CODE    0x00    /* continuation subblock */
88#define COMMENT_EXT_FUNC_CODE     0xfe    /* comment */
89#define GRAPHICS_EXT_FUNC_CODE    0xf9    /* graphics control (GIF89) */
90#define PLAINTEXT_EXT_FUNC_CODE   0x01    /* plaintext */
91#define APPLICATION_EXT_FUNC_CODE 0xff    /* application block */
92} ExtensionBlock;
93
94typedef struct SavedImage {
95    GifImageDesc ImageDesc;
96    GifByteType *RasterBits;         /* on malloc(3) heap */
97    int ExtensionBlockCount;         /* Count of extensions before image */
98    ExtensionBlock *ExtensionBlocks; /* Extensions before image */
99} SavedImage;
100
101typedef struct GifFileType {
102    GifWord SWidth, SHeight;         /* Size of virtual canvas */
103    GifWord SColorResolution;        /* How many colors can we generate? */
104    GifWord SBackGroundColor;        /* Background color for virtual canvas */
105    GifByteType AspectByte;          /* Used to compute pixel aspect ratio */
106    ColorMapObject *SColorMap;       /* Global colormap, NULL if nonexistent. */
107    int ImageCount;                  /* Number of current image (both APIs) */
108    GifImageDesc Image;              /* Current image (low-level API) */
109    SavedImage *SavedImages;         /* Image sequence (high-level API) */
110    int ExtensionBlockCount;         /* Count extensions past last image */
111    ExtensionBlock *ExtensionBlocks; /* Extensions past last image */
112    int Error;                       /* Last error condition reported */
113    void *UserData;                  /* hook to attach user data (TVT) */
114    void *Private;                   /* Don't mess with this! */
115} GifFileType;
116
117#define GIF_ASPECT_RATIO(n)    ((n)+15.0/64.0)
118
119typedef enum {
120    UNDEFINED_RECORD_TYPE,
121    SCREEN_DESC_RECORD_TYPE,
122    IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */
123    EXTENSION_RECORD_TYPE,  /* Begin with '!' */
124    TERMINATE_RECORD_TYPE   /* Begin with ';' */
125} GifRecordType;
126
127/* func type to read gif data from arbitrary sources (TVT) */
128typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
129
130/* func type to write gif data to arbitrary targets.
131 * Returns count of bytes written. (MRB)
132 */
133typedef int (*OutputFunc) (GifFileType *, const GifByteType *, int);
134
135/******************************************************************************
136 GIF89 structures
137******************************************************************************/
138
139typedef struct GraphicsControlBlock {
140    int DisposalMode;
141#define DISPOSAL_UNSPECIFIED      0       /* No disposal specified. */
142#define DISPOSE_DO_NOT            1       /* Leave image in place */
143#define DISPOSE_BACKGROUND        2       /* Set area too background color */
144#define DISPOSE_PREVIOUS          3       /* Restore to previous content */
145    bool UserInputFlag;      /* User confirmation required before disposal */
146    int DelayTime;           /* pre-display delay in 0.01sec units */
147    int TransparentColor;    /* Palette index for transparency, -1 if none */
148#define NO_TRANSPARENT_COLOR    -1
149} GraphicsControlBlock;
150
151/******************************************************************************
152 GIF encoding routines
153******************************************************************************/
154
155/* Main entry points */
156GifFileType *EGifOpenFileName(const char *GifFileName,
157                              const bool GifTestExistence, int *Error);
158GifFileType *EGifOpenFileHandle(const int GifFileHandle, int *Error);
159GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc, int *Error);
160int EGifSpew(GifFileType * GifFile);
161const char *EGifGetGifVersion(GifFileType *GifFile); /* new in 5.x */
162int EGifCloseFile(GifFileType *GifFile, int *ErrorCode);
163
164#define E_GIF_SUCCEEDED          0
165#define E_GIF_ERR_OPEN_FAILED    1    /* And EGif possible errors. */
166#define E_GIF_ERR_WRITE_FAILED   2
167#define E_GIF_ERR_HAS_SCRN_DSCR  3
168#define E_GIF_ERR_HAS_IMAG_DSCR  4
169#define E_GIF_ERR_NO_COLOR_MAP   5
170#define E_GIF_ERR_DATA_TOO_BIG   6
171#define E_GIF_ERR_NOT_ENOUGH_MEM 7
172#define E_GIF_ERR_DISK_IS_FULL   8
173#define E_GIF_ERR_CLOSE_FAILED   9
174#define E_GIF_ERR_NOT_WRITEABLE  10
175
176/* These are legacy.  You probably do not want to call them directly */
177int EGifPutScreenDesc(GifFileType *GifFile,
178                      const int GifWidth, const int GifHeight,
179                      const int GifColorRes,
180                      const int GifBackGround,
181                      const ColorMapObject *GifColorMap);
182int EGifPutImageDesc(GifFileType *GifFile,
183                     const int GifLeft, const int GifTop,
184                     const int GifWidth, const int GifHeight,
185                     const bool GifInterlace,
186                     const ColorMapObject *GifColorMap);
187void EGifSetGifVersion(GifFileType *GifFile, const bool gif89);
188int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine,
189                int GifLineLen);
190int EGifPutPixel(GifFileType *GifFile, const GifPixelType GifPixel);
191int EGifPutComment(GifFileType *GifFile, const char *GifComment);
192int EGifPutExtensionLeader(GifFileType *GifFile, const int GifExtCode);
193int EGifPutExtensionBlock(GifFileType *GifFile,
194                         const int GifExtLen, const void *GifExtension);
195int EGifPutExtensionTrailer(GifFileType *GifFile);
196int EGifPutExtension(GifFileType *GifFile, const int GifExtCode,
197                     const int GifExtLen,
198                     const void *GifExtension);
199int EGifPutCode(GifFileType *GifFile, int GifCodeSize,
200                const GifByteType *GifCodeBlock);
201int EGifPutCodeNext(GifFileType *GifFile,
202                    const GifByteType *GifCodeBlock);
203
204/******************************************************************************
205 GIF decoding routines
206******************************************************************************/
207
208/* Main entry points */
209GifFileType *DGifOpenFileName(const char *GifFileName, int *Error);
210GifFileType *DGifOpenFileHandle(int GifFileHandle, int *Error);
211int DGifSlurp(GifFileType * GifFile);
212GifFileType *DGifOpen(void *userPtr, InputFunc readFunc, int *Error);    /* new one (TVT) */
213    int DGifCloseFile(GifFileType * GifFile, int *ErrorCode);
214
215#define D_GIF_SUCCEEDED          0
216#define D_GIF_ERR_OPEN_FAILED    101    /* And DGif possible errors. */
217#define D_GIF_ERR_READ_FAILED    102
218#define D_GIF_ERR_NOT_GIF_FILE   103
219#define D_GIF_ERR_NO_SCRN_DSCR   104
220#define D_GIF_ERR_NO_IMAG_DSCR   105
221#define D_GIF_ERR_NO_COLOR_MAP   106
222#define D_GIF_ERR_WRONG_RECORD   107
223#define D_GIF_ERR_DATA_TOO_BIG   108
224#define D_GIF_ERR_NOT_ENOUGH_MEM 109
225#define D_GIF_ERR_CLOSE_FAILED   110
226#define D_GIF_ERR_NOT_READABLE   111
227#define D_GIF_ERR_IMAGE_DEFECT   112
228#define D_GIF_ERR_EOF_TOO_SOON   113
229
230/* These are legacy.  You probably do not want to call them directly */
231int DGifGetScreenDesc(GifFileType *GifFile);
232int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType);
233int DGifGetImageDesc(GifFileType *GifFile);
234int DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen);
235int DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel);
236int DGifGetComment(GifFileType *GifFile, char *GifComment);
237int DGifGetExtension(GifFileType *GifFile, int *GifExtCode,
238                     GifByteType **GifExtension);
239int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension);
240int DGifGetCode(GifFileType *GifFile, int *GifCodeSize,
241                GifByteType **GifCodeBlock);
242int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock);
243int DGifGetLZCodes(GifFileType *GifFile, int *GifCode);
244
245
246/******************************************************************************
247 Color table quantization (deprecated)
248******************************************************************************/
249int GifQuantizeBuffer(unsigned int Width, unsigned int Height,
250                   int *ColorMapSize, GifByteType * RedInput,
251                   GifByteType * GreenInput, GifByteType * BlueInput,
252                   GifByteType * OutputBuffer,
253                   GifColorType * OutputColorMap);
254
255/******************************************************************************
256 Error handling and reporting.
257******************************************************************************/
258extern const char *GifErrorString(int ErrorCode);     /* new in 2012 - ESR */
259
260/*****************************************************************************
261 Everything below this point is new after version 1.2, supporting `slurp
262 mode' for doing I/O in two big belts with all the image-bashing in core.
263******************************************************************************/
264
265/******************************************************************************
266 Color map handling from gif_alloc.c
267******************************************************************************/
268
269extern ColorMapObject *GifMakeMapObject(int ColorCount,
270                                     const GifColorType *ColorMap);
271extern void GifFreeMapObject(ColorMapObject *Object);
272extern ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1,
273                                     const ColorMapObject *ColorIn2,
274                                     GifPixelType ColorTransIn2[]);
275extern int GifBitSize(int n);
276
277extern void * reallocarray(void *optr, size_t nmemb, size_t size);
278
279
280/******************************************************************************
281 Support for the in-core structures allocation (slurp mode).
282******************************************************************************/
283
284extern void GifApplyTranslation(SavedImage *Image, GifPixelType Translation[]);
285extern int GifAddExtensionBlock(int *ExtensionBlock_Count,
286                                ExtensionBlock **ExtensionBlocks,
287                                int Function,
288                                unsigned int Len, unsigned char ExtData[]);
289extern void GifFreeExtensions(int *ExtensionBlock_Count,
290                              ExtensionBlock **ExtensionBlocks);
291extern SavedImage *GifMakeSavedImage(GifFileType *GifFile,
292                                  const SavedImage *CopyFrom);
293extern void GifFreeSavedImages(GifFileType *GifFile);
294
295/******************************************************************************
296 5.x functions for GIF89 graphics control blocks
297******************************************************************************/
298
299int DGifExtensionToGCB(const size_t GifExtensionLength,
300                       const GifByteType *GifExtension,
301                       GraphicsControlBlock *GCB);
302size_t EGifGCBToExtension(const GraphicsControlBlock *GCB,
303                          GifByteType *GifExtension);
304
305int DGifSavedExtensionToGCB(GifFileType *GifFile,
306                            int ImageIndex,
307                            GraphicsControlBlock *GCB);
308int EGifGCBToSavedExtension(const GraphicsControlBlock *GCB,
309                            GifFileType *GifFile,
310                            int ImageIndex);
311
312/******************************************************************************
313 The library's internal utility font
314******************************************************************************/
315
316#define GIF_FONT_WIDTH  8
317#define GIF_FONT_HEIGHT 8
318extern const unsigned char GifAsciiTable8x8[][GIF_FONT_WIDTH];
319
320extern void GifDrawText8x8(SavedImage *Image,
321                     const int x, const int y,
322                     const char *legend, const int color);
323
324extern void GifDrawBox(SavedImage *Image,
325                    const int x, const int y,
326                    const int w, const int d, const int color);
327
328extern void GifDrawRectangle(SavedImage *Image,
329                   const int x, const int y,
330                   const int w, const int d, const int color);
331
332extern void GifDrawBoxedText8x8(SavedImage *Image,
333                          const int x, const int y,
334                          const char *legend,
335                          const int border, const int bg, const int fg);
336
337#ifdef __cplusplus
338}
339#endif /* __cplusplus */
340#endif /* _GIF_LIB_H */
341
342/* end */
343