extern "C"
{
-void PNGLINKAGEMODE wx_PNG_stream_reader( png_structp png_ptr, png_bytep data,
- png_size_t length )
+static void PNGLINKAGEMODE wx_PNG_stream_reader( png_structp png_ptr, png_bytep data,
+ png_size_t length )
{
WX_PNG_INFO(png_ptr)->stream.in->Read(data, length);
}
-void PNGLINKAGEMODE wx_PNG_stream_writer( png_structp png_ptr, png_bytep data,
- png_size_t length )
+static void PNGLINKAGEMODE wx_PNG_stream_writer( png_structp png_ptr, png_bytep data,
+ png_size_t length )
{
WX_PNG_INFO(png_ptr)->stream.out->Write(data, length);
}
-void
+static void
PNGLINKAGEMODE wx_png_warning(png_structp png_ptr, png_const_charp message)
{
wxPNGInfoStruct *info = png_ptr ? WX_PNG_INFO(png_ptr) : NULL;
// from pngerror.c
// so that the libpng doesn't send anything on stderr
-void
+static void
PNGLINKAGEMODE wx_png_error(png_structp png_ptr, png_const_charp message)
{
wx_png_warning(NULL, message);
{
unsigned char hdr[4];
- if ( !stream.Read(hdr, WXSIZEOF(hdr)) )
+ if ( !stream.Read(hdr, WXSIZEOF(hdr)) ) // it's ok to modify the stream position here
return false;
return memcmp(hdr, "\211PNG", WXSIZEOF(hdr)) == 0;
if (!image->Ok())
goto error;
- lines = (unsigned char **)malloc( (size_t)(height * sizeof(unsigned char *)) );
+ // initialize all line pointers to NULL to ensure that they can be safely
+ // free()d if an error occurs before all of them could be allocated
+ lines = (unsigned char **)calloc(height, sizeof(unsigned char *));
if ( !lines )
goto error;
for (i = 0; i < height; i++)
{
if ((lines[i] = (unsigned char *)malloc( (size_t)(width * (sizeof(unsigned char) * 4)))) == NULL)
- {
- for ( unsigned int n = 0; n < i; n++ )
- free( lines[n] );
goto error;
- }
}
png_read_image( png_ptr, lines );
? image->GetOptionInt(wxIMAGE_OPTION_PNG_BITDEPTH)
: 8;
- wxASSERT_MSG( iBitDepth == 8 || iBitDepth == 16,
- _T("PNG bit depth must be 8 or 16") );
-
bool bHasAlpha = image->HasAlpha();
bool bHasMask = image->HasMask();
bool bUseAlpha = bHasAlpha || bHasMask;