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:
Guillermo Rodriguez Garcia
2000-02-17 23:39:35 +00:00
parent 80d83cbcc2
commit 8141573c1e
3 changed files with 94 additions and 38 deletions

View File

@@ -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 */

View File

@@ -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;
} }

View File

@@ -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);