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
{
wxGIF_D_UNSPECIFIED = -1, /* not specified */
@@ -36,13 +52,6 @@ enum
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 */

View File

@@ -461,7 +461,7 @@ bool wxGIFDecoder::CanRead()
// animated GIF support is enabled. Can read GIFs with any bit
// size (color depth), but the output images are always expanded
// 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
// header file for details)
//
@@ -479,7 +479,7 @@ int wxGIFDecoder::ReadGIF()
if (!CanRead())
return wxGIF_INVFORMAT;
/* check for and animated GIF support (ver. >= 89a) */
/* check for animated GIF support (ver. >= 89a) */
m_f->Read(buf, 6);
if (memcmp(buf + 3, "89a", 3) < 0)
@@ -509,20 +509,18 @@ int wxGIFDecoder::ReadGIF()
pprev = NULL;
pimg = NULL;
#if defined(__VISAGECPP__)
// VA just can't stand while(1)
bool bOs2var = TRUE;
while(bOs2var)
#else
while (1)
#endif
bool done = FALSE;
while(!done)
{
type = (unsigned char)m_f->GetC();
/* end of data? */
if (type == 0x3B)
break;
{
done = TRUE;
}
else
/* extension block? */
if (type == 0x21)
{
@@ -546,18 +544,11 @@ int wxGIFDecoder::ReadGIF()
{
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);
}
}
}
else
/* image descriptor block? */
if (type == 0x2C)
{
@@ -611,16 +602,15 @@ int wxGIFDecoder::ReadGIF()
/* decode image */
dgif(pimg, interl, bits);
m_nimages++;
}
/* if we have one image and no animated GIF support, exit */
if (m_nimages == 1 && !m_anim)
break;
/* if this is not an animated GIF, exit after first image */
if (!m_anim)
done = TRUE;
}
}
/* finish successfully :-) */
/* setup image pointers */
if (m_nimages != 0)
{
m_image = 1;
@@ -628,6 +618,50 @@ int wxGIFDecoder::ReadGIF()
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;
}

View File

@@ -45,22 +45,35 @@ bool wxGIFHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose
bool ok;
decod = new wxGIFDecoder(&stream, TRUE);
error = decod->ReadGIF();
if ((error = decod->ReadGIF()) != wxGIF_OK)
if ((error != wxGIF_OK) && (error != wxGIF_TRUNCATED))
{
if (verbose)
{
switch (error)
{
case wxGIF_INVFORMAT: wxLogError(_("wxGIFHandler: error in GIF image format")); break;
case wxGIF_MEMERR: wxLogError(_("wxGIFHandler: couldn't allocate enough memory")); break;
default: wxLogError(_("wxGIFHandler: unknown error !!!"));
case wxGIF_INVFORMAT:
wxLogError(_("wxGIFHandler: error in GIF image format."));
break;
case wxGIF_MEMERR:
wxLogError(_("wxGIFHandler: not enough memory."));
break;
default:
wxLogError(_("wxGIFHandler: unknown error!!!"));
break;
}
}
delete decod;
return FALSE;
}
if ((error == wxGIF_TRUNCATED) && verbose)
{
wxLogWarning(_("wxGIFHandler: data stream seems to be truncated."));
/* go on; image data is OK */
}
image->Destroy();
ok = decod->ConvertToImage(image);