X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/655719367ac5e131d9642e5783f3ecf64d1a3385..9d5507f7a2701395e1d5c121bd877bb9066ee6ea:/src/msw/dcmemory.cpp?ds=sidebyside diff --git a/src/msw/dcmemory.cpp b/src/msw/dcmemory.cpp index 3427da41a1..6869e6f4e4 100644 --- a/src/msw/dcmemory.cpp +++ b/src/msw/dcmemory.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: dcmemory.cpp +// Name: src/msw/dcmemory.cpp // Purpose: wxMemoryDC class // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "dcmemory.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,6 +24,9 @@ #pragma hdrstop #endif +#include "wx/dcmemory.h" +#include "wx/msw/dcmemory.h" + #ifndef WX_PRECOMP #include "wx/utils.h" #include "wx/log.h" @@ -35,43 +34,38 @@ #include "wx/msw/private.h" -#include "wx/dcmemory.h" - // ---------------------------------------------------------------------------- -// wxWin macros +// wxMemoryDCImpl // ---------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC) - -// ============================================================================ -// implementation -// ============================================================================ - -// ---------------------------------------------------------------------------- -// wxMemoryDC -// ---------------------------------------------------------------------------- +IMPLEMENT_ABSTRACT_CLASS(wxMemoryDCImpl, wxMSWDCImpl) -wxMemoryDC::wxMemoryDC() +wxMemoryDCImpl::wxMemoryDCImpl( wxMemoryDC *owner ) + : wxMSWDCImpl( owner ) { - CreateCompatible(NULL); + CreateCompatible(NULL); + Init(); +} - Init(); +wxMemoryDCImpl::wxMemoryDCImpl( wxMemoryDC *owner, wxBitmap& bitmap ) + : wxMSWDCImpl( owner ) +{ + CreateCompatible(NULL); + Init(); + DoSelect(bitmap); } -wxMemoryDC::wxMemoryDC(wxDC *dc) +wxMemoryDCImpl::wxMemoryDCImpl( wxMemoryDC *owner, wxDC *dc ) + : wxMSWDCImpl( owner ) { wxCHECK_RET( dc, _T("NULL dc in wxMemoryDC ctor") ); - dc->BeginDrawing(); - CreateCompatible(dc); - dc->EndDrawing(); - Init(); } -void wxMemoryDC::Init() +void wxMemoryDCImpl::Init() { if ( m_ok ) { @@ -84,19 +78,27 @@ void wxMemoryDC::Init() } } -bool wxMemoryDC::CreateCompatible(wxDC *dc) +bool wxMemoryDCImpl::CreateCompatible(wxDC *dc) { - m_hDC = (WXHDC)::CreateCompatibleDC(dc ? GetHdcOf(*dc) : NULL); + wxDCImpl *impl = dc ? dc->GetImpl() : NULL ; + wxMSWDCImpl *msw_impl = wxDynamicCast( impl, wxMSWDCImpl ); + if ( dc && !msw_impl) + { + m_ok = false; + return false; + } + + m_hDC = (WXHDC)::CreateCompatibleDC(dc ? GetHdcOf(*msw_impl) : NULL); // as we created the DC, we must delete it in the dtor - m_bOwnsDC = TRUE; + m_bOwnsDC = true; m_ok = m_hDC != 0; return m_ok; } -void wxMemoryDC::SelectObject(const wxBitmap& bitmap) +void wxMemoryDCImpl::DoSelect( const wxBitmap& bitmap ) { // select old bitmap out of the device context if ( m_oldBitmap ) @@ -113,7 +115,7 @@ void wxMemoryDC::SelectObject(const wxBitmap& bitmap) // check for whether the bitmap is already selected into a device context wxASSERT_MSG( !bitmap.GetSelectedInto() || - (bitmap.GetSelectedInto() == this), + (bitmap.GetSelectedInto() == GetOwner()), wxT("Bitmap is selected in another wxMemoryDC, delete the first wxMemoryDC or use SelectObject(NULL)") ); m_selectedBitmap = bitmap; @@ -122,7 +124,7 @@ void wxMemoryDC::SelectObject(const wxBitmap& bitmap) return; #ifdef __WXDEBUG__ - m_selectedBitmap.SetSelectedInto(this); + m_selectedBitmap.SetSelectedInto(GetOwner()); #endif hBmp = (WXHBITMAP)::SelectObject(GetHdc(), (HBITMAP)hBmp); @@ -138,7 +140,7 @@ void wxMemoryDC::SelectObject(const wxBitmap& bitmap) } } -void wxMemoryDC::DoGetSize(int *width, int *height) const +void wxMemoryDCImpl::DoGetSize(int *width, int *height) const { if ( m_selectedBitmap.Ok() ) { @@ -189,7 +191,7 @@ static void wxDrawRectangle(wxDC& dc, wxCoord x, wxCoord y, wxCoord width, wxCoo #endif // wxUSE_MEMORY_DC_DRAW_RECTANGLE -void wxMemoryDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) +void wxMemoryDCImpl::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord height) { // Set this to 1 to work around an apparent video driver bug // (visible with e.g. 70x70 rectangle on a memory DC; see Drawing sample) @@ -204,7 +206,6 @@ void wxMemoryDC::DoDrawRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord he else #endif // wxUSE_MEMORY_DC_DRAW_RECTANGLE { - wxDC::DoDrawRectangle(x, y, width, height); + wxMSWDCImpl::DoDrawRectangle(x, y, width, height); } } -