-
- free(data);
- png_write_end( png_ptr, info_ptr );
- png_destroy_write_struct( &png_ptr, (png_infopp)&info_ptr );
- }
- return TRUE;
-}
-
-#endif
-
- // wxUSE_LIBPNG
-
-//-----------------------------------------------------------------------------
-// wxBMPHandler
-//-----------------------------------------------------------------------------
-
-#if !USE_SHARED_LIBRARIES
-IMPLEMENT_DYNAMIC_CLASS(wxBMPHandler,wxImageHandler)
-#endif
-
-bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream )
-{
- unsigned char *data, *ptr;
- int done, i, bpp, planes, comp, ncolors, line, column,
- linesize, linepos, rshift = 0, gshift = 0, bshift = 0;
- unsigned char aByte;
- short int word;
- long int dbuf[4], dword, rmask = 0, gmask = 0, bmask = 0, offset,
- size;
- off_t start_offset = stream.TellI();
- signed char bbuf[4];
- struct _cmap
- {
- unsigned char r, g, b;
- }
- *cmap = NULL;
-#ifndef BI_RGB
-#define BI_RGB 0
-#define BI_RLE8 1
-#define BI_RLE4 2
-#endif
-
-#ifndef BI_BITFIELDS
-#define BI_BITFIELDS 3
-#endif
-
- image->Destroy();
-
- done = 0;
- /*
- * Reading the bmp header
- */
-
- stream.Read(&bbuf, 2);
-
- stream.Read(dbuf, 4 * 4);
-
- size = dbuf[0];
- offset = dbuf[2];
-
- stream.Read(dbuf, 4 * 2);
- int width = (int)dbuf[0];
- int height = (int)dbuf[1];
- if (width > 32767)
- {
- wxLogError( "Image width > 32767 pixels for file\n" );
- return FALSE;
- }
- if (height > 32767)
- {
- wxLogError( "Image height > 32767 pixels for file\n" );
- return FALSE;
- }
- stream.Read(&word, 2);
- planes = (int)word;
- stream.Read(&word, 2);
- bpp = (int)word;
- if (bpp != 1 && bpp != 4 && bpp != 8 && bpp && 16 && bpp != 24 && bpp != 32)
- {
- wxLogError( "unknown bitdepth in file\n" );
- return FALSE;
- }
- stream.Read(dbuf, 4 * 4);
- comp = (int)dbuf[0];
- if (comp != BI_RGB && comp != BI_RLE4 && comp != BI_RLE8 && comp != BI_BITFIELDS)
- {
- wxLogError( "unknown encoding in Windows BMP file\n" );
- return FALSE;
- }
- stream.Read(dbuf, 4 * 2);
- ncolors = (int)dbuf[0];
- if (ncolors == 0)
- ncolors = 1 << bpp;
- /* some more sanity checks */
- if (((comp == BI_RLE4) && (bpp != 4)) || ((comp == BI_RLE8) && (bpp != 8)) || ((comp == BI_BITFIELDS) && (bpp != 16 && bpp != 32)))
- {
- wxLogError( "encoding of BMP doesn't match bitdepth\n" );
- return FALSE;
- }
- if (bpp < 16)
- {
- cmap = (struct _cmap *)malloc(sizeof(struct _cmap) * ncolors);
-
- if (!cmap)
- {
- wxLogError( "Cannot allocate RAM for color map in BMP file\n" );
- return FALSE;
- }
- }
- else
- cmap = NULL;
-
- image->Create( width, height );
- ptr = image->GetData();
- if (!ptr)
- {
- wxLogError( "Cannot allocate RAM for RGB data in file\n" );
- if (cmap)
- free(cmap);
- return FALSE;
- }
-
- /*
- * Reading the palette, if it exists.
- */
- if (bpp < 16 && ncolors != 0)
- {
- for (i = 0; i < ncolors; i++)
- {
- stream.Read(bbuf, 4);
- cmap[i].b = bbuf[0];
- cmap[i].g = bbuf[1];
- cmap[i].r = bbuf[2];
- }
- }
- else if (bpp == 16 || bpp == 32)
- {
- if (comp == BI_BITFIELDS)
- {
- int bit = 0;
-
- stream.Read(dbuf, 4 * 3);
- bmask = dbuf[0];
- gmask = dbuf[1];
- rmask = dbuf[2];
- /* find shift amount.. ugly, but i can't think of a better way */
- for (bit = 0; bit < bpp; bit++)
- {
- if (bmask & (1 << bit))
- bshift = bit;
- if (gmask & (1 << bit))
- gshift = bit;
- if (rmask & (1 << bit))
- rshift = bit;
- }
- }
- else if (bpp == 16)
- {
- rmask = 0x7C00;
- gmask = 0x03E0;
- bmask = 0x001F;
- rshift = 10;
- gshift = 5;
- bshift = 0;
- }
- else if (bpp == 32)
- {
- rmask = 0x00FF0000;
- gmask = 0x0000FF00;
- bmask = 0x000000FF;
- rshift = 16;
- gshift = 8;
- bshift = 0;
- }
- }
-
- /*