mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-11-14 05:36:48 +03:00
110 lines
2.5 KiB
C
110 lines
2.5 KiB
C
|
/*
|
||
|
* 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 */
|
||
|
unsigned INT16 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;
|