X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6c9a19aabab3a878b565e6c2a5f2a3824277c4dc..79e385875be4ca15a4d36428156c33e5ccf74f23:/src/msw/gdiimage.cpp diff --git a/src/msw/gdiimage.cpp b/src/msw/gdiimage.cpp index 33229d4fab..eafa9af40f 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 @@ -37,21 +37,31 @@ #include "wx/app.h" -#ifndef __WXMICROWIN__ +#include "wx/bitmap.h" +#include "wx/msw/gdiimage.h" + +#if wxUSE_WXDIB #include "wx/msw/dib.h" #endif -#include "wx/msw/bitmap.h" -#include "wx/msw/gdiimage.h" -#include "wx/bitmap.h" +#ifdef __WXWINCE__ +#include +#include +#endif + +#include "wx/file.h" #include "wx/listimpl.cpp" WX_DEFINE_LIST(wxGDIImageHandlerList); +// ---------------------------------------------------------------------------- +// auxiliary functions +// ---------------------------------------------------------------------------- -#ifdef __WIN16__ -# include "wx/msw/curico.h" -#endif // __WIN16__ +#ifdef __WXWINCE__ +// Used in wxBMPFileHandler::LoadFile +HBITMAP wxLoadBMP(const wxString& filename) ; +#endif // ---------------------------------------------------------------------------- // private classes @@ -245,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(); @@ -260,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(); @@ -277,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(); @@ -292,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; } } @@ -346,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; } @@ -354,22 +367,19 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, int WXUNUSED(desiredWidth), int WXUNUSED(desiredHeight)) { -#if wxUSE_IMAGE_LOADING_IN_MSW - wxPalette *palette = NULL; - bool success = wxLoadIntoBitmap(WXSTRINGCAST name, bitmap, &palette) != 0; - -#if wxUSE_PALETTE - if ( success && palette ) - { - bitmap->SetPalette(*palette); - } +#if wxUSE_WXDIB + wxCHECK_MSG( bitmap, false, _T("NULL bitmap in LoadFile") ); - // it was copied by the bitmap if it was loaded successfully - delete palette; -#endif // wxUSE_PALETTE + wxDIB dib(name); - return success; + 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 } @@ -377,19 +387,14 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int WXUNUSED(type), - const wxPalette *pal) + const wxPalette * WXUNUSED(pal)) { -#if wxUSE_IMAGE_LOADING_IN_MSW +#if wxUSE_WXDIB + wxCHECK_MSG( bitmap, false, _T("NULL bitmap in SaveFile") ); -#if wxUSE_PALETTE - wxPalette *actualPalette = (wxPalette *)pal; - if ( !actualPalette ) - actualPalette = bitmap->GetPalette(); -#else - wxPalette *actualPalette = NULL; -#endif // wxUSE_PALETTE + wxDIB dib(*bitmap); - return wxSaveBitmap(WXSTRINGCAST name, bitmap, actualPalette) != 0; + return dib.Save(name); #else return false; #endif @@ -404,13 +409,11 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon, long WXUNUSED(flags), int desiredWidth, int desiredHeight) { -#if wxUSE_RESOURCE_LOADING_IN_MSW icon->UnRef(); // actual size wxSize size; -#ifdef __WIN32__ HICON hicon = NULL; // Parse the filename: it may be of the form "filename;n" in order to @@ -448,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) ) { @@ -475,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 ) { @@ -490,11 +495,6 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon, } size = wxGetHiconSize(hicon); -#else // Win16 - HICON hicon = ReadIconFile((wxChar *)name.c_str(), - wxGetInstance(), - &size.x, &size.y); -#endif // Win32/Win16 if ( (desiredWidth != -1 && desiredWidth != size.x) || (desiredHeight != -1 && desiredHeight != size.y) ) @@ -513,9 +513,6 @@ bool wxICOFileHandler::LoadIcon(wxIcon *icon, icon->SetSize(size.x, size.y); return icon->Ok(); -#else - return false; -#endif } bool wxICOResourceHandler::LoadIcon(wxIcon *icon, @@ -537,7 +534,6 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon, // note that we can't just always call LoadImage() because it seems to do // some icon rescaling internally which results in very ugly 16x16 icons -#if defined(__WIN32__) && !defined(__SC__) if ( hasSize ) { hicon = (HICON)::LoadImage(wxGetInstance(), name, IMAGE_ICON, @@ -545,12 +541,12 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon, LR_DEFAULTCOLOR); } else -#endif // Win32/!Win32 { hicon = ::LoadIcon(wxGetInstance(), name); } // next check if it's not a standard icon +#ifndef __WXWINCE__ if ( !hicon && !hasSize ) { static const struct @@ -573,6 +569,7 @@ bool wxICOResourceHandler::LoadIcon(wxIcon *icon, } } } +#endif wxSize size = wxGetHiconSize(hicon); icon->SetSize(size.x, size.y); @@ -588,10 +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)); -#ifdef __WIN32__ - // Win32s doesn't have GetIconInfo function... +#ifndef __WXWINCE__ if ( hicon && wxGetOsVersion() != wxWIN32S ) { ICONINFO info; @@ -616,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)) + == (ssize_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 - // __WXMICROWIN__ +