Reverted wxBuffered[Paint]DC to nearly the pre 2.7.1 state, kept
wxAutoBufferedPaintDC and added wxAutoBufferedPaintDCFactory. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41992 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -34,104 +34,7 @@
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ============================================================================
|
||||
// wxSharedDCBufferManager
|
||||
// Helper class to free shared buffer when the app exists.
|
||||
// ============================================================================
|
||||
|
||||
class wxSharedDCBufferManager
|
||||
{
|
||||
friend class wxBufferedDC;
|
||||
public:
|
||||
|
||||
wxSharedDCBufferManager()
|
||||
{
|
||||
m_buffer = NULL;
|
||||
}
|
||||
|
||||
~wxSharedDCBufferManager()
|
||||
{
|
||||
delete m_buffer;
|
||||
}
|
||||
|
||||
wxBitmap* GetBuffer(wxWindow* win, const wxSize& area)
|
||||
{
|
||||
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() )
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
return m_buffer;
|
||||
}
|
||||
|
||||
private:
|
||||
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()
|
||||
{
|
||||
if ( m_buffer )
|
||||
{
|
||||
wxDC* bufferDc = DetachDC();
|
||||
|
||||
wxASSERT( bufferDc->IsKindOf(CLASSINFO(wxMemoryDC)) );
|
||||
|
||||
if (m_mainDc)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
void wxBufferedDC::PrepareBuffer(wxWindow* win, const wxSize& area)
|
||||
{
|
||||
m_buffer = gs_sharedDCBufferManager.GetBuffer(win, area);
|
||||
}
|
||||
|
||||
void wxBufferedDC::UseBuffer()
|
||||
{
|
||||
wxASSERT(m_buffer);
|
||||
|
||||
wxMemoryDC* memoryDc = m_mainDc ? new wxMemoryDC(m_mainDc): new wxMemoryDC();
|
||||
memoryDc->SelectObject(*m_buffer);
|
||||
|
||||
AttachDC(memoryDc);
|
||||
}
|
||||
|
||||
// This file is intentionally empty. It has not been removed in case another
|
||||
// wxBufferedDC reimplementation is attempted in the near future. If not then
|
||||
// this file can be removed and the bakefiles updated.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user