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