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:
parent
dab0a95bab
commit
0681e07a14
@ -134,6 +134,8 @@ private:
|
||||
// the buffering style
|
||||
int m_style;
|
||||
|
||||
wxSize m_area;
|
||||
|
||||
DECLARE_DYNAMIC_CLASS(wxBufferedDC)
|
||||
wxDECLARE_NO_COPY_CLASS(wxBufferedDC);
|
||||
};
|
||||
|
@ -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 )
|
||||
|
Loading…
Reference in New Issue
Block a user