]> git.saurik.com Git - wxWidgets.git/blob - include/wx/gifdecod.h
Fixed [ 1561693 ] wxGIFDecoder creates incorrect wxPalette
[wxWidgets.git] / include / wx / gifdecod.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: gifdecod.h
3 // Purpose: wxGIFDecoder, GIF reader for wxImage and wxAnimation
4 // Author: Guillermo Rodriguez Garcia <guille@iies.es>
5 // Version: 3.02
6 // CVS-ID: $Id$
7 // Copyright: (c) 1999 Guillermo Rodriguez Garcia
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
10
11 #ifndef _WX_GIFDECOD_H
12 #define _WX_GIFDECOD_H
13
14 #include "wx/defs.h"
15
16 #if wxUSE_STREAMS && wxUSE_GIF
17
18 #include "wx/stream.h"
19 #include "wx/image.h"
20
21
22 // --------------------------------------------------------------------------
23 // Constants
24 // --------------------------------------------------------------------------
25
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 //
32 enum
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 //
43 enum
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
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
60 class GIFImage
61 {
62 public:
63 // def ctor
64 GIFImage();
65
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) */
71 int disposal; /* disposal method (-1 = unspecified) */
72 long delay; /* delay in ms (-1 = unused) */
73 unsigned char *p; /* bitmap */
74 unsigned char *pal; /* palette */
75 unsigned int ncolours; /* number of colours */
76 GIFImage *next; /* next image */
77 GIFImage *prev; /* prev image */
78
79 DECLARE_NO_COPY_CLASS(GIFImage)
80 };
81
82
83 class WXDLLEXPORT wxGIFDecoder
84 {
85 private:
86 // logical screen
87 unsigned int m_screenw; /* logical screen width */
88 unsigned int m_screenh; /* logical screen height */
89 int m_background; /* background color (-1 = none) */
90
91 // image data
92 bool m_anim; /* animated GIF */
93 int m_nimages; /* number of images */
94 int m_image; /* current image */
95 GIFImage *m_pimage; /* pointer to current image */
96 GIFImage *m_pfirst; /* pointer to first image */
97 GIFImage *m_plast; /* pointer to last image */
98
99 // decoder state vars
100 int m_restbits; /* remaining valid bits */
101 unsigned int m_restbyte; /* remaining bytes in this block */
102 unsigned int m_lastbyte; /* last byte read */
103 unsigned char m_buffer[MAX_BLOCK_SIZE]; /* buffer for reading */
104 unsigned char *m_bufp; /* pointer to next byte in buffer */
105
106 // input stream
107 wxInputStream *m_f; /* input stream */
108
109 private:
110 int getcode(int bits, int abfin);
111 int dgif(GIFImage *img, int interl, int bits);
112
113 public:
114 // get data of current frame
115 int GetFrameIndex() const;
116 unsigned char* GetData() const;
117 unsigned char* GetPalette() const;
118 unsigned int GetNcolours() const;
119 unsigned int GetWidth() const;
120 unsigned int GetHeight() const;
121 unsigned int GetLeft() const;
122 unsigned int GetTop() const;
123 int GetDisposalMethod() const;
124 int GetTransparentColour() const;
125 long GetDelay() const;
126
127 // get global data
128 unsigned int GetLogicalScreenWidth() const;
129 unsigned int GetLogicalScreenHeight() const;
130 int GetBackgroundColour() const;
131 int GetNumberOfFrames() const;
132 bool IsAnimation() const;
133
134 // move through the animation
135 bool GoFirstFrame();
136 bool GoLastFrame();
137 bool GoNextFrame(bool cyclic = false);
138 bool GoPrevFrame(bool cyclic = false);
139 bool GoFrame(int which);
140
141 public:
142 // constructor, destructor, etc.
143 wxGIFDecoder(wxInputStream *s, bool anim = false);
144 ~wxGIFDecoder();
145 bool CanRead();
146 int ReadGIF();
147 void Destroy();
148
149 // convert current frame to wxImage
150 bool ConvertToImage(wxImage *image) const;
151
152 DECLARE_NO_COPY_CLASS(wxGIFDecoder)
153 };
154
155
156 #endif // wxUSE_STREAM && wxUSE_GIF
157 #endif // _WX_GIFDECOD_H
158