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