added IO errors handling to TGA reading code
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@45161 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
parent
853c39d78b
commit
8fee630648
@ -39,9 +39,10 @@
|
||||
// TGA error codes.
|
||||
enum
|
||||
{
|
||||
wxTGA_OK = 0,
|
||||
wxTGA_INVFORMAT = 1,
|
||||
wxTGA_MEMERR = 2
|
||||
wxTGA_OK,
|
||||
wxTGA_INVFORMAT,
|
||||
wxTGA_MEMERR,
|
||||
wxTGA_IOERR
|
||||
};
|
||||
|
||||
// TGA header bytes.
|
||||
@ -100,8 +101,9 @@ void FlipTGA(unsigned char* imageData, int width, int height, short pixelSize)
|
||||
}
|
||||
}
|
||||
|
||||
// return wxTGA_OK or wxTGA_IOERR
|
||||
static
|
||||
void DecodeRLE(unsigned char* imageData, unsigned long imageSize,
|
||||
int DecodeRLE(unsigned char* imageData, unsigned long imageSize,
|
||||
short pixelSize, wxInputStream& stream)
|
||||
{
|
||||
unsigned long index = 0;
|
||||
@ -111,7 +113,11 @@ void DecodeRLE(unsigned char* imageData, unsigned long imageSize,
|
||||
|
||||
while (index < imageSize)
|
||||
{
|
||||
current = stream.GetC();
|
||||
int ch = stream.GetC();
|
||||
if ( ch == wxEOF )
|
||||
return wxTGA_IOERR;
|
||||
|
||||
current = ch;
|
||||
|
||||
// RLE packet.
|
||||
if ( current & 0x80 )
|
||||
@ -126,7 +132,8 @@ void DecodeRLE(unsigned char* imageData, unsigned long imageSize,
|
||||
index += current * pixelSize;
|
||||
|
||||
// Repeat the pixel length times.
|
||||
stream.Read(buf, pixelSize);
|
||||
if ( !stream.Read(buf, pixelSize) )
|
||||
return wxTGA_IOERR;
|
||||
|
||||
for (unsigned int i = 0; i < length; i++)
|
||||
{
|
||||
@ -145,11 +152,14 @@ void DecodeRLE(unsigned char* imageData, unsigned long imageSize,
|
||||
index += length;
|
||||
|
||||
// Write the next length pixels directly to the image data.
|
||||
stream.Read(imageData, length);
|
||||
if ( !stream.Read(imageData, length) )
|
||||
return wxTGA_IOERR;
|
||||
|
||||
imageData += length;
|
||||
}
|
||||
}
|
||||
|
||||
return wxTGA_OK;
|
||||
}
|
||||
|
||||
static
|
||||
@ -442,7 +452,9 @@ int ReadTGA(wxImage* image, wxInputStream& stream)
|
||||
|
||||
// Decode the RLE data.
|
||||
|
||||
DecodeRLE(imageData, imageSize, pixelSize, stream);
|
||||
int rc = DecodeRLE(imageData, imageSize, pixelSize, stream);
|
||||
if ( rc != wxTGA_OK )
|
||||
return rc;
|
||||
|
||||
// If orientation == 0, then the image is stored upside down.
|
||||
// We need to store it right side up.
|
||||
@ -500,7 +512,9 @@ int ReadTGA(wxImage* image, wxInputStream& stream)
|
||||
{
|
||||
// Decode the RLE data.
|
||||
|
||||
DecodeRLE(imageData, imageSize, pixelSize, stream);
|
||||
int rc = DecodeRLE(imageData, imageSize, pixelSize, stream);
|
||||
if ( rc != wxTGA_OK )
|
||||
return rc;
|
||||
|
||||
// If orientation == 0, then the image is stored upside down.
|
||||
// We need to store it right side up.
|
||||
@ -578,7 +592,9 @@ int ReadTGA(wxImage* image, wxInputStream& stream)
|
||||
{
|
||||
// Decode the RLE data.
|
||||
|
||||
DecodeRLE(imageData, imageSize, pixelSize, stream);
|
||||
int rc = DecodeRLE(imageData, imageSize, pixelSize, stream);
|
||||
if ( rc != wxTGA_OK )
|
||||
return rc;
|
||||
|
||||
// If orientation == 0, then the image is stored upside down.
|
||||
// We need to store it right side up.
|
||||
@ -674,6 +690,10 @@ bool wxTGAHandler::LoadFile(wxImage* image,
|
||||
wxLogError(wxT("TGA: couldn't allocate memory."));
|
||||
break;
|
||||
|
||||
case wxTGA_IOERR:
|
||||
wxLogError(wxT("TGA: couldn't read image data."));
|
||||
break;
|
||||
|
||||
default:
|
||||
wxLogError(wxT("TGA: unknown error!"));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user