X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e608d2285cd20c592239994ebe5a29ca265892bf..52f52ebc4e0be6a9899d328b08db9eb14629d219:/wxPython/src/_dc.i diff --git a/wxPython/src/_dc.i b/wxPython/src/_dc.i index 964766e014..f786ae7c45 100644 --- a/wxPython/src/_dc.i +++ b/wxPython/src/_dc.i @@ -569,18 +569,99 @@ public: //--------------------------------------------------------------------------- %newgroup -enum + +%{ +//-=-=-=-=-=-=-=-=-=-=- + +#if 1 +// Use the standard wxBufferedDC +#include + +#else + +// Or, temporarily put a set of classes here similar to the old buffered DC +// classes until the real ones can be fixed to work "correctly" again. + +class wxBufferedDC : public wxMemoryDC { - // this is more efficient and hence default - wxBUFFER_DC_OVERWRITE_BG = 0, +private: + wxDC *m_dc; + wxBitmap m_buffer; + +public: + + wxBufferedDC() : m_dc( 0 ) {} + + wxBufferedDC( wxDC *dc, const wxBitmap &buffer ) + : m_dc( dc ), m_buffer( buffer ) + { + SelectObject( m_buffer ); + } + + wxBufferedDC( wxDC *dc, const wxSize &area ) + : m_dc( dc ), m_buffer( area.GetWidth(), area.GetHeight() ) + { + SelectObject( m_buffer ); + } + + ~wxBufferedDC() { + if( m_dc != 0 ) + UnMask(); + } + + + void Init( wxDC *dc, const wxBitmap &buffer ) { + wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap, + _T("wxBufferedDC already initialised") ); + m_dc = dc; + m_buffer = buffer; + SelectObject( m_buffer ); + } + + void Init( wxDC *dc, const wxSize &area ) { + wxASSERT_MSG( m_dc == 0 && m_buffer == wxNullBitmap, + _T("wxBufferedDC already initialised") ); + m_dc = dc; + m_buffer = wxBitmap( area.GetWidth(), area.GetHeight() ); + SelectObject( m_buffer ); + } - // preserve the old background: more time consuming - wxBUFFER_DC_PRESERVE_BG = 1, + void UnMask() { + wxASSERT_MSG( m_dc != 0, _T("No low level DC associated with buffer (anymore)") ); + m_dc->Blit( 0, 0, m_buffer.GetWidth(), m_buffer.GetHeight(), this, 0, 0 ); + m_dc = 0; + } +}; + + +class wxBufferedPaintDC : public wxBufferedDC +{ +private: + wxPaintDC m_paintdc; - // flags used by default - wxBUFFER_DC_DEFAULT = wxBUFFER_DC_OVERWRITE_BG +public: + wxBufferedPaintDC( wxWindow *window, const wxBitmap &buffer = wxNullBitmap ) + : m_paintdc( window ) + { + window->PrepareDC( m_paintdc ); + + if( buffer != wxNullBitmap ) + Init( &m_paintdc, buffer ); + else + Init( &m_paintdc, window->GetClientSize() ); + } + + ~wxBufferedPaintDC() { + UnMask(); + } }; +#endif +//-=-=-=-=-=-=-=-=-=-=- +%} + + + class wxBufferedDC : public wxMemoryDC { @@ -596,13 +677,17 @@ public: // Construct a wxBufferedDC with an internal buffer of 'area' // (where area is usually something like the size of the window // being buffered) - wxBufferedDC( wxDC *dc, const wxSize &area, int flags = wxBUFFER_DC_DEFAULT ); + wxBufferedDC( wxDC *dc, const wxSize &area ); // TODO: Keep this one too? - %pythonAppend wxBufferedDC( wxDC *dc, const wxSize &area, int flags = wxBUFFER_DC_DEFAULT ) + %pythonAppend wxBufferedDC( wxDC *dc, const wxSize &area ) "val._dc = args[0] # save a ref so the other dc will not be deleted before self"; - %name(BufferedDCInternalBuffer) wxBufferedDC( wxDC *dc, const wxSize &area, int flags = wxBUFFER_DC_DEFAULT ); + %name(BufferedDCInternalBuffer) wxBufferedDC( wxDC *dc, const wxSize &area ); + + + // The buffer is blit to the real DC when the BufferedDC is destroyed. + ~wxBufferedDC(); // Blits the buffer to the dc, and detaches the dc from @@ -614,16 +699,16 @@ public: }; + + +// Creates a double buffered wxPaintDC, optionally allowing the +// user to specify their own buffer to use. class wxBufferedPaintDC : public wxBufferedDC { public: - %nokwargs wxBufferedPaintDC; - - wxBufferedPaintDC( wxWindow *window, const wxBitmap &buffer ); - - // this ctor creates a bitmap of the size of the window for buffering - wxBufferedPaintDC(wxWindow *window, int flags = wxBUFFER_DC_DEFAULT); + // If no bitmap is supplied by the user, a temporary one will be created. + wxBufferedPaintDC( wxWindow *window, const wxBitmap &buffer = wxNullBitmap ); };