// 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(),
wxLogLastError("CreateCompatibleDC");
}
- if ( !::SelectObject(srcDC, GetHbitmapOf(bitmap)) )
+ bool ok = TRUE;
+
+ HGDIOBJ hbmpSrcOld = ::SelectObject(srcDC, GetHbitmapOf(bitmap));
+ if ( !hbmpSrcOld )
{
wxLogLastError("SelectObject");
+
+ ok = FALSE;
}
- if ( !::SelectObject(destDC, (HBITMAP)m_maskBitmap) )
+
+ HGDIOBJ hbmpDstOld = ::SelectObject(destDC, (HBITMAP)m_maskBitmap);
+ if ( !hbmpDstOld )
{
wxLogLastError("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");
// 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;
}
// ----------------------------------------------------------------------------