#include <stdlib.h>
#include <string.h>
#include "wx/gifdecod.h"
+#include "wx/ptr_scpd.h"
+#include "wx/scopeguard.h"
DECLARE_NO_COPY_CLASS(GIFImage)
};
+wxDECLARE_SCOPED_PTR(GIFImage, GIFImagePtr)
+wxDEFINE_SCOPED_PTR(GIFImage, GIFImagePtr)
//---------------------------------------------------------------------------
// create the image
wxSize sz = GetFrameSize(frame);
image->Create(sz.GetWidth(), sz.GetHeight());
+ image->SetType(wxBITMAP_TYPE_GIF);
if (!image->Ok())
return false;
// Get data for current frame
-wxSize wxGIFDecoder::GetFrameSize(unsigned int frame) const
+wxSize wxGIFDecoder::GetFrameSize(unsigned int frame) const
{
return wxSize(GetFrame(frame)->w, GetFrame(frame)->h);
}
wxGIFErrorCode wxGIFDecoder::LoadGIF(wxInputStream& stream)
{
unsigned int global_ncolors = 0;
- int bits, interl, transparent, i;
+ int bits, interl, i;
wxAnimationDisposal disposal;
long size;
long delay;
}
// transparent colour, disposal method and delay default to unused
- transparent = -1;
+ int transparent = -1;
disposal = wxANIM_UNSPECIFIED;
delay = -1;
delay = 10 * (buf[2] + 256 * buf[3]);
// read transparent colour index, if used
- if (buf[1] & 0x01)
- transparent = buf[4];
+ transparent = buf[1] & 0x01 ? buf[4] : -1;
// read disposal method
disposal = (wxAnimationDisposal)(((buf[1] & 0x1C) >> 2) - 1);
if (type == 0x2C)
{
// allocate memory for IMAGEN struct
- GIFImage *pimg = new GIFImage();
+ GIFImagePtr pimg(new GIFImage());
- if (pimg == NULL)
- {
- Destroy();
+ wxScopeGuard guardDestroy = wxMakeObjGuard(*this, &wxGIFDecoder::Destroy);
+
+ if ( !pimg.get() )
return wxGIF_MEMERR;
- }
// fill in the data
static const unsigned int idbSize = (2 + 2 + 2 + 2 + 1);
stream.Read(buf, idbSize);
if (stream.LastRead() != idbSize)
- {
- Destroy();
return wxGIF_INVFORMAT;
- }
pimg->left = buf[0] + 256 * buf[1];
pimg->top = buf[2] + 256 * buf[3];
pimg->w = buf[4] + 256 * buf[5];
pimg->h = buf[6] + 256 * buf[7];
- if (anim && ((pimg->w == 0) || (pimg->w > (unsigned int)m_szAnimation.GetWidth()) ||
- (pimg->h == 0) || (pimg->h > (unsigned int)m_szAnimation.GetHeight())))
- {
- Destroy();
+ if ( anim && ((pimg->w == 0) || (pimg->w > (unsigned int)m_szAnimation.GetWidth()) ||
+ (pimg->h == 0) || (pimg->h > (unsigned int)m_szAnimation.GetHeight())) )
return wxGIF_INVFORMAT;
- }
interl = ((buf[8] & 0x40)? 1 : 0);
size = pimg->w * pimg->h;
pimg->pal = (unsigned char *) malloc(768);
if ((!pimg->p) || (!pimg->pal))
- {
- Destroy();
return wxGIF_MEMERR;
- }
// load local color map if available, else use global map
if ((buf[8] & 0x80) == 0x80)
stream.Read(pimg->pal, numBytes);
pimg->ncolours = local_ncolors;
if (stream.LastRead() != numBytes)
- {
- Destroy();
return wxGIF_INVFORMAT;
- }
}
else
{
// get initial code size from first byte in raster data
bits = (unsigned char)stream.GetC();
if (bits == 0)
- {
- Destroy();
return wxGIF_INVFORMAT;
- }
// decode image
- wxGIFErrorCode result = dgif(stream, pimg, interl, bits);
+ wxGIFErrorCode result = dgif(stream, pimg.get(), interl, bits);
if (result != wxGIF_OK)
- {
- Destroy();
return result;
- }
+
+ guardDestroy.Dismiss();
// add the image to our frame array
- m_frames.Add((void*)pimg);
+ m_frames.Add(pimg.release());
m_nFrames++;
// if this is not an animated GIF, exit after first image