fix wxBitmap mask copying
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@42850 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -198,6 +198,9 @@ class WXDLLEXPORT wxMask : public wxObject
|
|||||||
public:
|
public:
|
||||||
wxMask();
|
wxMask();
|
||||||
|
|
||||||
|
// Copy constructor
|
||||||
|
wxMask(const wxMask &mask);
|
||||||
|
|
||||||
// Construct a mask from a bitmap and a colour indicating the transparent
|
// Construct a mask from a bitmap and a colour indicating the transparent
|
||||||
// area
|
// area
|
||||||
wxMask(const wxBitmap& bitmap, const wxColour& colour);
|
wxMask(const wxBitmap& bitmap, const wxColour& colour);
|
||||||
|
@@ -205,8 +205,13 @@ wxBitmapRefData::wxBitmapRefData(const wxBitmapRefData& data)
|
|||||||
m_selectedInto = NULL;
|
m_selectedInto = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// can't copy the mask as the other bitmap destroys it
|
// (deep) copy the mask if present
|
||||||
m_bitmapMask = NULL;
|
m_bitmapMask = NULL;
|
||||||
|
if (data.m_bitmapMask)
|
||||||
|
m_bitmapMask = new wxMask(*data.m_bitmapMask);
|
||||||
|
|
||||||
|
// FIXME: we don't copy m_hBitmap currently but we should, see wxBitmap::
|
||||||
|
// CloneRefData()
|
||||||
|
|
||||||
wxASSERT_MSG( !data.m_isDIB,
|
wxASSERT_MSG( !data.m_isDIB,
|
||||||
_T("can't copy bitmap locked for raw access!") );
|
_T("can't copy bitmap locked for raw access!") );
|
||||||
@@ -252,6 +257,10 @@ wxObjectRefData *wxBitmap::CloneRefData(const wxObjectRefData *dataOrig) const
|
|||||||
if ( !data )
|
if ( !data )
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
// FIXME: this method is backwards, it should just create a new
|
||||||
|
// wxBitmapRefData using its copy ctor but instead it modifies this
|
||||||
|
// bitmap itself and then returns its m_refData -- which works, of
|
||||||
|
// course (except in !wxUSE_WXDIB), but is completely illogical
|
||||||
wxBitmap *self = wx_const_cast(wxBitmap *, this);
|
wxBitmap *self = wx_const_cast(wxBitmap *, this);
|
||||||
|
|
||||||
#if wxUSE_WXDIB
|
#if wxUSE_WXDIB
|
||||||
@@ -264,10 +273,19 @@ wxObjectRefData *wxBitmap::CloneRefData(const wxObjectRefData *dataOrig) const
|
|||||||
else
|
else
|
||||||
#endif // wxUSE_WXDIB
|
#endif // wxUSE_WXDIB
|
||||||
{
|
{
|
||||||
// don't copy the bitmap data, but do copy the size, depth, ...
|
// copy the bitmap data
|
||||||
self->m_refData = new wxBitmapRefData(*data);
|
self->m_refData = new wxBitmapRefData(*data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// copy also the mask
|
||||||
|
wxMask * const maskSrc = data->GetMask();
|
||||||
|
if ( maskSrc )
|
||||||
|
{
|
||||||
|
wxBitmapRefData *selfdata = wx_static_cast(wxBitmapRefData *, m_refData);
|
||||||
|
|
||||||
|
selfdata->SetMask(new wxMask(*maskSrc));
|
||||||
|
}
|
||||||
|
|
||||||
return m_refData;
|
return m_refData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1327,6 +1345,38 @@ wxMask::wxMask()
|
|||||||
m_maskBitmap = 0;
|
m_maskBitmap = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy constructor
|
||||||
|
wxMask::wxMask(const wxMask &mask)
|
||||||
|
{
|
||||||
|
BITMAP bmp;
|
||||||
|
|
||||||
|
HDC srcDC = CreateCompatibleDC(0);
|
||||||
|
HDC destDC = CreateCompatibleDC(0);
|
||||||
|
|
||||||
|
// GetBitmapDimensionEx won't work if SetBitmapDimensionEx wasn't used
|
||||||
|
// so we'll use GetObject() API here:
|
||||||
|
if (::GetObject((HGDIOBJ)mask.m_maskBitmap, sizeof(bmp), &bmp) == 0)
|
||||||
|
{
|
||||||
|
wxFAIL_MSG(wxT("Cannot retrieve the dimensions of the wxMask to copy"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create our HBITMAP
|
||||||
|
int w = bmp.bmWidth, h = bmp.bmHeight;
|
||||||
|
m_maskBitmap = (WXHBITMAP)CreateCompatibleBitmap(srcDC, w, h);
|
||||||
|
|
||||||
|
// copy the mask's HBITMAP into our HBITMAP
|
||||||
|
SelectObject(srcDC, (HBITMAP) mask.m_maskBitmap);
|
||||||
|
SelectObject(destDC, (HBITMAP) m_maskBitmap);
|
||||||
|
|
||||||
|
BitBlt(destDC, 0, 0, w, h, srcDC, 0, 0, SRCCOPY);
|
||||||
|
|
||||||
|
SelectObject(srcDC, 0);
|
||||||
|
DeleteDC(srcDC);
|
||||||
|
SelectObject(destDC, 0);
|
||||||
|
DeleteDC(destDC);
|
||||||
|
}
|
||||||
|
|
||||||
// Construct a mask from a bitmap and a colour indicating
|
// Construct a mask from a bitmap and a colour indicating
|
||||||
// the transparent area
|
// the transparent area
|
||||||
wxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour)
|
wxMask::wxMask(const wxBitmap& bitmap, const wxColour& colour)
|
||||||
|
Reference in New Issue
Block a user