mask corrections
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@4935 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -122,12 +122,37 @@ bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon)
|
|||||||
wxBitmapRefData *refData = new wxBitmapRefData;
|
wxBitmapRefData *refData = new wxBitmapRefData;
|
||||||
m_refData = refData;
|
m_refData = refData;
|
||||||
|
|
||||||
refData->m_width = icon.GetWidth();
|
int w = icon.GetWidth(),
|
||||||
refData->m_height = icon.GetHeight();
|
h = icon.GetHeight();
|
||||||
|
|
||||||
|
refData->m_width = w;
|
||||||
|
refData->m_height = h;
|
||||||
refData->m_depth = wxDisplayDepth();
|
refData->m_depth = wxDisplayDepth();
|
||||||
|
|
||||||
refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor;
|
refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor;
|
||||||
refData->m_bitmapMask = new wxMask((WXHBITMAP)iconInfo.hbmMask);
|
|
||||||
|
// the mask returned by GetIconInfo() is inversed compared to the usual
|
||||||
|
// wxWin convention
|
||||||
|
HBITMAP hbmpMask = ::CreateBitmap(w, h, 1, 1, 0);
|
||||||
|
|
||||||
|
// the icons mask is opposite to the usual wxWin convention
|
||||||
|
HDC dcSrc = ::CreateCompatibleDC(NULL);
|
||||||
|
HDC dcDst = ::CreateCompatibleDC(NULL);
|
||||||
|
(void)SelectObject(dcSrc, iconInfo.hbmMask);
|
||||||
|
(void)SelectObject(dcDst, hbmpMask);
|
||||||
|
|
||||||
|
HBRUSH brush = ::CreateSolidBrush(RGB(255, 255, 255));
|
||||||
|
RECT rect = { 0, 0, w, h };
|
||||||
|
FillRect(dcDst, &rect, brush);
|
||||||
|
|
||||||
|
BitBlt(dcDst, 0, 0, w, h, dcSrc, 0, 0, SRCINVERT);
|
||||||
|
|
||||||
|
SelectObject(dcDst, NULL);
|
||||||
|
SelectObject(dcSrc, NULL);
|
||||||
|
DeleteDC(dcDst);
|
||||||
|
DeleteDC(dcSrc);
|
||||||
|
|
||||||
|
refData->m_bitmapMask = new wxMask((WXHBITMAP)hbmpMask);
|
||||||
|
|
||||||
#if WXWIN_COMPATIBILITY_2
|
#if WXWIN_COMPATIBILITY_2
|
||||||
refData->m_ok = TRUE;
|
refData->m_ok = TRUE;
|
||||||
|
@@ -114,66 +114,107 @@ bool wxBitmapButton::MSWOnDraw(WXDRAWITEMSTRUCT *item)
|
|||||||
|
|
||||||
LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item;
|
LPDRAWITEMSTRUCT lpDIS = (LPDRAWITEMSTRUCT) item;
|
||||||
|
|
||||||
wxBitmap* bitmap = &m_buttonBitmap;
|
// choose the bitmap to use depending on the buttons state
|
||||||
|
wxBitmap* bitmap;
|
||||||
|
|
||||||
UINT state = lpDIS->itemState;
|
UINT state = lpDIS->itemState;
|
||||||
if ((state & ODS_SELECTED) && m_buttonBitmapSelected.Ok())
|
bool isSelected = (state & ODS_SELECTED) != 0;
|
||||||
|
if ( isSelected && m_buttonBitmapSelected.Ok() )
|
||||||
bitmap = &m_buttonBitmapSelected;
|
bitmap = &m_buttonBitmapSelected;
|
||||||
else if ((state & ODS_FOCUS) && m_buttonBitmapFocus.Ok())
|
else if ((state & ODS_FOCUS) && m_buttonBitmapFocus.Ok())
|
||||||
bitmap = &m_buttonBitmapFocus;
|
bitmap = &m_buttonBitmapFocus;
|
||||||
else if ((state & ODS_DISABLED) && m_buttonBitmapDisabled.Ok())
|
else if ((state & ODS_DISABLED) && m_buttonBitmapDisabled.Ok())
|
||||||
bitmap = &m_buttonBitmapDisabled;
|
bitmap = &m_buttonBitmapDisabled;
|
||||||
|
else
|
||||||
|
bitmap = &m_buttonBitmap;
|
||||||
|
|
||||||
if ( !bitmap->Ok() )
|
if ( !bitmap->Ok() )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
// draw it on the memory DC
|
||||||
HDC hDC = lpDIS->hDC;
|
HDC hDC = lpDIS->hDC;
|
||||||
HDC memDC = ::CreateCompatibleDC(hDC);
|
HDC memDC = ::CreateCompatibleDC(hDC);
|
||||||
|
|
||||||
HBITMAP old = (HBITMAP) ::SelectObject(memDC, (HBITMAP) bitmap->GetHBITMAP());
|
HBITMAP old = (HBITMAP) ::SelectObject(memDC, (HBITMAP) bitmap->GetHBITMAP());
|
||||||
|
|
||||||
if (!old)
|
if (!old)
|
||||||
|
{
|
||||||
|
wxLogLastError(_T("SelectObject"));
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
int x = lpDIS->rcItem.left;
|
int x = lpDIS->rcItem.left;
|
||||||
int y = lpDIS->rcItem.top;
|
int y = lpDIS->rcItem.top;
|
||||||
int width = lpDIS->rcItem.right - x;
|
int width = lpDIS->rcItem.right - x;
|
||||||
int height = lpDIS->rcItem.bottom - y;
|
int height = lpDIS->rcItem.bottom - y;
|
||||||
|
|
||||||
|
int wBmp = bitmap->GetWidth(),
|
||||||
|
hBmp = bitmap->GetHeight();
|
||||||
|
|
||||||
// Draw the face, if auto-drawing
|
// Draw the face, if auto-drawing
|
||||||
if ( GetWindowStyleFlag() & wxBU_AUTODRAW )
|
bool autoDraw = (GetWindowStyleFlag() & wxBU_AUTODRAW) != 0;
|
||||||
DrawFace((WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom,
|
if ( autoDraw )
|
||||||
((state & ODS_SELECTED) == ODS_SELECTED));
|
{
|
||||||
|
DrawFace((WXHDC) hDC,
|
||||||
|
lpDIS->rcItem.left, lpDIS->rcItem.top,
|
||||||
|
lpDIS->rcItem.right, lpDIS->rcItem.bottom,
|
||||||
|
isSelected);
|
||||||
|
}
|
||||||
|
|
||||||
// Centre the bitmap in the control area
|
// Centre the bitmap in the control area
|
||||||
int x1 = (int) (x + ((width - bitmap->GetWidth()) / 2));
|
int x1 = x + (width - wBmp) / 2;
|
||||||
int y1 = (int) (y + ((height - bitmap->GetHeight()) / 2));
|
int y1 = y + (height - hBmp) / 2;
|
||||||
|
|
||||||
if ( (state & ODS_SELECTED) && (GetWindowStyleFlag() & wxBU_AUTODRAW) )
|
if ( isSelected && autoDraw )
|
||||||
{
|
{
|
||||||
x1++;
|
x1++;
|
||||||
y1++;
|
y1++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOL ok;
|
||||||
wxMask *mask = bitmap->GetMask();
|
wxMask *mask = bitmap->GetMask();
|
||||||
if ( mask )
|
if ( mask )
|
||||||
{
|
{
|
||||||
::MaskBlt(hDC, x1, y1, bitmap->GetWidth(), bitmap->GetHeight(), // dst
|
// the fg ROP is applied for the pixels of the mask bitmap which are 1
|
||||||
|
// (for a wxMask this means that this is a non transparent pixel), the
|
||||||
|
// bg ROP is applied for all the others
|
||||||
|
ok = ::MaskBlt(
|
||||||
|
hDC, x1, y1, wBmp, hBmp, // dst
|
||||||
memDC, 0, 0, // src
|
memDC, 0, 0, // src
|
||||||
(HBITMAP)mask->GetMaskBitmap(), 0, 0, // mask
|
(HBITMAP)mask->GetMaskBitmap(), 0, 0, // mask
|
||||||
MAKEROP4(SRCPAINT, SRCCOPY));
|
MAKEROP4(SRCCOPY, // fg ROP
|
||||||
|
SRCPAINT) // bg ROP
|
||||||
|
);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
::BitBlt(hDC, x1, y1, bitmap->GetWidth(), bitmap->GetHeight(), // dst
|
ok = ::BitBlt(hDC, x1, y1, wBmp, hBmp, // dst
|
||||||
memDC, 0, 0, // src
|
memDC, 0, 0, // src
|
||||||
SRCCOPY);
|
SRCCOPY); // ROP
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( (state & ODS_DISABLED) && (GetWindowStyleFlag() & wxBU_AUTODRAW) )
|
if ( !ok )
|
||||||
DrawButtonDisable( (WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, TRUE ) ;
|
{
|
||||||
else if ( (state & ODS_FOCUS) && (GetWindowStyleFlag() & wxBU_AUTODRAW) )
|
wxLogLastError(_T("Mask/BitBlt()"));
|
||||||
DrawButtonFocus( (WXHDC) hDC, lpDIS->rcItem.left, lpDIS->rcItem.top, lpDIS->rcItem.right, lpDIS->rcItem.bottom, ((state & ODS_SELECTED) == ODS_SELECTED));
|
}
|
||||||
|
|
||||||
|
if ( (state & ODS_DISABLED) && autoDraw )
|
||||||
|
{
|
||||||
|
DrawButtonDisable((WXHDC) hDC,
|
||||||
|
lpDIS->rcItem.left, lpDIS->rcItem.top,
|
||||||
|
lpDIS->rcItem.right, lpDIS->rcItem.bottom,
|
||||||
|
TRUE);
|
||||||
|
}
|
||||||
|
else if ( (state & ODS_FOCUS) && autoDraw )
|
||||||
|
{
|
||||||
|
DrawButtonFocus((WXHDC) hDC,
|
||||||
|
lpDIS->rcItem.left,
|
||||||
|
lpDIS->rcItem.top,
|
||||||
|
lpDIS->rcItem.right,
|
||||||
|
lpDIS->rcItem.bottom,
|
||||||
|
isSelected);
|
||||||
|
}
|
||||||
|
|
||||||
::SelectObject(memDC, old);
|
::SelectObject(memDC, old);
|
||||||
|
|
||||||
@@ -266,20 +307,23 @@ void wxBitmapButton::DrawButtonDisable( WXHDC dc, int left, int top, int right,
|
|||||||
{
|
{
|
||||||
HBRUSH old = (HBRUSH) SelectObject( (HDC) dc, wxDisableButtonBrush ) ;
|
HBRUSH old = (HBRUSH) SelectObject( (HDC) dc, wxDisableButtonBrush ) ;
|
||||||
|
|
||||||
|
// VZ: what's this?? there is no such ROP AFAIK
|
||||||
|
#ifdef __SALFORDC__
|
||||||
|
DWORD dwRop = 0xFA0089L;
|
||||||
|
#else
|
||||||
|
DWORD dwRop = 0xFA0089UL;
|
||||||
|
#endif
|
||||||
|
|
||||||
if ( with_marg )
|
if ( with_marg )
|
||||||
::PatBlt( (HDC) dc, left + m_marginX, top + m_marginY,
|
{
|
||||||
right - 2 * m_marginX, bottom - 2 * m_marginY,
|
left += m_marginX;
|
||||||
#ifdef __SALFORDC__
|
top += m_marginY;
|
||||||
0xfa0089L ) ;
|
right -= 2 * m_marginX;
|
||||||
#else
|
bottom -= 2 * m_marginY;
|
||||||
0xfa0089UL ) ;
|
}
|
||||||
#endif
|
|
||||||
else ::PatBlt( (HDC) dc, left, top, right, bottom,
|
::PatBlt( (HDC) dc, left, top, right, bottom, dwRop);
|
||||||
#ifdef __SALFORDC__
|
|
||||||
0xfa0089L ) ;
|
|
||||||
#else
|
|
||||||
0xfa0089UL ) ;
|
|
||||||
#endif
|
|
||||||
::SelectObject( (HDC) dc, old ) ;
|
::SelectObject( (HDC) dc, old ) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user