1 /////////////////////////////////////////////////////////////////////////////
2 // Name: wx/animdecod.h
3 // Purpose: wxAnimationDecoder
4 // Author: Francesco Montorsi
6 // Copyright: (c) 2006 Francesco Montorsi
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
10 #ifndef _WX_ANIMDECOD_H
11 #define _WX_ANIMDECOD_H
17 #include "wx/colour.h"
18 #include "wx/gdicmn.h"
20 #include "wx/stream.h"
22 class WXDLLIMPEXP_FWD_CORE wxImage
;
26 Differences between a wxAnimationDecoder and a wxImageHandler:
28 1) wxImageHandlers always load an input stream directly into a given wxImage
29 object converting from the format-specific data representation to the
30 wxImage native format (RGB24).
31 wxAnimationDecoders always load an input stream using some optimized format
32 to store it which is format-depedent. This allows to store a (possibly big)
33 animation using a format which is a good compromise between required memory
34 and time required to blit it on the screen.
36 2) wxAnimationDecoders contain the animation data in some internal variable.
37 That's why they derive from wxObjectRefData: they are data which can be shared.
39 3) wxAnimationDecoders can be used by a wxImageHandler to retrieve a frame
40 in wxImage format; the viceversa cannot be done.
42 4) wxAnimationDecoders are decoders only, thus they do not support save features.
44 5) wxAnimationDecoders are directly used by wxAnimation (generic implementation)
45 as wxObjectRefData while they need to be 'wrapped' by a wxImageHandler for
51 // --------------------------------------------------------------------------
53 // --------------------------------------------------------------------------
55 // NB: the values of these enum items are not casual but coincide with the
56 // GIF disposal codes. Do not change them !!
57 enum wxAnimationDisposal
59 // No disposal specified. The decoder is not required to take any action.
60 wxANIM_UNSPECIFIED
= -1,
62 // Do not dispose. The graphic is to be left in place.
63 wxANIM_DONOTREMOVE
= 0,
65 // Restore to background color. The area used by the graphic must be
66 // restored to the background color.
67 wxANIM_TOBACKGROUND
= 1,
69 // Restore to previous. The decoder is required to restore the area
70 // overwritten by the graphic with what was there prior to rendering the graphic.
76 wxANIMATION_TYPE_INVALID
,
84 // --------------------------------------------------------------------------
85 // wxAnimationDecoder class
86 // --------------------------------------------------------------------------
88 class WXDLLIMPEXP_CORE wxAnimationDecoder
: public wxObjectRefData
96 virtual bool Load( wxInputStream
& stream
) = 0;
98 bool CanRead( wxInputStream
& stream
) const
100 // NOTE: this code is the same of wxImageHandler::CallDoCanRead
102 if ( !stream
.IsSeekable() )
103 return false; // can't test unseekable stream
105 wxFileOffset posOld
= stream
.TellI();
106 bool ok
= DoCanRead(stream
);
108 // restore the old position to be able to test other formats and so on
109 if ( stream
.SeekI(posOld
) == wxInvalidOffset
)
111 wxLogDebug(wxT("Failed to rewind the stream in wxAnimationDecoder!"));
113 // reading would fail anyhow as we're not at the right position
120 virtual wxAnimationDecoder
*Clone() const = 0;
121 virtual wxAnimationType
GetType() const = 0;
123 // convert given frame to wxImage
124 virtual bool ConvertToImage(unsigned int frame
, wxImage
*image
) const = 0;
127 // frame specific data getters
129 // not all frames may be of the same size; e.g. GIF allows to
130 // specify that between two frames only a smaller portion of the
131 // entire animation has changed.
132 virtual wxSize
GetFrameSize(unsigned int frame
) const = 0;
134 // the position of this frame in case it's not as big as m_szAnimation
135 // or wxPoint(0,0) otherwise.
136 virtual wxPoint
GetFramePosition(unsigned int frame
) const = 0;
138 // what should be done after displaying this frame.
139 virtual wxAnimationDisposal
GetDisposalMethod(unsigned int frame
) const = 0;
141 // the number of milliseconds this frame should be displayed.
142 // if returns -1 then the frame must be displayed forever.
143 virtual long GetDelay(unsigned int frame
) const = 0;
145 // the transparent colour for this frame if any or wxNullColour.
146 virtual wxColour
GetTransparentColour(unsigned int frame
) const = 0;
149 wxSize
GetAnimationSize() const { return m_szAnimation
; }
150 wxColour
GetBackgroundColour() const { return m_background
; }
151 unsigned int GetFrameCount() const { return m_nFrames
; }
154 // checks the signature of the data in the given stream and returns true if it
155 // appears to be a valid animation format recognized by the animation decoder;
156 // this function should modify the stream current position without taking care
157 // of restoring it since CanRead() will do it.
158 virtual bool DoCanRead(wxInputStream
& stream
) const = 0;
160 wxSize m_szAnimation
;
161 unsigned int m_nFrames
;
163 // this is the colour to use for the wxANIM_TOBACKGROUND disposal.
164 // if not specified by the animation, it's set to wxNullColour
165 wxColour m_background
;
168 #endif // wxUSE_STREAMS
170 #endif // _WX_ANIMDECOD_H