X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f6bcfd974ef26faf6f91a62cac09827e09463fd1..fa8dca8dd1ba0d6ee9b2c5919a3a944ecde68a50:/src/common/imagbmp.cpp diff --git a/src/common/imagbmp.cpp b/src/common/imagbmp.cpp index 600d800ff9..e443eb4147 100644 --- a/src/common/imagbmp.cpp +++ b/src/common/imagbmp.cpp @@ -18,6 +18,10 @@ #pragma hdrstop #endif +#include "wx/defs.h" + +#if wxUSE_IMAGE + #include "wx/imagbmp.h" #include "wx/bitmap.h" #include "wx/debug.h" @@ -64,9 +68,9 @@ bool wxBMPHandler::SaveFile(wxImage *image, } unsigned width = image->GetWidth(); - unsigned row_width = width * 3 + + unsigned row_width = width * 3 + (((width % 4) == 0) ? 0 : (4 - (width * 3) % 4)); - // each row must be aligned to dwords + // each row must be aligned to dwords struct { // BitmapHeader: @@ -74,7 +78,7 @@ bool wxBMPHandler::SaveFile(wxImage *image, wxUint32 filesize; // total file size, inc. headers wxUint32 reserved; // for future use wxUint32 data_offset; // image data offset in the file - + // BitmapInfoHeader: wxUint32 bih_size; // 2nd part's size wxUint32 width, height; // bitmap's dimensions @@ -90,19 +94,19 @@ bool wxBMPHandler::SaveFile(wxImage *image, hdr.magic = wxUINT16_SWAP_ON_BE(0x4D42/*'BM'*/); hdr.filesize = wxUINT32_SWAP_ON_BE( - hdr_size + + hdr_size + row_width * image->GetHeight() ); hdr.reserved = 0; hdr.data_offset = wxUINT32_SWAP_ON_BE(hdr_size); - + hdr.bih_size = wxUINT32_SWAP_ON_BE(hdr_size - 14); hdr.width = wxUINT32_SWAP_ON_BE(image->GetWidth()); hdr.height = wxUINT32_SWAP_ON_BE(image->GetHeight()); hdr.planes = wxUINT16_SWAP_ON_BE(1); // always 1 plane hdr.bpp = wxUINT16_SWAP_ON_BE(24); // always TrueColor hdr.compression = 0; // RGB uncompressed - hdr.size_of_bmp = wxUINT32_SWAP_ON_BE(row_width * image->GetHeight()); + hdr.size_of_bmp = wxUINT32_SWAP_ON_BE(row_width * image->GetHeight()); hdr.h_res = hdr.v_res = wxUINT32_SWAP_ON_BE(72); // 72dpi is standard hdr.num_clrs = 0; // maximal possible = 2^24 hdr.num_signif_clrs = 0; // all colors are significant @@ -125,7 +129,7 @@ bool wxBMPHandler::SaveFile(wxImage *image, !stream.Write(&hdr.v_res, 4) || !stream.Write(&hdr.num_clrs, 4) || !stream.Write(&hdr.num_signif_clrs, 4) - ) + ) { if (verbose) wxLogError(_("BMP: Couldn't write the file header.")); @@ -147,7 +151,7 @@ bool wxBMPHandler::SaveFile(wxImage *image, buffer[3 * x + 0] = buffer[3 * x + 2]; buffer[3 * x + 2] = tmpvar; } - + if (!stream.Write(buffer, row_width)) { if (verbose) @@ -181,8 +185,8 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose int rshift = 0, gshift = 0, bshift = 0; wxUint8 aByte; wxUint16 aWord; - wxInt32 dbuf[4], aDword, - rmask = 0, gmask = 0, bmask = 0; + wxInt32 dbuf[4]; + wxInt32 aDword, rmask = 0, gmask = 0, bmask = 0; wxInt8 bbuf[4]; struct _cmap { unsigned char r, g, b; @@ -197,7 +201,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose * Read the BMP header */ - stream.Read( &bbuf, 2 ); + stream.Read( bbuf, 2 ); stream.Read( dbuf, 4 * 4 ); #if 0 // unused @@ -286,13 +290,26 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose */ if (bpp < 16 && ncolors != 0) { + unsigned char* r = new unsigned char[ncolors]; + unsigned char* g = new unsigned char[ncolors]; + unsigned char* b = new unsigned char[ncolors]; for (int j = 0; j < ncolors; j++) { stream.Read( bbuf, 4 ); cmap[j].b = bbuf[0]; cmap[j].g = bbuf[1]; cmap[j].r = bbuf[2]; + + r[j] = cmap[j].r; + g[j] = cmap[j].g; + b[j] = cmap[j].b; } + // Set the palette for the wxImage + image->SetPalette(wxPalette(ncolors, r, g, b)); + + delete[] r; + delete[] g; + delete[] b; } else if (bpp == 16 || bpp == 32) { @@ -370,7 +387,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose if (bpp == 1) { int bit = 0; - for (bit = 0; bit < 8; bit++) + for (bit = 0; bit < 8 && column < width; bit++) { index = ((aByte & (0x80 >> bit)) ? 1 : 0); ptr[poffset] = cmap[index].r; @@ -392,7 +409,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose else { int nibble = 0; - for (nibble = 0; nibble < 2; nibble++) + for (nibble = 0; nibble < 2 && column < width; nibble++) { index = ((aByte & (0xF0 >> nibble * 4)) >> (!nibble * 4)); if (index >= 16) @@ -448,7 +465,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose } else { - for (int l = 0; l < first; l++) + for (int l = 0; l < first && column < width; l++) { ptr[poffset ] = cmap[aByte].r; ptr[poffset + 1] = cmap[aByte].g; @@ -470,7 +487,7 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose } else if (bpp == 24) { - stream.Read( &bbuf, 3 ); + stream.Read( bbuf, 3 ); linepos += 3; ptr[poffset ] = (unsigned char)bbuf[2]; ptr[poffset + 1] = (unsigned char)bbuf[1]; @@ -526,11 +543,11 @@ bool wxBMPHandler::DoCanRead( wxInputStream& stream ) { unsigned char hdr[2]; - stream.Read(&hdr, 2); + stream.Read(hdr, 2); stream.SeekI(-2, wxFromCurrent); return (hdr[0] == 'B' && hdr[1] == 'M'); } #endif // wxUSE_STREAMS - +#endif // wxUSE_IMAGE