///////////////////////////////////////////////////////////////////////////// // Name: wx/imaggif.h // Purpose: wxImage GIF handler // Author: Vaclav Slavik, Guillermo Rodriguez Garcia, Gershon Elber, Troels K // RCS-ID: $Id$ // Copyright: (c) 1999-2011 Vaclav Slavik, Guillermo Rodriguez Garcia, Gershon Elber, Troels K // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_IMAGGIF_H_ #define _WX_IMAGGIF_H_ #include "wx/image.h" //----------------------------------------------------------------------------- // wxGIFHandler //----------------------------------------------------------------------------- #if wxUSE_GIF struct wxRGB; struct GifHashTableType; class WXDLLIMPEXP_FWD_CORE wxImageArray; // anidecod.h class WXDLLIMPEXP_CORE wxGIFHandler : public wxImageHandler { public: inline wxGIFHandler() { m_name = wxT("GIF file"); m_extension = wxT("gif"); m_type = wxBITMAP_TYPE_GIF; m_mime = wxT("image/gif"); m_hashTable = NULL; } #if wxUSE_STREAMS virtual bool LoadFile(wxImage *image, wxInputStream& stream, bool verbose = true, int index = -1); virtual bool SaveFile(wxImage *image, wxOutputStream& stream, bool verbose=true); // Save animated gif bool SaveAnimation(const wxImageArray& images, wxOutputStream *stream, bool verbose = true, int delayMilliSecs = 1000, const wxString& comment = wxEmptyString); protected: virtual int DoGetImageCount(wxInputStream& stream); virtual bool DoCanRead(wxInputStream& stream); bool DoSaveFile(const wxImage&, wxOutputStream *, bool verbose, bool first, int delayMilliSecs, bool loop, const wxRGB *pal, int palCount, int mask_index, const wxString& comment = wxEmptyString); #endif // wxUSE_STREAMS protected: // Declarations for saving unsigned long m_crntShiftDWord; /* For bytes decomposition into codes. */ int m_pixelCount; struct GifHashTableType *m_hashTable; wxInt16 m_EOFCode, /* The EOF LZ code. */ m_clearCode, /* The CLEAR LZ code. */ m_runningCode, /* The next code algorithm can generate. */ m_runningBits, /* The number of bits required to represent RunningCode. */ m_maxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */ m_crntCode, /* Current algorithm code. */ m_crntShiftState; /* Number of bits in CrntShiftDWord. */ wxUint8 m_LZBuf[256]; /* Compressed input is buffered here. */ bool InitHashTable(); void ClearHashTable(); void InsertHashTable(unsigned long key, int code); int ExistsHashTable(unsigned long key); #if wxUSE_STREAMS bool CompressOutput(wxOutputStream *, int code); bool SetupCompress(wxOutputStream *, int bpp); bool CompressLine(wxOutputStream *, const wxUint8 *line, int lineLen); #endif public: static wxString ms_comment; private: DECLARE_DYNAMIC_CLASS(wxGIFHandler) }; #endif // wxUSE_GIF #endif // _WX_IMAGGIF_H_