X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/05d3cd45e5991ee8275ca870d17b28b17ca34c87..1d6560d796aefb5dbdf217109767b1054c68c291:/src/msw/gdiimage.cpp diff --git a/src/msw/gdiimage.cpp b/src/msw/gdiimage.cpp index 1e7606bcbe..cba8189116 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 // ---------------------------------------------------------------------------- @@ -236,7 +255,7 @@ bool wxGDIImage::RemoveHandler(const wxString& name) wxGDIImageHandler *wxGDIImage::FindHandler(const wxString& name) { - wxGDIImageHandlerList::Node *node = ms_handlers.GetFirst(); + wxGDIImageHandlerList::compatibility_iterator node = ms_handlers.GetFirst(); while ( node ) { wxGDIImageHandler *handler = node->GetData(); @@ -251,7 +270,7 @@ wxGDIImageHandler *wxGDIImage::FindHandler(const wxString& name) wxGDIImageHandler *wxGDIImage::FindHandler(const wxString& extension, long type) { - wxGDIImageHandlerList::Node *node = ms_handlers.GetFirst(); + wxGDIImageHandlerList::compatibility_iterator node = ms_handlers.GetFirst(); while ( node ) { wxGDIImageHandler *handler = node->GetData(); @@ -268,7 +287,7 @@ wxGDIImageHandler *wxGDIImage::FindHandler(const wxString& extension, wxGDIImageHandler *wxGDIImage::FindHandler(long type) { - wxGDIImageHandlerList::Node *node = ms_handlers.GetFirst(); + wxGDIImageHandlerList::compatibility_iterator node = ms_handlers.GetFirst(); while ( node ) { wxGDIImageHandler *handler = node->GetData(); @@ -283,13 +302,13 @@ wxGDIImageHandler *wxGDIImage::FindHandler(long type) void wxGDIImage::CleanUpHandlers() { - wxGDIImageHandlerList::Node *node = ms_handlers.GetFirst(); + wxGDIImageHandlerList::compatibility_iterator node = ms_handlers.GetFirst(); while ( node ) { wxGDIImageHandler *handler = node->GetData(); - wxGDIImageHandlerList::Node *next = node->GetNext(); + wxGDIImageHandlerList::compatibility_iterator next = node->GetNext(); delete handler; - delete node; + ms_handlers.Erase( node ); node = next; } } @@ -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); @@ -545,8 +585,11 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon, wxSize wxGetHiconSize(HICON hicon) { - wxSize size(32, 32); // default + // default icon size on this hardware + // usually 32x32 but can be other (smaller) on pocket devices + wxSize size(::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON)); +#ifndef __WXWINCE__ if ( hicon && wxGetOsVersion() != wxWIN32S ) { ICONINFO info; @@ -571,9 +614,88 @@ wxSize wxGetHiconSize(HICON hicon) ::DeleteObject(info.hbmColor); } } - +#else + wxUnusedVar(hicon); +#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 +