1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2009 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
* granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
* All output generated with Doxygen is not covered by this license.
*
*/
#ifndef _GIFENC_H
#define _GIFENC_H
#include <qfile.h>
typedef unsigned char Byte;
typedef unsigned short Word;
struct Color
{
Byte red;
Byte green;
Byte blue;
};
const int hashTableSize=5003; // size of the hash table
class GifEncoder
{
public:
GifEncoder(Byte *rawBytes,Color *p,int w,int h,Byte d,int t);
~GifEncoder();
void writeGIF(QFile &fp);
protected:
void putWord( Word w, QFile &fp );
void putByte( Byte b, QFile &fp );
void compress(int csize, QFile &fp);
void writeCode(int code, QFile &fp);
void writeChar( Byte c, QFile &fp );
void writePacket(QFile &fp);
void clearHashTable();
int nextPixel()
{
if ( --numPixels < 0) return EOF;
return *dataPtr++;
}
private:
const int colorResolution; // 8 bit for Red, Green and Blue;
const int globalPaletteFlag;
const int bits;
const int maxMaxCode;
// image variables
int width; // image width
int height; // image height
Byte depth; // bits per CLUT entry
int transIndex; // index of the transparant color; -1 = none
Color *palette; // pointer to the color palette
int numPixels; // total number of pixel (i.e. width * height)
Byte *data; // pointer to the image data (one byte per pixel)
Byte *dataPtr; // pointer located at the current pixel.
// compression variables
bool clearFlag; // clear hash table flag
int freeEntry; // first free entry in the hash table
unsigned int curAccum; // encoded bit accumulator
int curBits; // number of bits in curAccum
Byte accum[256]; // Buffer for a packet
int aCount; // Number of characters so far in this 'packet'
int nBits; // number of bits/code
int maxCode; // maximum code, given n_bits
int initBits; // initial number of bits
int EOFCode; // code for signaling the end of the file
int ClearCode; // the clear code for the decompressor
// tables
int htab[hashTableSize]; // the hash table
Word codetab[hashTableSize]; // the code table
};
#endif
|