]> git.saurik.com Git - wxWidgets.git/blame - include/wx/gifdecod.h
use wxChar* instead of wxString for string constants, cuts object size by ~1200 bytes
[wxWidgets.git] / include / wx / gifdecod.h
CommitLineData
661dc384
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: gifdecod.h
3// Purpose: wxGIFDecoder, GIF reader for wxImage and wxAnimation
4// Author: Guillermo Rodriguez Garcia <guille@iies.es>
3c87527e 5// Version: 3.02
83413d6d
GRG
6// CVS-ID: $Id$
7// Copyright: (c) 1999 Guillermo Rodriguez Garcia
65571936 8// Licence: wxWindows licence
661dc384
JS
9/////////////////////////////////////////////////////////////////////////////
10
11#ifndef _WX_GIFDECOD_H
12#define _WX_GIFDECOD_H
13
2ecf902b 14#include "wx/defs.h"
661dc384 15
83413d6d
GRG
16#if wxUSE_STREAMS && wxUSE_GIF
17
661dc384
JS
18#include "wx/stream.h"
19#include "wx/image.h"
20
21
e4b8154a 22// --------------------------------------------------------------------------
8141573c 23// Constants
e4b8154a
GRG
24// --------------------------------------------------------------------------
25
8141573c
GRG
26// Error codes:
27// Note that the error code wxGIF_TRUNCATED means that the image itself
28// is most probably OK, but the decoder didn't reach the end of the data
29// stream; this means that if it was not reading directly from file,
30// the stream will not be correctly positioned. the
31//
32enum
33{
34 wxGIF_OK = 0, /* everything was OK */
35 wxGIF_INVFORMAT, /* error in gif header */
36 wxGIF_MEMERR, /* error allocating memory */
37 wxGIF_TRUNCATED /* file appears to be truncated */
38};
39
40// Disposal method
41// Experimental; subject to change.
42//
e4b8154a
GRG
43enum
44{
45 wxGIF_D_UNSPECIFIED = -1, /* not specified */
46 wxGIF_D_DONOTDISPOSE = 0, /* do not dispose */
47 wxGIF_D_TOBACKGROUND = 1, /* restore to background colour */
48 wxGIF_D_TOPREVIOUS = 2 /* restore to previous image */
49};
50
e4b8154a
GRG
51
52#define MAX_BLOCK_SIZE 256 /* max. block size */
53
54
55// --------------------------------------------------------------------------
56// wxGIFDecoder class
57// --------------------------------------------------------------------------
58
59// internal class for storing GIF image data
60class GIFImage
661dc384 61{
e4b8154a 62public:
65c36a73
VZ
63 // def ctor
64 GIFImage();
65
661dc384
JS
66 unsigned int w; /* width */
67 unsigned int h; /* height */
68 unsigned int left; /* x coord (in logical screen) */
69 unsigned int top; /* y coord (in logical screen) */
70 int transparent; /* transparent color (-1 = none) */
3c87527e 71 int disposal; /* disposal method (-1 = unspecified) */
661dc384
JS
72 long delay; /* delay in ms (-1 = unused) */
73 unsigned char *p; /* bitmap */
74 unsigned char *pal; /* palette */
e4b8154a
GRG
75 GIFImage *next; /* next image */
76 GIFImage *prev; /* prev image */
22f3361e
VZ
77
78 DECLARE_NO_COPY_CLASS(GIFImage)
e4b8154a 79};
661dc384 80
76443e70 81
b31ba288 82class WXDLLEXPORT wxGIFDecoder
661dc384
JS
83{
84private:
e4b8154a 85 // logical screen
661dc384
JS
86 unsigned int m_screenw; /* logical screen width */
87 unsigned int m_screenh; /* logical screen height */
88 int m_background; /* background color (-1 = none) */
89
e4b8154a 90 // image data
661dc384
JS
91 bool m_anim; /* animated GIF */
92 int m_nimages; /* number of images */
93 int m_image; /* current image */
e4b8154a
GRG
94 GIFImage *m_pimage; /* pointer to current image */
95 GIFImage *m_pfirst; /* pointer to first image */
96 GIFImage *m_plast; /* pointer to last image */
661dc384 97
e4b8154a 98 // decoder state vars
661dc384
JS
99 int m_restbits; /* remaining valid bits */
100 unsigned int m_restbyte; /* remaining bytes in this block */
101 unsigned int m_lastbyte; /* last byte read */
76443e70
GRG
102 unsigned char m_buffer[MAX_BLOCK_SIZE]; /* buffer for reading */
103 unsigned char *m_bufp; /* pointer to next byte in buffer */
661dc384 104
e4b8154a
GRG
105 // input stream
106 wxInputStream *m_f; /* input stream */
661dc384
JS
107
108private:
109 int getcode(int bits, int abfin);
e4b8154a 110 int dgif(GIFImage *img, int interl, int bits);
661dc384 111
809e8e44 112public:
661dc384
JS
113 // get data of current frame
114 int GetFrameIndex() const;
115 unsigned char* GetData() const;
116 unsigned char* GetPalette() const;
117 unsigned int GetWidth() const;
118 unsigned int GetHeight() const;
119 unsigned int GetLeft() const;
120 unsigned int GetTop() const;
121 int GetDisposalMethod() const;
122 int GetTransparentColour() const;
123 long GetDelay() const;
124
125 // get global data
126 unsigned int GetLogicalScreenWidth() const;
127 unsigned int GetLogicalScreenHeight() const;
128 int GetBackgroundColour() const;
129 int GetNumberOfFrames() const;
130 bool IsAnimation() const;
131
132 // move through the animation
133 bool GoFirstFrame();
134 bool GoLastFrame();
5d3e7b52
WS
135 bool GoNextFrame(bool cyclic = false);
136 bool GoPrevFrame(bool cyclic = false);
661dc384 137 bool GoFrame(int which);
e4b8154a
GRG
138
139public:
140 // constructor, destructor, etc.
5d3e7b52 141 wxGIFDecoder(wxInputStream *s, bool anim = false);
e4b8154a
GRG
142 ~wxGIFDecoder();
143 bool CanRead();
144 int ReadGIF();
145 void Destroy();
146
147 // convert current frame to wxImage
148 bool ConvertToImage(wxImage *image) const;
22f3361e
VZ
149
150 DECLARE_NO_COPY_CLASS(wxGIFDecoder)
661dc384
JS
151};
152
153
83413d6d 154#endif // wxUSE_STREAM && wxUSE_GIF
661dc384
JS
155#endif // _WX_GIFDECOD_H
156