X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2e992e06a71d90f1df597441af36f69ef390089a..80a779275ae04443c568dca919adb26cf6f5002c:/src/common/dcbufcmn.cpp?ds=sidebyside diff --git a/src/common/dcbufcmn.cpp b/src/common/dcbufcmn.cpp index fe80752412..eeea10859f 100644 --- a/src/common/dcbufcmn.cpp +++ b/src/common/dcbufcmn.cpp @@ -44,93 +44,45 @@ class wxSharedDCBufferManager friend class wxBufferedDC; public: - wxSharedDCBufferManager() - { - m_buffer = NULL; - } - - ~wxSharedDCBufferManager() - { - delete m_buffer; - } + wxSharedDCBufferManager() { } + ~wxSharedDCBufferManager() { } - wxBitmap* GetBuffer(wxWindow* win, const wxSize& area) + wxBitmap* GetBuffer(int w, int h) { - int width = area.x; - int height = area.y; - - if ( width <= 0 ) - win->GetClientSize(&width, &height); - - if ( !m_buffer || - width > m_buffer->GetWidth() || - height > m_buffer->GetHeight() ) + if ( !m_buffer.IsOk() || + w > m_buffer.GetWidth() || + h > m_buffer.GetHeight() ) { - delete m_buffer; - // Create slightly larger bitmap so we don't need to // be reallocating constantly when the user enlarges // the frame for the first time. - m_buffer = new wxBitmap(width+20, height+20); + m_buffer = wxBitmap(w, h); } - return m_buffer; + return &m_buffer; } private: - wxBitmap* m_buffer; + wxBitmap m_buffer; }; static wxSharedDCBufferManager gs_sharedDCBufferManager; + // ============================================================================ // wxBufferedDC // ============================================================================ -// Blits the buffer to the dc, and detaches the dc from the buffer (so it -// can be effectively used once only). -// -// Usually called in the dtor or by the dtor of derived classes if the -// BufferedDC must blit before the derived class (which may own the dc it's -// blitting to) is destroyed. -void wxBufferedDC::UnMask() +void wxBufferedDC::UseBuffer(wxCoord w, wxCoord h) { - if ( m_buffer ) + if ( !m_buffer ) { - wxASSERT_MSG( m_mainDc != NULL, - _T("No underlying DC associated with wxBufferedDC (anymore)") ); - - wxDC* bufferDc = DetachDC(); - - wxASSERT( bufferDc->IsKindOf(CLASSINFO(wxMemoryDC)) ); + if ( w == -1 || h == -1 ) + m_dc->GetSize(&w, &h); - wxCoord x=0, y=0; - - if (m_style & wxBUFFER_CLIENT_AREA) - bufferDc->GetDeviceOrigin(& x, & y); - - m_mainDc->Blit( 0, 0, - m_buffer->GetWidth(), m_buffer->GetHeight(), bufferDc, - -x, -y ); - m_mainDc = NULL; - m_buffer = NULL; - delete bufferDc; + m_buffer = gs_sharedDCBufferManager.GetBuffer(w, h); } -} - -void wxBufferedDC::PrepareBuffer(wxWindow* win, const wxSize& area) -{ - m_buffer = gs_sharedDCBufferManager.GetBuffer(win, area); -} - -void wxBufferedDC::UseBuffer() -{ - wxASSERT(m_buffer); - wxMemoryDC* memoryDc = new wxMemoryDC(m_mainDc); - memoryDc->SelectObject(*m_buffer); - - AttachDC(memoryDc); + SelectObject(*m_buffer); } -