X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/55a35cb0c14f75a05624182d08abd97876f7500f..23318a5358be74727fb62854f623da84a4545bcd:/src/common/imagbmp.cpp?ds=sidebyside diff --git a/src/common/imagbmp.cpp b/src/common/imagbmp.cpp index fc67b77313..4ba94c276e 100644 --- a/src/common/imagbmp.cpp +++ b/src/common/imagbmp.cpp @@ -33,6 +33,7 @@ #include "wx/filefn.h" #include "wx/wfstream.h" #include "wx/quantize.h" +#include "wx/scopeguard.h" #include "wx/anidecod.h" // For memcpy @@ -194,8 +195,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 = (wxUint32)(10*mm2inches*hres); + vres = (wxUint32)(10*mm2inches*vres); // fall through to convert it to resolution in meters case wxIMAGE_RESOLUTION_CM: @@ -469,10 +470,12 @@ 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, @@ -481,18 +484,18 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, { 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, abits = 0; + int rbits = 0, gbits = 0, bbits = 0; wxInt32 dbuf[4]; wxInt8 bbuf[4]; wxUint8 aByte; 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) @@ -500,8 +503,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(); @@ -513,7 +520,6 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, { if ( verbose ) wxLogError( _("BMP: Couldn't allocate memory.") ); - delete[] cmap; return false; } @@ -527,7 +533,6 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, { if ( verbose ) wxLogError(_("BMP: Couldn't allocate memory.")); - delete[] cmap; return false; } } @@ -626,7 +631,6 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, rshift = 16; gshift = 8; bshift = 0; - abits = 8; rbits = 8; gbits = 8; bbits = 8; @@ -879,8 +883,6 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height, } } - delete[] cmap; - image->SetMask(false); const wxStreamError err = stream.GetLastError();