/* * The Python Imaging Library. * $Id$ * * Declarations for a fast, suspendable GIF decoder. * * Copyright (c) Fredrik Lundh 1995-96. */ /* Max size for a LZW code word. */ #define GIFBITS 12 #define GIFTABLE (1 << GIFBITS) #define GIFBUFFER (1 << GIFBITS) typedef struct { /* CONFIGURATION */ /* Initial number of bits. The caller should clear all fields in this structure and set this field before calling the decoder the first time. */ int bits; /* If set, this is an interlaced image. Process it the following way: * 1st pass: start at top line, lines are 8 pixels high, step 8 pixels * 2nd pass: start at line 4, lines are 4 pixels high, step 8 pixels * 3rd pass: start at line 2, lines are 2 pixels high, step 4 pixels * 4th pass: start at line 1, lines are 1 pixels high, step 2 pixels */ int interlace; /* PRIVATE CONTEXT (set by decoder) */ /* Interlace parameters */ int step, repeat; /* Input bit buffer */ INT32 bitbuffer; int bitcount; int blocksize; /* Code buffer */ int codesize; int codemask; /* Constant symbol codes */ int clear, end; /* Symbol history */ int lastcode; unsigned char lastdata; /* History buffer */ int bufferindex; unsigned char buffer[GIFTABLE]; /* Symbol table */ UINT16 link[GIFTABLE]; unsigned char data[GIFTABLE]; int next; } GIFDECODERSTATE; typedef struct GIFENCODERBLOCK_T { struct GIFENCODERBLOCK_T *next; int size; UINT8 data[255]; } GIFENCODERBLOCK; typedef struct { /* CONFIGURATION */ /* Initial number of bits. The caller should clear all fields in this structure and set this field before calling the encoder the first time. */ int bits; /* NOTE: the expanding encoder ignores this field */ /* If set, write an interlaced image (see above) */ int interlace; /* PRIVATE CONTEXT (set by encoder) */ /* Interlace parameters */ int step, repeat; /* Output bit buffer */ INT32 bitbuffer; int bitcount; /* Output buffer list (linked list) */ GIFENCODERBLOCK *block; /* current block */ GIFENCODERBLOCK *flush; /* output queue */ GIFENCODERBLOCK *free; /* if not null, use this */ /* Fields used for run-length encoding */ int first; /* true if we haven't read the first pixel */ int last; /* last byte value seen */ int count; /* how many bytes with that value we've seen */ int lastcode; } GIFENCODERSTATE;