Fix part of [ 1570325 ] wxAnimationCtrl for wxAdv library
[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 #include "wx/animdecod.h"
21
22 // internal utility used to store a frame in 8bit-per-pixel format
23 class /*WXDLLEXPORT*/ GIFImage;
24
25
26 // --------------------------------------------------------------------------
27 // Constants
28 // --------------------------------------------------------------------------
29
30 // Error codes:
31 // Note that the error code wxGIF_TRUNCATED means that the image itself
32 // is most probably OK, but the decoder didn't reach the end of the data
33 // stream; this means that if it was not reading directly from file,
34 // the stream will not be correctly positioned. the
35 //
36 enum wxGIFErrorCode
37 {
38 wxGIF_OK = 0, /* everything was OK */
39 wxGIF_INVFORMAT, /* error in gif header */
40 wxGIF_MEMERR, /* error allocating memory */
41 wxGIF_TRUNCATED /* file appears to be truncated */
42 };
43
44 #define MAX_BLOCK_SIZE 256 /* max. block size */
45
46
47 // --------------------------------------------------------------------------
48 // wxGIFDecoder class
49 // --------------------------------------------------------------------------
50
51 class WXDLLEXPORT wxGIFDecoder : public wxAnimationDecoder
52 {
53 private:
54 // a wxArray provides a constant access time rather than a linear time
55 // like for linked lists.
56 wxArrayPtrVoid m_frames;
57
58 // decoder state vars
59 int m_restbits; /* remaining valid bits */
60 unsigned int m_restbyte; /* remaining bytes in this block */
61 unsigned int m_lastbyte; /* last byte read */
62 unsigned char m_buffer[MAX_BLOCK_SIZE]; /* buffer for reading */
63 unsigned char *m_bufp; /* pointer to next byte in buffer */
64
65 private:
66 int getcode(wxInputStream& stream, int bits, int abfin);
67 wxGIFErrorCode dgif(wxInputStream& stream, GIFImage *img, int interl, int bits);
68
69 public:
70 // get data of current frame
71 unsigned char* GetData(size_t frame) const;
72 unsigned char* GetPalette(size_t frame) const;
73 unsigned int GetNcolours(size_t frame) const;
74 int GetTransparentColourIndex(size_t frame) const;
75 wxColour GetTransparentColour(size_t frame) const;
76
77 virtual wxSize GetFrameSize(size_t frame) const;
78 virtual wxPoint GetFramePosition(size_t frame) const;
79 virtual wxAnimationDisposal GetDisposalMethod(size_t frame) const;
80 virtual long GetDelay(size_t frame) const;
81
82 // GIFs can contain both static images and animations
83 bool IsAnimation() const
84 { return m_nFrames > 1; }
85
86 public:
87 // constructor, destructor, etc.
88 wxGIFDecoder();
89 ~wxGIFDecoder();
90
91 // load function which returns more info than just Load():
92 wxGIFErrorCode LoadGIF( wxInputStream& stream );
93
94 // free all internal frames
95 void Destroy();
96
97 public: // implementation of wxAnimationDecoder's pure virtuals
98
99 virtual bool CanRead( wxInputStream& stream ) const;
100 virtual bool Load( wxInputStream& stream )
101 { return LoadGIF(stream) == wxGIF_OK; }
102
103 bool ConvertToImage(size_t frame, wxImage *image) const;
104
105 wxAnimationDecoder *Clone() const
106 { return new wxGIFDecoder; }
107 wxAnimationType GetType() const
108 { return wxANIMATION_TYPE_GIF; }
109
110 private:
111 DECLARE_NO_COPY_CLASS(wxGIFDecoder)
112 };
113
114
115 #endif // wxUSE_STREAM && wxUSE_GIF
116 #endif // _WX_GIFDECOD_H
117