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 */