1//////////////////////////////////////////////////////////////////////////////// 2// 3// File: GIFLoad.h 4// 5// Date: December 1999 6// 7// Author: Daniel Switkin 8// 9// Copyright 2003 (c) by Daniel Switkin. This file is made publically available 10// under the BSD license, with the stipulations that this complete header must 11// remain at the top of the file indefinitely, and credit must be given to the 12// original author in any about box using this software. 13// 14//////////////////////////////////////////////////////////////////////////////// 15 16// Additional authors: John Scipione, <jscipione@gmail.com> 17 18#ifndef GIF_LOAD_H 19#define GIF_LOAD_H 20 21 22#include <DataIO.h> 23#include "LoadPalette.h" 24 25 26#define GIF_INTERLACED 0x40 27#define GIF_LOCALCOLORMAP 0x80 28 29#define ENTRY_COUNT 4354 30 // 4354 = 4096 + 256 + 1 + 1 31 // 4096 for the image data, 256 for the color codes, 32 // 1 for the clear code, 1 for the end code 33 34 35typedef struct Memblock { 36 unsigned char data[ENTRY_COUNT]; 37 int offset; 38 Memblock* next; 39} Memblock; 40 41 42const int gl_pass_starts_at[] = { 0, 4, 2, 1, 0 }; 43const int gl_increment_pass_by[] = { 8, 8, 4, 2, 0 }; 44 45 46class GIFLoad { 47public: 48 GIFLoad(BPositionIO* input, 49 BPositionIO* output); 50 virtual ~GIFLoad(); 51 52 bool fatalerror; 53 54private: 55 bool ReadGIFHeader(); 56 bool ReadGIFLoopBlock(); 57 bool ReadGIFControlBlock(); 58 bool ReadGIFImageHeader(); 59 bool ReadGIFImageData(); 60 bool ReadGIFCommentBlock(); 61 bool ReadGIFUnknownBlock(unsigned char c); 62 63 bool InitFrame(int codeSize); 64 short NextCode(); 65 void ResetTable(); 66 67 unsigned char* MemblockAllocate(int size); 68 void MemblockDeleteAll(); 69 70 inline bool OutputColor(unsigned char* string, int size); 71 72 BPositionIO* fInput; 73 BPositionIO* fOutput; 74 LoadPalette* fPalette; 75 76 bool fInterlaced; 77 78 int fPass; 79 int fRow; 80 81 int fWidth; 82 int fHeight; 83 84 unsigned char fOldCode[ENTRY_COUNT]; 85 unsigned int fOldCodeLength; 86 87 short fNewCode; 88 int fBits; 89 int fMaxCode; 90 int fCodeSize; 91 92 short fClearCode; 93 short fEndCode; 94 short fNextCode; 95 96 unsigned char* fTable[ENTRY_COUNT]; 97 short fEntrySize[ENTRY_COUNT]; 98 Memblock* fHeadMemblock; 99 100 int fBitCount; 101 unsigned int fBitBuffer; 102 unsigned char fByteCount; 103 unsigned char fByteBuffer[255]; 104 105 uint32* fScanLine; 106 int fScanlinePosition; 107}; 108 109 110#endif // GIF_LOAD_H 111