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 27 gif_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 35 extern "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 51 typedef 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 62 typedef unsigned char GifPixelType; 63 typedef unsigned char *GifRowType; 64 typedef unsigned char GifByteType; 65 typedef unsigned int GifPrefixType; 66 typedef int GifWord; 67 68 typedef struct GifColorType { 69 GifByteType Red, Green, Blue; 70 } GifColorType; 71 72 typedef struct ColorMapObject { 73 int ColorCount; 74 int BitsPerPixel; 75 bool SortFlag; 76 GifColorType *Colors; /* on malloc(3) heap */ 77 } ColorMapObject; 78 79 typedef 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 85 typedef 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 96 typedef 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 103 typedef 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 121 typedef 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) */ 130 typedef int (*InputFunc) (GifFileType *, GifByteType *, int); 131 132 /* func type to write gif data to arbitrary targets. 133 * Returns count of bytes written. (MRB) 134 */ 135 typedef int (*OutputFunc) (GifFileType *, const GifByteType *, int); 136 137 /****************************************************************************** 138 GIF89 structures 139 ******************************************************************************/ 140 141 typedef 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 */ 158 GifFileType *EGifOpenFileName(const char *GifFileName, 159 const bool GifTestExistence, int *Error); 160 GifFileType *EGifOpenFileHandle(const int GifFileHandle, int *Error); 161 GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc, int *Error); 162 int EGifSpew(GifFileType * GifFile); 163 const char *EGifGetGifVersion(GifFileType *GifFile); /* new in 5.x */ 164 int 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 */ 179 int EGifPutScreenDesc(GifFileType *GifFile, 180 const int GifWidth, const int GifHeight, 181 const int GifColorRes, 182 const int GifBackGround, 183 const ColorMapObject *GifColorMap); 184 int 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); 189 void EGifSetGifVersion(GifFileType *GifFile, const bool gif89); 190 int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, 191 int GifLineLen); 192 int EGifPutPixel(GifFileType *GifFile, const GifPixelType GifPixel); 193 int EGifPutComment(GifFileType *GifFile, const char *GifComment); 194 int EGifPutExtensionLeader(GifFileType *GifFile, const int GifExtCode); 195 int EGifPutExtensionBlock(GifFileType *GifFile, 196 const int GifExtLen, const void *GifExtension); 197 int EGifPutExtensionTrailer(GifFileType *GifFile); 198 int EGifPutExtension(GifFileType *GifFile, const int GifExtCode, 199 const int GifExtLen, 200 const void *GifExtension); 201 int EGifPutCode(GifFileType *GifFile, int GifCodeSize, 202 const GifByteType *GifCodeBlock); 203 int EGifPutCodeNext(GifFileType *GifFile, 204 const GifByteType *GifCodeBlock); 205 206 /****************************************************************************** 207 GIF decoding routines 208 ******************************************************************************/ 209 210 /* Main entry points */ 211 GifFileType *DGifOpenFileName(const char *GifFileName, int *Error); 212 GifFileType *DGifOpenFileHandle(int GifFileHandle, int *Error); 213 int DGifSlurp(GifFileType * GifFile); 214 GifFileType *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 */ 233 int DGifGetScreenDesc(GifFileType *GifFile); 234 int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType); 235 int DGifGetImageHeader(GifFileType *GifFile); 236 int DGifGetImageDesc(GifFileType *GifFile); 237 int DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); 238 int DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel); 239 int DGifGetExtension(GifFileType *GifFile, int *GifExtCode, 240 GifByteType **GifExtension); 241 int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension); 242 int DGifGetCode(GifFileType *GifFile, int *GifCodeSize, 243 GifByteType **GifCodeBlock); 244 int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock); 245 int DGifGetLZCodes(GifFileType *GifFile, int *GifCode); 246 const char *DGifGetGifVersion(GifFileType *GifFile); 247 248 249 /****************************************************************************** 250 Color table quantization (deprecated) 251 ******************************************************************************/ 252 int 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 ******************************************************************************/ 261 extern 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 272 extern ColorMapObject *GifMakeMapObject(int ColorCount, 273 const GifColorType *ColorMap); 274 extern void GifFreeMapObject(ColorMapObject *Object); 275 extern ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1, 276 const ColorMapObject *ColorIn2, 277 GifPixelType ColorTransIn2[]); 278 extern int GifBitSize(int n); 279 280 /****************************************************************************** 281 Support for the in-core structures allocation (slurp mode). 282 ******************************************************************************/ 283 284 extern void GifApplyTranslation(SavedImage *Image, GifPixelType Translation[]); 285 extern int GifAddExtensionBlock(int *ExtensionBlock_Count, 286 ExtensionBlock **ExtensionBlocks, 287 int Function, 288 unsigned int Len, unsigned char ExtData[]); 289 extern void GifFreeExtensions(int *ExtensionBlock_Count, 290 ExtensionBlock **ExtensionBlocks); 291 extern SavedImage *GifMakeSavedImage(GifFileType *GifFile, 292 const SavedImage *CopyFrom); 293 extern void GifFreeSavedImages(GifFileType *GifFile); 294 295 /****************************************************************************** 296 5.x functions for GIF89 graphics control blocks 297 ******************************************************************************/ 298 299 int DGifExtensionToGCB(const size_t GifExtensionLength, 300 const GifByteType *GifExtension, 301 GraphicsControlBlock *GCB); 302 size_t EGifGCBToExtension(const GraphicsControlBlock *GCB, 303 GifByteType *GifExtension); 304 305 int DGifSavedExtensionToGCB(GifFileType *GifFile, 306 int ImageIndex, 307 GraphicsControlBlock *GCB); 308 int 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 318 extern const unsigned char GifAsciiTable8x8[][GIF_FONT_WIDTH]; 319 320 extern void GifDrawText8x8(SavedImage *Image, 321 const int x, const int y, 322 const char *legend, const int color); 323 324 extern void GifDrawBox(SavedImage *Image, 325 const int x, const int y, 326 const int w, const int d, const int color); 327 328 extern void GifDrawRectangle(SavedImage *Image, 329 const int x, const int y, 330 const int w, const int d, const int color); 331 332 extern 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