X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/11f406f91fb3faceb6e07853dec9c90cd3e15066..ba8c878f957da36c14879b747a2d54d7fe01baa8:/src/msw/bitmap.cpp diff --git a/src/msw/bitmap.cpp b/src/msw/bitmap.cpp index b942d9d61f..222cb4c40b 100644 --- a/src/msw/bitmap.cpp +++ b/src/msw/bitmap.cpp @@ -211,7 +211,7 @@ wxBitmapRefData::wxBitmapRefData(const wxBitmapRefData& data) m_bitmapMask = new wxMask(*data.m_bitmapMask); // FIXME: we don't copy m_hBitmap currently but we should, see wxBitmap:: - // CloneRefData() + // CloneGDIRefData() wxASSERT_MSG( !data.m_isDIB, _T("can't copy bitmap locked for raw access!") ); @@ -250,7 +250,7 @@ wxGDIImageRefData *wxBitmap::CreateData() const return new wxBitmapRefData; } -wxObjectRefData *wxBitmap::CloneRefData(const wxObjectRefData *dataOrig) const +wxGDIRefData *wxBitmap::CloneGDIRefData(const wxGDIRefData *dataOrig) const { const wxBitmapRefData * data = wx_static_cast(const wxBitmapRefData *, dataOrig); @@ -277,16 +277,17 @@ wxObjectRefData *wxBitmap::CloneRefData(const wxObjectRefData *dataOrig) const self->m_refData = new wxBitmapRefData(*data); } + wxBitmapRefData * const + selfdata = wx_static_cast(wxBitmapRefData *, m_refData); + // 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 selfdata; } bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon, @@ -374,6 +375,8 @@ bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon, return true; #else // __WXMICROWIN__ || __WXWINCE__ wxUnusedVar(icon); + wxUnusedVar(transp); + return false; #endif // !__WXWINCE__/__WXWINCE__ } @@ -533,9 +536,14 @@ bool wxBitmap::Create(int width, int height, int depth) bool wxBitmap::Create(int width, int height, const wxDC& dc) { - wxCHECK_MSG( dc.Ok(), false, _T("invalid HDC in wxBitmap::Create()") ); + wxCHECK_MSG( dc.IsOk(), false, _T("invalid HDC in wxBitmap::Create()") ); - return DoCreate(width, height, -1, dc.GetHDC()); + const wxMSWDCImpl *impl = wxDynamicCast( dc.GetImpl(), wxMSWDCImpl ); + + if (impl) + return DoCreate(width, height, -1, impl->GetHDC()); + else + return false; } bool wxBitmap::DoCreate(int w, int h, int d, WXHDC hdc) @@ -803,10 +811,15 @@ bool wxBitmap::CreateFromImage(const wxImage& image, int depth) bool wxBitmap::CreateFromImage(const wxImage& image, const wxDC& dc) { - wxCHECK_MSG( dc.Ok(), false, + wxCHECK_MSG( dc.IsOk(), false, _T("invalid HDC in wxBitmap::CreateFromImage()") ); - return CreateFromImage(image, -1, dc.GetHDC()); + const wxMSWDCImpl *impl = wxDynamicCast( dc.GetImpl(), wxMSWDCImpl ); + + if (impl) + return CreateFromImage(image, -1, impl->GetHDC()); + else + return false; } #if wxUSE_WXDIB @@ -1087,8 +1100,14 @@ bool wxBitmap::SaveFile(const wxString& filename, // ---------------------------------------------------------------------------- // sub bitmap extraction // ---------------------------------------------------------------------------- +wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect ) const +{ + MemoryHDC dcSrc; + SelectInHDC selectSrc(dcSrc, GetHbitmap()); + return GetSubBitmapOfHDC( rect, (WXHDC)dcSrc ); +} -wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const +wxBitmap wxBitmap::GetSubBitmapOfHDC( const wxRect& rect, WXHDC hdc ) const { wxCHECK_MSG( Ok() && (rect.x >= 0) && (rect.y >= 0) && @@ -1109,16 +1128,15 @@ wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const dcDst; { - SelectInHDC selectSrc(dcSrc, GetHbitmap()), - selectDst(dcDst, GetHbitmapOf(ret)); - - if ( !selectSrc || !selectDst ) + SelectInHDC selectDst(dcDst, GetHbitmapOf(ret)); + + if ( !selectDst ) { - wxLogLastError(_T("SelectObjct(hBitmap)")); + wxLogLastError(_T("SelectObject(destBitmap)")); } if ( !::BitBlt(dcDst, 0, 0, rect.width, rect.height, - dcSrc, rect.x, rect.y, SRCCOPY) ) + (HDC)hdc, rect.x, rect.y, SRCCOPY) ) { wxLogLastError(_T("BitBlt")); }