/////////////////////////////////////////////////////////////////////////////
-// Name: imagpcx.cpp
+// Name: src/common/imagpcx.cpp
// Purpose: wxImage PCX handler
// Author: Guillermo Rodriguez Garcia <guille@iies.es>
// Version: 1.1
#include "wx/wxprec.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
+#if wxUSE_IMAGE && wxUSE_PCX
+
#ifndef WX_PRECOMP
-# include "wx/defs.h"
-# include "wx/palette.h"
+ #include "wx/object.h"
+ #include "wx/list.h"
+ #include "wx/log.h"
+ #include "wx/intl.h"
+ #include "wx/palette.h"
+ #include "wx/hash.h"
+ #include "wx/module.h"
#endif
-#if wxUSE_IMAGE && wxUSE_PCX
-
#include "wx/imagpcx.h"
#include "wx/wfstream.h"
-#include "wx/module.h"
-#include "wx/log.h"
-#include "wx/intl.h"
-
-#include "wx/hash.h"
-#include "wx/list.h"
-#include "wx/object.h"
//-----------------------------------------------------------------------------
// wxPCXHandler
void RLEdecode(unsigned char *p, unsigned int size, wxInputStream& s)
{
- unsigned int i, data, cont;
-
// Read 'size' bytes. The PCX official specs say there will be
// a decoding break at the end of each scanline (but not at the
// end of each plane inside a scanline). Only use this function
// to read one or more _complete_ scanlines. Else, more than
// 'size' bytes might be read and the buffer might overflow.
- while (size > 0)
+ while (size != 0)
{
- data = (unsigned char)s.GetC();
+ unsigned int data = (unsigned char)s.GetC();
// If ((data & 0xC0) != 0xC0), then the value read is a data
// byte. Else, it is a counter (cont = val & 0x3F) and the
}
else
{
- cont = data & 0x3F;
+ unsigned int cont = data & 0x3F;
+ if (cont > size) // can happen only if the file is malformed
+ break;
data = (unsigned char)s.GetC();
- for (i = 1; i <= cont; i++)
+ for (unsigned int i = 1; i <= cont; i++)
*(p++) = (unsigned char)data;
size -= cont;
}
#endif // wxUSE_STREAMS
#endif // wxUSE_IMAGE && wxUSE_PCX
-