Now wxGIFDecoder always tries to read to the end of the GIF data.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6131 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -24,10 +24,26 @@
|
|||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// constants
|
// Constants
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
// disposal method
|
// 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. the
|
||||||
|
//
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
wxGIF_OK = 0, /* everything was OK */
|
||||||
|
wxGIF_INVFORMAT, /* error in gif header */
|
||||||
|
wxGIF_MEMERR, /* error allocating memory */
|
||||||
|
wxGIF_TRUNCATED /* file appears to be truncated */
|
||||||
|
};
|
||||||
|
|
||||||
|
// Disposal method
|
||||||
|
// Experimental; subject to change.
|
||||||
|
//
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
wxGIF_D_UNSPECIFIED = -1, /* not specified */
|
wxGIF_D_UNSPECIFIED = -1, /* not specified */
|
||||||
@@ -36,13 +52,6 @@ enum
|
|||||||
wxGIF_D_TOPREVIOUS = 2 /* restore to previous image */
|
wxGIF_D_TOPREVIOUS = 2 /* restore to previous image */
|
||||||
};
|
};
|
||||||
|
|
||||||
// error codes
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
wxGIF_OK = 0, /* everything was OK */
|
|
||||||
wxGIF_INVFORMAT = 1, /* error in gif header */
|
|
||||||
wxGIF_MEMERR = 2 /* error allocating memory */
|
|
||||||
};
|
|
||||||
|
|
||||||
#define MAX_BLOCK_SIZE 256 /* max. block size */
|
#define MAX_BLOCK_SIZE 256 /* max. block size */
|
||||||
|
|
||||||
|
@@ -461,7 +461,7 @@ bool wxGIFDecoder::CanRead()
|
|||||||
// animated GIF support is enabled. Can read GIFs with any bit
|
// animated GIF support is enabled. Can read GIFs with any bit
|
||||||
// size (color depth), but the output images are always expanded
|
// size (color depth), but the output images are always expanded
|
||||||
// to 8 bits per pixel. Also, the image palettes always contain
|
// to 8 bits per pixel. Also, the image palettes always contain
|
||||||
// 256 colors, although some of them may be unused. Returns GIF_OK
|
// 256 colors, although some of them may be unused. Returns wxGIF_OK
|
||||||
// (== 0) on success, or an error code if something fails (see
|
// (== 0) on success, or an error code if something fails (see
|
||||||
// header file for details)
|
// header file for details)
|
||||||
//
|
//
|
||||||
@@ -479,7 +479,7 @@ int wxGIFDecoder::ReadGIF()
|
|||||||
if (!CanRead())
|
if (!CanRead())
|
||||||
return wxGIF_INVFORMAT;
|
return wxGIF_INVFORMAT;
|
||||||
|
|
||||||
/* check for and animated GIF support (ver. >= 89a) */
|
/* check for animated GIF support (ver. >= 89a) */
|
||||||
m_f->Read(buf, 6);
|
m_f->Read(buf, 6);
|
||||||
|
|
||||||
if (memcmp(buf + 3, "89a", 3) < 0)
|
if (memcmp(buf + 3, "89a", 3) < 0)
|
||||||
@@ -509,20 +509,18 @@ int wxGIFDecoder::ReadGIF()
|
|||||||
pprev = NULL;
|
pprev = NULL;
|
||||||
pimg = NULL;
|
pimg = NULL;
|
||||||
|
|
||||||
#if defined(__VISAGECPP__)
|
bool done = FALSE;
|
||||||
// VA just can't stand while(1)
|
|
||||||
bool bOs2var = TRUE;
|
while(!done)
|
||||||
while(bOs2var)
|
|
||||||
#else
|
|
||||||
while (1)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
type = (unsigned char)m_f->GetC();
|
type = (unsigned char)m_f->GetC();
|
||||||
|
|
||||||
/* end of data? */
|
/* end of data? */
|
||||||
if (type == 0x3B)
|
if (type == 0x3B)
|
||||||
break;
|
{
|
||||||
|
done = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
/* extension block? */
|
/* extension block? */
|
||||||
if (type == 0x21)
|
if (type == 0x21)
|
||||||
{
|
{
|
||||||
@@ -546,18 +544,11 @@ int wxGIFDecoder::ReadGIF()
|
|||||||
{
|
{
|
||||||
while ((i = (unsigned char)m_f->GetC()) != 0)
|
while ((i = (unsigned char)m_f->GetC()) != 0)
|
||||||
{
|
{
|
||||||
/* This line should not be neccessary!
|
|
||||||
* Some images are not loaded correctly
|
|
||||||
* without it. A bug in wxStream?
|
|
||||||
* Yes. Fixed now.
|
|
||||||
*/
|
|
||||||
// m_f->SeekI(m_f->TellI(), wxFromStart);
|
|
||||||
|
|
||||||
m_f->SeekI(i, wxFromCurrent);
|
m_f->SeekI(i, wxFromCurrent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
/* image descriptor block? */
|
/* image descriptor block? */
|
||||||
if (type == 0x2C)
|
if (type == 0x2C)
|
||||||
{
|
{
|
||||||
@@ -611,16 +602,15 @@ int wxGIFDecoder::ReadGIF()
|
|||||||
|
|
||||||
/* decode image */
|
/* decode image */
|
||||||
dgif(pimg, interl, bits);
|
dgif(pimg, interl, bits);
|
||||||
|
|
||||||
m_nimages++;
|
m_nimages++;
|
||||||
}
|
|
||||||
|
|
||||||
/* if we have one image and no animated GIF support, exit */
|
/* if this is not an animated GIF, exit after first image */
|
||||||
if (m_nimages == 1 && !m_anim)
|
if (!m_anim)
|
||||||
break;
|
done = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* finish successfully :-) */
|
/* setup image pointers */
|
||||||
if (m_nimages != 0)
|
if (m_nimages != 0)
|
||||||
{
|
{
|
||||||
m_image = 1;
|
m_image = 1;
|
||||||
@@ -628,6 +618,50 @@ int wxGIFDecoder::ReadGIF()
|
|||||||
m_pimage = m_pfirst;
|
m_pimage = m_pfirst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* try to read to the end of the stream */
|
||||||
|
while (type != 0x3B)
|
||||||
|
{
|
||||||
|
type = (unsigned char)m_f->GetC();
|
||||||
|
|
||||||
|
if (type == 0x21)
|
||||||
|
{
|
||||||
|
/* extension type */
|
||||||
|
(void) m_f->GetC();
|
||||||
|
|
||||||
|
/* skip all data */
|
||||||
|
while ((i = (unsigned char)m_f->GetC()) != 0)
|
||||||
|
{
|
||||||
|
m_f->SeekI(i, wxFromCurrent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type == 0x2C)
|
||||||
|
{
|
||||||
|
/* image descriptor block */
|
||||||
|
m_f->Read(buf, 9);
|
||||||
|
|
||||||
|
/* local color map */
|
||||||
|
if ((buf[8] & 0x80) == 0x80)
|
||||||
|
{
|
||||||
|
ncolors = 2 << (buf[8] & 0x07);
|
||||||
|
m_f->Read(pal, 3 * ncolors);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initial code size */
|
||||||
|
(void) m_f->GetC();
|
||||||
|
|
||||||
|
/* skip all data */
|
||||||
|
while ((i = (unsigned char)m_f->GetC()) != 0)
|
||||||
|
{
|
||||||
|
m_f->SeekI(i, wxFromCurrent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (type != 0x3B)
|
||||||
|
{
|
||||||
|
/* images are OK, but couldn't read to the end of the stream */
|
||||||
|
return wxGIF_TRUNCATED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return wxGIF_OK;
|
return wxGIF_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -45,22 +45,35 @@ bool wxGIFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose
|
|||||||
bool ok;
|
bool ok;
|
||||||
|
|
||||||
decod = new wxGIFDecoder(&stream, TRUE);
|
decod = new wxGIFDecoder(&stream, TRUE);
|
||||||
|
error = decod->ReadGIF();
|
||||||
|
|
||||||
if ((error = decod->ReadGIF()) != wxGIF_OK)
|
if ((error != wxGIF_OK) && (error != wxGIF_TRUNCATED))
|
||||||
{
|
{
|
||||||
if (verbose)
|
if (verbose)
|
||||||
{
|
{
|
||||||
switch (error)
|
switch (error)
|
||||||
{
|
{
|
||||||
case wxGIF_INVFORMAT: wxLogError(_("wxGIFHandler: error in GIF image format")); break;
|
case wxGIF_INVFORMAT:
|
||||||
case wxGIF_MEMERR: wxLogError(_("wxGIFHandler: couldn't allocate enough memory")); break;
|
wxLogError(_("wxGIFHandler: error in GIF image format."));
|
||||||
default: wxLogError(_("wxGIFHandler: unknown error !!!"));
|
break;
|
||||||
|
case wxGIF_MEMERR:
|
||||||
|
wxLogError(_("wxGIFHandler: not enough memory."));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
wxLogError(_("wxGIFHandler: unknown error!!!"));
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete decod;
|
delete decod;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((error == wxGIF_TRUNCATED) && verbose)
|
||||||
|
{
|
||||||
|
wxLogWarning(_("wxGIFHandler: data stream seems to be truncated."));
|
||||||
|
/* go on; image data is OK */
|
||||||
|
}
|
||||||
|
|
||||||
image->Destroy();
|
image->Destroy();
|
||||||
ok = decod->ConvertToImage(image);
|
ok = decod->ConvertToImage(image);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user