Keep track of the area intended to be buffered, and use that in UnMask instead of defaulting to the buffer size. Only clip to the DC size if wxBUFFER_VIRTUAL_AREA is not set. This fixes the issue where buffering the full virtual area in a wxScrolledWindow would only draw an area the physical size of the window. Fixes #11612.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71704 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robin Dunn 2012-06-08 19:26:19 +00:00
parent dab0a95bab
commit 0681e07a14
2 changed files with 21 additions and 13 deletions

View File

@ -134,6 +134,8 @@ private:
// the buffering style
int m_style;
wxSize m_area;
DECLARE_DYNAMIC_CLASS(wxBufferedDC)
wxDECLARE_NO_COPY_CLASS(wxBufferedDC);
};

View File

@ -114,7 +114,10 @@ void wxBufferedDC::UseBuffer(wxCoord w, wxCoord h)
m_buffer = wxSharedDCBufferManager::GetBuffer(w, h);
m_style |= wxBUFFER_USES_SHARED_BUFFER;
m_area.Set(w,h);
}
else
m_area = m_buffer->GetSize();
SelectObject(*m_buffer);
@ -138,21 +141,24 @@ void wxBufferedDC::UnMask()
if ( m_style & wxBUFFER_CLIENT_AREA )
GetDeviceOrigin(&x, &y);
// avoid blitting too much: if we were created for a bigger bitmap (and
// reused for a smaller one later) we should only blit the real bitmap area
// and not the full allocated back buffer
int widthDC,
heightDC;
// It's possible that the buffer may be bigger than the area that needs to
// be drawn (the client size of the window is smaller than the bitmap, or
// a shared bitmap has been reused for a smaller area, etc.) so avoid
// blitting too much if possible, but only use the real DC size if the
// wxBUFFER_VIRTUAL_AREA style is not set.
int width = m_area.GetWidth(),
height = m_area.GetHeight();
m_dc->GetSize(&widthDC, &heightDC);
if (! m_style & wxBUFFER_VIRTUAL_AREA)
{
int widthDC,
heightDC;
m_dc->GetSize(&widthDC, &heightDC);
width = wxMin(width, widthDC);
height = wxMin(height, heightDC);
}
int widthBuf = m_buffer->GetWidth(),
heightBuf = m_buffer->GetHeight();
m_dc->Blit(0, 0,
wxMin(widthDC, widthBuf), wxMin(heightDC, heightBuf),
this,
-x, -y);
m_dc->Blit(0, 0, width, height, this, -x, -y);
m_dc = NULL;
if ( m_style & wxBUFFER_USES_SHARED_BUFFER )