mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-10-26 05:31:02 +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 */
 | |
|     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;
 |