X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/222ed1d678dff2f5c3c4164321dd05e8f47de487..2cb4351487d67bf316c333edd667d7074c1d866b:/src/msw/gdiimage.cpp diff --git a/src/msw/gdiimage.cpp b/src/msw/gdiimage.cpp index 2bf6f0bce0..26cabaa71c 100644 --- a/src/msw/gdiimage.cpp +++ b/src/msw/gdiimage.cpp @@ -17,7 +17,7 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "gdiimage.h" #endif @@ -39,11 +39,30 @@ #include "wx/bitmap.h" #include "wx/msw/gdiimage.h" + +#if wxUSE_WXDIB #include "wx/msw/dib.h" +#endif + +#ifdef __WXWINCE__ +#include +#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 // ---------------------------------------------------------------------------- @@ -337,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; } @@ -345,11 +367,21 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, int WXUNUSED(desiredWidth), int WXUNUSED(desiredHeight)) { +#if wxUSE_WXDIB wxCHECK_MSG( bitmap, false, _T("NULL bitmap in LoadFile") ); 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 } bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, @@ -357,11 +389,15 @@ bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, int WXUNUSED(type), const wxPalette * WXUNUSED(pal)) { +#if wxUSE_WXDIB wxCHECK_MSG( bitmap, false, _T("NULL bitmap in SaveFile") ); wxDIB dib(*bitmap); return dib.Save(name); +#else + return FALSE; +#endif } // ---------------------------------------------------------------------------- @@ -415,7 +451,7 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon, } else #endif - // were we asked for a large icon? + // were we asked for a large icon? if ( desiredWidth == ::GetSystemMetrics(SM_CXICON) && desiredHeight == ::GetSystemMetrics(SM_CYICON) ) { @@ -442,11 +478,13 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon, } //else: not standard size, load below +#ifndef __WXWINCE__ if ( !hicon ) { // take any size icon from the file by index hicon = ::ExtractIcon(wxGetInstance(), nameReal, iconIndex); } +#endif if ( !hicon ) { @@ -508,6 +546,7 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon, } // next check if it's not a standard icon +#ifndef __WXWINCE__ if ( !hicon && !hasSize ) { static const struct @@ -530,6 +569,7 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon, } } } +#endif wxSize size = wxGetHiconSize(hicon); icon->SetSize(size.x, size.y); @@ -546,7 +586,7 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon, wxSize wxGetHiconSize(HICON hicon) { wxSize size(32, 32); // default - +#ifndef __WXWINCE__ if ( hicon && wxGetOsVersion() != wxWIN32S ) { ICONINFO info; @@ -571,9 +611,86 @@ wxSize wxGetHiconSize(HICON hicon) ::DeleteObject(info.hbmColor); } } - +#endif return size; } #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 +