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 8
41
42#define GIF_ERROR 0
43#define GIF_OK 1
44
45#include <stddef.h>
46/** Begin JDK modifications to support building using old compilers**/
47//#include <stdbool.h>
48#ifdef bool
49#undef bool
50#endif
51typedef int bool;
52#define false 0
53#define true 1
54/** End JDK modifications to support building using old compilers**/
55
56#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */
57#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1
58#define GIF_VERSION_POS 3 /* Version first character in stamp. */
59#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */
60#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */
61
62typedef unsigned char GifPixelType;
63typedef unsigned char *GifRowType;
64typedef unsigned char GifByteType;
65typedef unsigned int GifPrefixType;
66typedef int GifWord;
67
68typedef struct GifColorType {
69 GifByteType Red, Green, Blue;
70} GifColorType;
71
72typedef struct ColorMapObject {
73 int ColorCount;
74 int BitsPerPixel;
75 bool SortFlag;
76 GifColorType *Colors; /* on malloc(3) heap */
77} ColorMapObject;
78
79typedef struct GifImageDesc {
80 GifWord Left, Top, Width, Height; /* Current image dimensions. */
81 bool Interlace; /* Sequential/Interlaced lines. */
82 ColorMapObject *ColorMap; /* The local color map */
83} GifImageDesc;
84
85typedef struct ExtensionBlock {
86 int ByteCount;
87 GifByteType *Bytes; /* on malloc(3) heap */
88 int Function; /* The block function code */
89#define CONTINUE_EXT_FUNC_CODE 0x00 /* continuation subblock */
90#define COMMENT_EXT_FUNC_CODE 0xfe /* comment */
91#define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control (GIF89) */
92#define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */
93#define APPLICATION_EXT_FUNC_CODE 0xff /* application block (GIF89) */
94} ExtensionBlock;
95
96typedef struct SavedImage {
97 GifImageDesc ImageDesc;
98 GifByteType *RasterBits; /* on malloc(3) heap */
99 int ExtensionBlockCount; /* Count of extensions before image */
100 ExtensionBlock *ExtensionBlocks; /* Extensions before image */
101} SavedImage;
102
103typedef struct GifFileType {
104 GifWord SWidth, SHeight; /* Size of virtual canvas */
105 GifWord SColorResolution; /* How many colors can we generate? */
106 GifWord SBackGroundColor; /* Background color for virtual canvas */
107 GifByteType AspectByte; /* Used to compute pixel aspect ratio */
108 ColorMapObject *SColorMap; /* Global colormap, NULL if nonexistent. */
109 int ImageCount; /* Number of current image (both APIs) */
110 GifImageDesc Image; /* Current image (low-level API) */
111 SavedImage *SavedImages; /* Image sequence (high-level API) */
112 int ExtensionBlockCount; /* Count extensions past last image */
113 ExtensionBlock *ExtensionBlocks; /* Extensions past last image */
114 int Error; /* Last error condition reported */
115 void *UserData; /* hook to attach user data (TVT) */
116 void *Private; /* Don't mess with this! */
117} GifFileType;
118
119#define GIF_ASPECT_RATIO(n) ((n)+15.0/64.0)
120
121typedef enum {
122 UNDEFINED_RECORD_TYPE,
123 SCREEN_DESC_RECORD_TYPE,
124 IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */
125 EXTENSION_RECORD_TYPE, /* Begin with '!' */
126 TERMINATE_RECORD_TYPE /* Begin with ';' */
127} GifRecordType;
128
129/* func type to read gif data from arbitrary sources (TVT) */
130typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
131
132/* func type to write gif data to arbitrary targets.
133 * Returns count of bytes written. (MRB)
134 */
135typedef int (*OutputFunc) (GifFileType *, const GifByteType *, int);
136
137/******************************************************************************
138 GIF89 structures
139******************************************************************************/
140
141typedef struct GraphicsControlBlock {
142 int DisposalMode;
143#define DISPOSAL_UNSPECIFIED 0 /* No disposal specified. */
144#define DISPOSE_DO_NOT 1 /* Leave image in place */
145#define DISPOSE_BACKGROUND 2 /* Set area too background color */
146#define DISPOSE_PREVIOUS 3 /* Restore to previous content */
147 bool UserInputFlag; /* User confirmation required before disposal */
148 int DelayTime; /* pre-display delay in 0.01sec units */
149 int TransparentColor; /* Palette index for transparency, -1 if none */
150#define NO_TRANSPARENT_COLOR -1
151} GraphicsControlBlock;
152
153/******************************************************************************
154 GIF encoding routines
155******************************************************************************/
156
157/* Main entry points */
158GifFileType *EGifOpenFileName(const char *GifFileName,
159 const bool GifTestExistence, int *Error);
160GifFileType *EGifOpenFileHandle(const int GifFileHandle, int *Error);
161GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc, int *Error);
162int EGifSpew(GifFileType * GifFile);
163const char *EGifGetGifVersion(GifFileType *GifFile); /* new in 5.x */
164int EGifCloseFile(GifFileType *GifFile, int *ErrorCode);
165
166#define E_GIF_SUCCEEDED 0
167#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */
168#define E_GIF_ERR_WRITE_FAILED 2
169#define E_GIF_ERR_HAS_SCRN_DSCR 3
170#define E_GIF_ERR_HAS_IMAG_DSCR 4
171#define E_GIF_ERR_NO_COLOR_MAP 5
172#define E_GIF_ERR_DATA_TOO_BIG 6
173#define E_GIF_ERR_NOT_ENOUGH_MEM 7
174#define E_GIF_ERR_DISK_IS_FULL 8
175#define E_GIF_ERR_CLOSE_FAILED 9
176#define E_GIF_ERR_NOT_WRITEABLE 10
177
178/* These are legacy. You probably do not want to call them directly */
179int EGifPutScreenDesc(GifFileType *GifFile,
180 const int GifWidth, const int GifHeight,
181 const int GifColorRes,
182 const int GifBackGround,
183 const ColorMapObject *GifColorMap);
184int EGifPutImageDesc(GifFileType *GifFile,
185 const int GifLeft, const int GifTop,
186 const int GifWidth, const int GifHeight,
187 const bool GifInterlace,
188 const ColorMapObject *GifColorMap);
189void EGifSetGifVersion(GifFileType *GifFile, const bool gif89);
190int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine,
191 int GifLineLen);
192int EGifPutPixel(GifFileType *GifFile, const GifPixelType GifPixel);
193int EGifPutComment(GifFileType *GifFile, const char *GifComment);
194int EGifPutExtensionLeader(GifFileType *GifFile, const int GifExtCode);
195int EGifPutExtensionBlock(GifFileType *GifFile,
196 const int GifExtLen, const void *GifExtension);
197int EGifPutExtensionTrailer(GifFileType *GifFile);
198int EGifPutExtension(GifFileType *GifFile, const int GifExtCode,
199 const int GifExtLen,
200 const void *GifExtension);
201int EGifPutCode(GifFileType *GifFile, int GifCodeSize,
202 const GifByteType *GifCodeBlock);
203int EGifPutCodeNext(GifFileType *GifFile,
204 const GifByteType *GifCodeBlock);
205
206/******************************************************************************
207 GIF decoding routines
208******************************************************************************/
209
210/* Main entry points */
211GifFileType *DGifOpenFileName(const char *GifFileName, int *Error);
212GifFileType *DGifOpenFileHandle(int GifFileHandle, int *Error);
213int DGifSlurp(GifFileType * GifFile);
214GifFileType *DGifOpen(void *userPtr, InputFunc readFunc, int *Error); /* new one (TVT) */
215 int DGifCloseFile(GifFileType * GifFile, int *ErrorCode);
216
217#define D_GIF_SUCCEEDED 0
218#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */
219#define D_GIF_ERR_READ_FAILED 102
220#define D_GIF_ERR_NOT_GIF_FILE 103
221#define D_GIF_ERR_NO_SCRN_DSCR 104
222#define D_GIF_ERR_NO_IMAG_DSCR 105
223#define D_GIF_ERR_NO_COLOR_MAP 106
224#define D_GIF_ERR_WRONG_RECORD 107
225#define D_GIF_ERR_DATA_TOO_BIG 108
226#define D_GIF_ERR_NOT_ENOUGH_MEM 109
227#define D_GIF_ERR_CLOSE_FAILED 110
228#define D_GIF_ERR_NOT_READABLE 111
229#define D_GIF_ERR_IMAGE_DEFECT 112
230#define D_GIF_ERR_EOF_TOO_SOON 113
231
232/* These are legacy. You probably do not want to call them directly */
233int DGifGetScreenDesc(GifFileType *GifFile);
234int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType);
235int DGifGetImageHeader(GifFileType *GifFile);
236int DGifGetImageDesc(GifFileType *GifFile);
237int DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen);
238int DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel);
239int DGifGetExtension(GifFileType *GifFile, int *GifExtCode,
240 GifByteType **GifExtension);
241int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension);
242int DGifGetCode(GifFileType *GifFile, int *GifCodeSize,
243 GifByteType **GifCodeBlock);
244int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock);
245int DGifGetLZCodes(GifFileType *GifFile, int *GifCode);
246const char *DGifGetGifVersion(GifFileType *GifFile);
247
248
249/******************************************************************************
250 Color table quantization (deprecated)
251******************************************************************************/
252int GifQuantizeBuffer(unsigned int Width, unsigned int Height,
253 int *ColorMapSize, GifByteType * RedInput,
254 GifByteType * GreenInput, GifByteType * BlueInput,
255 GifByteType * OutputBuffer,
256 GifColorType * OutputColorMap);
257
258/******************************************************************************
259 Error handling and reporting.
260******************************************************************************/
261extern const char *GifErrorString(int ErrorCode); /* new in 2012 - ESR */
262
263/*****************************************************************************
264 Everything below this point is new after version 1.2, supporting `slurp
265 mode' for doing I/O in two big belts with all the image-bashing in core.
266******************************************************************************/
267
268/******************************************************************************
269 Color map handling from gif_alloc.c
270******************************************************************************/
271
272extern ColorMapObject *GifMakeMapObject(int ColorCount,
273 const GifColorType *ColorMap);
274extern void GifFreeMapObject(ColorMapObject *Object);
275extern ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1,
276 const ColorMapObject *ColorIn2,
277 GifPixelType ColorTransIn2[]);
278extern int GifBitSize(int n);
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