]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/gifdecod.h
support retina display
[wxWidgets.git] / include / wx / gifdecod.h
index 35e073fdc898490f05a1c2ab2e302c18f5751acb..908f470ece38f3014b166ab3268ce58ab7775949 100644 (file)
 /////////////////////////////////////////////////////////////////////////////
-// Name:        gifdecod.h
+// Name:        wx/gifdecod.h
 // Purpose:     wxGIFDecoder, GIF reader for wxImage and wxAnimation
 // Author:      Guillermo Rodriguez Garcia <guille@iies.es>
 // Version:     3.02
-// Last rev:    1999/08/18
-// Copyright:   (c) Guillermo Rodriguez Garcia
+// CVS-ID:      $Id$
+// Copyright:   (c) 1999 Guillermo Rodriguez Garcia
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#ifndef _WX_GIFDECOD_H
-#define _WX_GIFDECOD_H
+#ifndef _WX_GIFDECOD_H_
+#define _WX_GIFDECOD_H_
 
-#ifdef __GNUG__
-#pragma interface "gifdecod.h"
-#endif
+#include "wx/defs.h"
 
-#include "wx/setup.h"
+#if wxUSE_STREAMS && wxUSE_GIF
 
-#if wxUSE_STREAMS
 #include "wx/stream.h"
 #include "wx/image.h"
+#include "wx/animdecod.h"
+#include "wx/dynarray.h"
 
+// internal utility used to store a frame in 8bit-per-pixel format
+class GIFImage;
 
-typedef struct _IMAGEN
-{
-    unsigned int w;                 /* width */
-    unsigned int h;                 /* height */
-    unsigned int left;              /* x coord (in logical screen) */
-    unsigned int top;               /* y coord (in logical screen) */
-    int transparent;                /* transparent color (-1 = none) */
-    int disposal;                   /* disposal method (-1 = unspecified) */
-    long delay;                     /* delay in ms (-1 = unused) */
-    unsigned char *p;               /* bitmap */
-    unsigned char *pal;             /* palette */
-    struct _IMAGEN *next;           /* next image */
-    struct _IMAGEN *prev;           /* prev image */
-} IMAGEN;
-
-
-/* disposal method */
-#define D_UNSPECIFIED   -1          /* not specified */
-#define D_DONOTDISPOSE  0           /* do not dispose */
-#define D_TOBACKGROUND  1           /* restore to background colour */
-#define D_TOPREVIOUS    2           /* restore to previous image */
-
-/* error codes */
-#define E_OK            0           /* everything was OK */
-#define E_ARCHIVO       -1          /* error opening file */
-#define E_FORMATO       -2          /* error in gif header */
-#define E_MEMORIA       -3          /* error allocating memory */
-
-
-class wxGIFDecoder
+
+// --------------------------------------------------------------------------
+// Constants
+// --------------------------------------------------------------------------
+
+// Error codes:
+//  Note that the error code wxGIF_TRUNCATED means that the image itself
+//  is most probably OK, but the decoder didn't reach the end of the data
+//  stream; this means that if it was not reading directly from file,
+//  the stream will not be correctly positioned.
+//
+enum wxGIFErrorCode
 {
-private:
-    /* logical screen */
-    unsigned int  m_screenw;        /* logical screen width */
-    unsigned int  m_screenh;        /* logical screen height */
-    int           m_background;     /* background color (-1 = none) */
-
-    /* image data */
-    bool          m_anim;           /* animated GIF */
-    int           m_nimages;        /* number of images */
-    int           m_image;          /* current image */
-    IMAGEN        *m_pimage;        /* pointer to current image */
-    IMAGEN        *m_pfirst;        /* pointer to first image */
-    IMAGEN        *m_plast;         /* pointer to last image */
-
-    /* decoder state vars */
-    int           m_restbits;       /* remaining valid bits */
-    unsigned int  m_restbyte;       /* remaining bytes in this block */
-    unsigned int  m_lastbyte;       /* last byte read */
-
-    wxInputStream *m_f;             /* input file */
+    wxGIF_OK = 0,                   // everything was OK
+    wxGIF_INVFORMAT,                // error in GIF header
+    wxGIF_MEMERR,                   // error allocating memory
+    wxGIF_TRUNCATED                 // file appears to be truncated
+};
 
-private:
-    int getcode(int bits, int abfin);
-    int dgif(IMAGEN *img, int interl, int bits);
+// --------------------------------------------------------------------------
+// wxGIFDecoder class
+// --------------------------------------------------------------------------
 
+class WXDLLIMPEXP_CORE wxGIFDecoder : public wxAnimationDecoder
+{
 public:
     // constructor, destructor, etc.
-    wxGIFDecoder(wxInputStream *s, bool anim = FALSE);
+    wxGIFDecoder();
     ~wxGIFDecoder();
-    bool CanRead();
-    int ReadGIF();
+
+    // get data of current frame
+    unsigned char* GetData(unsigned int frame) const;
+    unsigned char* GetPalette(unsigned int frame) const;
+    unsigned int GetNcolours(unsigned int frame) const;
+    int GetTransparentColourIndex(unsigned int frame) const;
+    wxColour GetTransparentColour(unsigned int frame) const;
+
+    virtual wxSize GetFrameSize(unsigned int frame) const;
+    virtual wxPoint GetFramePosition(unsigned int frame) const;
+    virtual wxAnimationDisposal GetDisposalMethod(unsigned int frame) const;
+    virtual long GetDelay(unsigned int frame) const;
+
+    // GIFs can contain both static images and animations
+    bool IsAnimation() const
+        { return m_nFrames > 1; }
+
+    // load function which returns more info than just Load():
+    wxGIFErrorCode LoadGIF( wxInputStream& stream );
+
+    // free all internal frames
     void Destroy();
 
-    // convert current frame to wxImage
-    bool ConvertToImage(wxImage *image) const;
+    // implementation of wxAnimationDecoder's pure virtuals
+    virtual bool Load( wxInputStream& stream )
+        { return LoadGIF(stream) == wxGIF_OK; }
 
-    // get data of current frame
-    int GetFrameIndex() const;
-    unsigned char* GetData() const;
-    unsigned char* GetPalette() const;
-    unsigned int GetWidth() const;
-    unsigned int GetHeight() const;
-    unsigned int GetLeft() const;
-    unsigned int GetTop() const;
-    int GetDisposalMethod() const;
-    int GetTransparentColour() const;
-    long GetDelay() const;
-
-    // get global data
-    unsigned int GetLogicalScreenWidth() const;
-    unsigned int GetLogicalScreenHeight() const;
-    int GetBackgroundColour() const;
-    int GetNumberOfFrames() const;
-    bool IsAnimation() const;
-
-    // move through the animation
-    bool GoFirstFrame();
-    bool GoLastFrame();
-    bool GoNextFrame(bool cyclic = FALSE);
-    bool GoPrevFrame(bool cyclic = FALSE);
-    bool GoFrame(int which);
-};
+    bool ConvertToImage(unsigned int frame, wxImage *image) const;
+
+    wxAnimationDecoder *Clone() const
+        { return new wxGIFDecoder; }
+    wxAnimationType GetType() const
+        { return wxANIMATION_TYPE_GIF; }
+
+private:
+    // wxAnimationDecoder pure virtual
+    virtual bool DoCanRead( wxInputStream& stream ) const;
+        // modifies current stream position (see wxAnimationDecoder::CanRead)
 
+    int getcode(wxInputStream& stream, int bits, int abfin);
+    wxGIFErrorCode dgif(wxInputStream& stream,
+                        GIFImage *img, int interl, int bits);
+
+
+    // array of all frames
+    wxArrayPtrVoid m_frames;
+
+    // decoder state vars
+    int           m_restbits;       // remaining valid bits
+    unsigned int  m_restbyte;       // remaining bytes in this block
+    unsigned int  m_lastbyte;       // last byte read
+    unsigned char m_buffer[256];    // buffer for reading
+    unsigned char *m_bufp;          // pointer to next byte in buffer
+
+    wxDECLARE_NO_COPY_CLASS(wxGIFDecoder);
+};
 
-#endif  // wxUSE_STREAM
-#endif  // _WX_GIFDECOD_H
+#endif // wxUSE_STREAMS && wxUSE_GIF
 
+#endif // _WX_GIFDECOD_H_