]> git.saurik.com Git - wxWidgets.git/blame_incremental - include/wx/gifdecod.h
Digital Mars needs CCS_RIGHT
[wxWidgets.git] / include / wx / gifdecod.h
... / ...
CommitLineData
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
23class /*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//
36enum 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
51class WXDLLEXPORT wxGIFDecoder : public wxAnimationDecoder
52{
53private:
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
65private:
66 int getcode(wxInputStream& stream, int bits, int abfin);
67 wxGIFErrorCode dgif(wxInputStream& stream, GIFImage *img, int interl, int bits);
68
69public:
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
86public:
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
97public: // 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
110private:
111 DECLARE_NO_COPY_CLASS(wxGIFDecoder)
112};
113
114
115#endif // wxUSE_STREAM && wxUSE_GIF
116#endif // _WX_GIFDECOD_H
117