X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad91e1ade045fd9bc8ca7159aebf828d719e81ca..e408bf5257ead0754de5ef37a39867c7536dbe03:/src/common/imagbmp.cpp diff --git a/src/common/imagbmp.cpp b/src/common/imagbmp.cpp index ff95ab1374..72398fcda1 100644 --- a/src/common/imagbmp.cpp +++ b/src/common/imagbmp.cpp @@ -33,17 +33,12 @@ #include "wx/filefn.h" #include "wx/wfstream.h" #include "wx/quantize.h" +#include "wx/scopeguard.h" #include "wx/anidecod.h" // For memcpy #include -#ifdef __SALFORDC__ -#ifdef FAR -#undef FAR -#endif -#endif - //----------------------------------------------------------------------------- // wxBMPHandler //----------------------------------------------------------------------------- @@ -185,9 +180,8 @@ bool wxBMPHandler::SaveDib(wxImage *image, // get the resolution from the image options or fall back to 72dpi standard // for the BMP format if not specified - wxUint32 hres = image->GetOptionInt(wxIMAGE_OPTION_RESOLUTIONX), - vres = image->GetOptionInt(wxIMAGE_OPTION_RESOLUTIONY); - switch ( image->GetOptionInt(wxIMAGE_OPTION_RESOLUTION) ) + int hres, vres; + switch ( GetResolutionFromOptions(*image, &hres, &vres) ) { default: wxFAIL_MSG( _T("unexpected image resolution units") ); @@ -200,8 +194,8 @@ bool wxBMPHandler::SaveDib(wxImage *image, case wxIMAGE_RESOLUTION_INCHES: // convert resolution in inches to resolution in centimeters - hres = (wxUint32)(100*mm2inches*hres); - vres = (wxUint32)(100*mm2inches*vres); + hres = (int)(10*mm2inches*hres); + vres = (int)(10*mm2inches*vres); // fall through to convert it to resolution in meters case wxIMAGE_RESOLUTION_CM: @@ -475,18 +469,20 @@ bool wxBMPHandler::SaveDib(wxImage *image, } -typedef struct +struct BMPPalette { + static void Free(BMPPalette* pal) { delete [] pal; } + unsigned char r, g, b; -} _cmap; +}; bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, int bpp, int ncolors, int comp, wxFileOffset bmpOffset, wxInputStream& stream, bool verbose, bool IsBmp, bool hasPalette) { - wxInt32 aDword, rmask = 0, gmask = 0, bmask = 0; - int rshift = 0, gshift = 0, bshift = 0; + wxInt32 aDword, rmask = 0, gmask = 0, bmask = 0, amask = 0; + int rshift = 0, gshift = 0, bshift = 0, ashift = 0; int rbits = 0, gbits = 0, bbits = 0; wxInt32 dbuf[4]; wxInt8 bbuf[4]; @@ -494,11 +490,11 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, wxUint16 aWord; // allocate space for palette if needed: - _cmap *cmap; + BMPPalette *cmap; if ( bpp < 16 ) { - cmap = new _cmap[ncolors]; + cmap = new BMPPalette[ncolors]; if ( !cmap ) { if (verbose) @@ -506,8 +502,12 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, return false; } } - else + else // no palette + { cmap = NULL; + } + + wxON_BLOCK_EXIT1(&BMPPalette::Free, cmap); // destroy existing here instead of: image->Destroy(); @@ -519,11 +519,27 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, { if ( verbose ) wxLogError( _("BMP: Couldn't allocate memory.") ); - if ( cmap ) - delete[] cmap; return false; } + unsigned char *alpha; + if ( bpp == 32 ) + { + // tell the image to allocate an alpha buffer + image->SetAlpha(); + alpha = image->GetAlpha(); + if ( !alpha ) + { + if ( verbose ) + wxLogError(_("BMP: Couldn't allocate memory.")); + return false; + } + } + else // no alpha + { + alpha = NULL; + } + // Reading the palette, if it exists: if ( bpp < 16 && ncolors != 0 ) { @@ -608,6 +624,9 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, rmask = 0x00FF0000; gmask = 0x0000FF00; bmask = 0x000000FF; + amask = 0xFF000000; + + ashift = 24; rshift = 16; gshift = 8; bshift = 0; @@ -846,6 +865,11 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, ptr[poffset + 1] = temp; temp = (unsigned char)((aDword & bmask) >> bshift); ptr[poffset + 2] = temp; + if ( alpha ) + { + temp = (unsigned char)((aDword & amask) >> ashift); + alpha[line * width + column] = temp; + } column++; } } @@ -858,8 +882,6 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, } } - delete[] cmap; - image->SetMask(false); const wxStreamError err = stream.GetLastError();