X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/14f355c2b5c71fc7c3d680aea366582d2ac60f7b..c10ae510189067379125802d4f7dcf2fed4d5b39:/src/msw/gdiimage.cpp diff --git a/src/msw/gdiimage.cpp b/src/msw/gdiimage.cpp index 2e6ae1b7f5..26cabaa71c 100644 --- a/src/msw/gdiimage.cpp +++ b/src/msw/gdiimage.cpp @@ -49,9 +49,20 @@ #include #endif +#include "wx/file.h" + #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxGDIImageHandlerList); +// ---------------------------------------------------------------------------- +// auxiliary functions +// ---------------------------------------------------------------------------- + +#ifdef __WXWINCE__ +// Used in wxBMPFileHandler::LoadFile +HBITMAP wxLoadBMP(const wxString& filename) ; +#endif + // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -345,6 +356,9 @@ bool wxBMPResourceHandler::LoadFile(wxBitmap *bitmap, bitmap->SetHeight(bm.bmHeight); bitmap->SetDepth(bm.bmBitsPixel); + // use 0xc0c0c0 as transparent colour by default + bitmap->SetMask(new wxMask(*bitmap, *wxLIGHT_GREY)); + return true; } @@ -358,8 +372,14 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, wxDIB dib(name); - return dib.IsOk() && bitmap->CopyFromDIB(dib); + bool ok = dib.IsOk() && bitmap->CopyFromDIB(dib); + return ok; #else + WXHBITMAP hBitmap = (WXHBITMAP)wxLoadBMP(name); + if(hBitmap) { + bitmap->SetHBITMAP(hBitmap); + return TRUE; + } return FALSE; #endif } @@ -597,3 +617,80 @@ wxSize wxGetHiconSize(HICON hicon) #endif // __WXMICROWIN__ +#ifdef __WXWINCE__ +// Used in wxBMPFileHandler::LoadFile +HBITMAP wxLoadBMP(const wxString& filename) +{ + wxFile file; + if(!file.Open(filename)) + return 0; + + // The first part of the file contains the file header. + // This will tell us if it is a bitmap, how big the header is, and how big + // the file is. The header size in the file header includes the color table. + BITMAPFILEHEADER BmpFileHdr; + BITMAPINFO *pBmpInfo = (BITMAPINFO*)malloc(sizeof(BITMAPINFO)+255*sizeof(RGBQUAD)); + BYTE* pBits = 0; + HBITMAP hBitmap = 0; + + if(file.Read(&BmpFileHdr, sizeof(BmpFileHdr))==sizeof(BmpFileHdr) + && !strncmp((char*)&BmpFileHdr.bfType,"BM",2) + && file.Read(pBmpInfo, sizeof(BITMAPINFOHEADER))==sizeof(BITMAPINFOHEADER) + && pBmpInfo->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) { + + + unsigned int nColors = pBmpInfo->bmiHeader.biClrUsed ? + pBmpInfo->bmiHeader.biClrUsed : 1 << pBmpInfo->bmiHeader.biBitCount; + if (nColors < 1 + || file.Read(pBmpInfo->bmiColors, nColors * sizeof(RGBQUAD)) + == (off_t)(nColors * sizeof(RGBQUAD))) { + + // So how big the bitmap surface is. + int nBitsSize = BmpFileHdr.bfSize - BmpFileHdr.bfOffBits; + + // Allocate the memory for the bits and read the bits from the file. + pBits = (BYTE*) malloc(nBitsSize*2); + if (pBits) { + // Seek to the bits in the file. + file.Seek(BmpFileHdr.bfOffBits); + + // read the bits + if(file.Read(pBits, nBitsSize)==nBitsSize) { + // Everything went OK. + pBmpInfo->bmiHeader.biSizeImage = nBitsSize; + + //HBITMAP hBitmap=SetBitmap((LPBITMAPINFO)pBmpInfo, pBits); + DWORD dwBitmapInfoSize = sizeof(BITMAPINFO) + nColors*sizeof(RGBQUAD); + + // Create a DC which will be used to get DIB, then create DIBsection + HDC hDC = ::GetDC(NULL); + if (hDC) { + LPVOID bits; + hBitmap = CreateDIBSection(hDC, (const BITMAPINFO*) pBmpInfo, + DIB_RGB_COLORS, &bits, NULL, 0); + ReleaseDC(0,hDC); + + if (hBitmap) { + DWORD dwImageSize = pBmpInfo->bmiHeader.biSizeImage; + if (dwImageSize == 0) { + int nBytesPerLine = pBmpInfo->bmiHeader.biWidth * pBmpInfo->bmiHeader.biBitCount; + nBytesPerLine = ( (nBytesPerLine + 31) & (~31) ) / 8; + dwImageSize = nBytesPerLine * pBmpInfo->bmiHeader.biHeight; + } + memcpy(bits, pBits, dwImageSize); + } + } + } + } + } + } + + if(pBmpInfo) + free(pBmpInfo); + if(pBits) + free(pBits); + + return hBitmap; +} +#endif +