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:
@@ -134,6 +134,8 @@ private:
|
|||||||
// the buffering style
|
// the buffering style
|
||||||
int m_style;
|
int m_style;
|
||||||
|
|
||||||
|
wxSize m_area;
|
||||||
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxBufferedDC)
|
DECLARE_DYNAMIC_CLASS(wxBufferedDC)
|
||||||
wxDECLARE_NO_COPY_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_buffer = wxSharedDCBufferManager::GetBuffer(w, h);
|
||||||
m_style |= wxBUFFER_USES_SHARED_BUFFER;
|
m_style |= wxBUFFER_USES_SHARED_BUFFER;
|
||||||
|
m_area.Set(w,h);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
m_area = m_buffer->GetSize();
|
||||||
|
|
||||||
SelectObject(*m_buffer);
|
SelectObject(*m_buffer);
|
||||||
|
|
||||||
@@ -138,21 +141,24 @@ void wxBufferedDC::UnMask()
|
|||||||
if ( m_style & wxBUFFER_CLIENT_AREA )
|
if ( m_style & wxBUFFER_CLIENT_AREA )
|
||||||
GetDeviceOrigin(&x, &y);
|
GetDeviceOrigin(&x, &y);
|
||||||
|
|
||||||
// avoid blitting too much: if we were created for a bigger bitmap (and
|
// It's possible that the buffer may be bigger than the area that needs to
|
||||||
// reused for a smaller one later) we should only blit the real bitmap area
|
// be drawn (the client size of the window is smaller than the bitmap, or
|
||||||
// and not the full allocated back buffer
|
// a shared bitmap has been reused for a smaller area, etc.) so avoid
|
||||||
int widthDC,
|
// blitting too much if possible, but only use the real DC size if the
|
||||||
heightDC;
|
// 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(),
|
m_dc->Blit(0, 0, width, height, this, -x, -y);
|
||||||
heightBuf = m_buffer->GetHeight();
|
|
||||||
|
|
||||||
m_dc->Blit(0, 0,
|
|
||||||
wxMin(widthDC, widthBuf), wxMin(heightDC, heightBuf),
|
|
||||||
this,
|
|
||||||
-x, -y);
|
|
||||||
m_dc = NULL;
|
m_dc = NULL;
|
||||||
|
|
||||||
if ( m_style & wxBUFFER_USES_SHARED_BUFFER )
|
if ( m_style & wxBUFFER_USES_SHARED_BUFFER )
|
||||||
|
Reference in New Issue
Block a user