#include "wx/msw/dib.h"
#include "wx/image.h"
+// missing from mingw32 header
+#ifndef CLR_INVALID
+ #define CLR_INVALID ((COLORREF)-1)
+#endif // no CLR_INVALID
+
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------
{
if ( !::DeleteObject((HBITMAP)m_hBitmap) )
{
- wxLogLastError("DeleteObject(hbitmap)");
+ wxLogLastError(wxT("DeleteObject(hbitmap)"));
}
}
ICONINFO iconInfo;
if ( !::GetIconInfo(hicon, &iconInfo) )
{
- wxLogLastError("GetIconInfo");
+ wxLogLastError(wxT("GetIconInfo"));
return FALSE;
}
HBITMAP hbmp = ::CreateBitmap(width, height, 1, depth, data);
if ( !hbmp )
{
- wxLogLastError("CreateBitmap");
+ wxLogLastError(wxT("CreateBitmap"));
}
if ( data != bits )
hbmp = ::CreateBitmap(w, h, 1, d, NULL);
if ( !hbmp )
{
- wxLogLastError("CreateBitmap");
+ wxLogLastError(wxT("CreateBitmap"));
}
}
else
hbmp = ::CreateCompatibleBitmap(dc, w, h);
if ( !hbmp )
{
- wxLogLastError("CreateCompatibleBitmap");
+ wxLogLastError(wxT("CreateCompatibleBitmap"));
}
GetBitmapData()->m_depth = wxDisplayDepth();
if ( !handler )
{
- wxLogDebug(wxT("Failed to create bitmap: no bitmap handler for "
- "type %d defined."), type);
+ wxLogDebug(wxT("Failed to create bitmap: no bitmap handler for type %d defined."), type);
return FALSE;
}
// Create a mask from a mono bitmap (copies the bitmap).
bool wxMask::Create(const wxBitmap& bitmap)
{
+ wxCHECK_MSG( bitmap.Ok() && bitmap.GetDepth() == 1, FALSE,
+ _T("can't create mask from invalid or not monochrome bitmap") );
+
if ( m_maskBitmap )
{
::DeleteObject((HBITMAP) m_maskBitmap);
m_maskBitmap = 0;
}
- if (!bitmap.Ok() || bitmap.GetDepth() != 1)
- {
- return FALSE;
- }
+
m_maskBitmap = (WXHBITMAP) CreateBitmap(
bitmap.GetWidth(),
bitmap.GetHeight(),
HDC destDC = ::CreateCompatibleDC(NULL);
if ( !srcDC || !destDC )
{
- wxLogLastError("CreateCompatibleDC");
+ wxLogLastError(wxT("CreateCompatibleDC"));
}
- if ( !::SelectObject(srcDC, GetHbitmapOf(bitmap)) )
+ bool ok = TRUE;
+
+ HGDIOBJ hbmpSrcOld = ::SelectObject(srcDC, GetHbitmapOf(bitmap));
+ if ( !hbmpSrcOld )
{
- wxLogLastError("SelectObject");
+ wxLogLastError(wxT("SelectObject"));
+
+ ok = FALSE;
}
- if ( !::SelectObject(destDC, (HBITMAP)m_maskBitmap) )
+
+ HGDIOBJ hbmpDstOld = ::SelectObject(destDC, (HBITMAP)m_maskBitmap);
+ if ( !hbmpDstOld )
{
- wxLogLastError("SelectObject");
+ wxLogLastError(wxT("SelectObject"));
+
+ ok = FALSE;
}
// this is not very efficient, but I can't think of a better way of doing
// it
- for ( int w = 0; w < width; w++ )
+ for ( int w = 0; ok && (w < width); w++ )
{
- for ( int h = 0; h < height; h++ )
+ for ( int h = 0; ok && (h < height); h++ )
{
COLORREF col = GetPixel(srcDC, w, h);
if ( col == CLR_INVALID )
{
- wxLogLastError("GetPixel");
+ wxLogLastError(wxT("GetPixel"));
// doesn't make sense to continue
- ::SelectObject(srcDC, 0);
- ::DeleteDC(srcDC);
- ::SelectObject(destDC, 0);
- ::DeleteDC(destDC);
+ ok = FALSE;
- return FALSE;
+ break;
}
if ( col == maskColour )
}
}
- ::SelectObject(srcDC, 0);
+ ::SelectObject(srcDC, hbmpSrcOld);
::DeleteDC(srcDC);
- ::SelectObject(destDC, 0);
+ ::SelectObject(destDC, hbmpDstOld);
::DeleteDC(destDC);
- return TRUE;
+ return ok;
}
// ----------------------------------------------------------------------------
HDC hdcDst = ::CreateCompatibleDC(NULL);
if ( !hdcSrc || !hdcDst )
{
- wxLogLastError("CreateCompatibleDC");
+ wxLogLastError(wxT("CreateCompatibleDC"));
}
HBITMAP hbmpInvMask = ::CreateBitmap(w, h, 1, 1, 0);
if ( !hbmpInvMask )
{
- wxLogLastError("CreateBitmap");
+ wxLogLastError(wxT("CreateBitmap"));
}
::SelectObject(hdcSrc, hbmpMask);
hdcSrc, 0, 0,
NOTSRCCOPY) )
{
- wxLogLastError("BitBlt");
+ wxLogLastError(wxT("BitBlt"));
}
::DeleteDC(hdcSrc);