Kaydet (Commit) 5563bc7d authored tarafından Miklos Vajna's avatar Miklos Vajna Kaydeden (comit) Andras Timar

tdf#93364 vcl rendercontext: fix area that is painted in PaintBuffer()

Usually the topmost window of a paint hierarchy has a paint rectangle
that covers the paint rectangle of all its children, but this is not
necessarly true in every case. One example is the cursor travelling
described in the bug report, where the topmost DockingAreaWindow only
paints a few buttons on the toolbar, and then even if children are
painted correctly to the frame-level persistent buffer, only the
DockingAreaWindow part of the buffer is copied to the screen.

Fix this by building an union rectangle that covers all areas in a
buffered paint run, and then paint that rectangle from the buffer, not
just the paint rectangle of the topmost parent.

Change-Id: Ib0b30413d83c4b3fdec27fa7ddad16c21fd094b6
(cherry picked from commit 7305941b)
Reviewed-on: https://gerrit.libreoffice.org/17664Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarTor Lillqvist <tml@collabora.com>
Tested-by: 's avatarTor Lillqvist <tml@collabora.com>
üst b9e24ca6
......@@ -177,6 +177,7 @@ struct ImplFrameData
bool mbInternalDragGestureRecognizer;
VclPtr<VirtualDevice> mpBuffer; ///< Buffer for the double-buffering
bool mbInBufferedPaint; ///< PaintHelper is in the process of painting into this buffer.
Rectangle maBufferedRect; ///< Rectangle in the buffer that has to be painted to the screen.
};
struct ImplAccessibleInfos
......
......@@ -228,6 +228,7 @@ void PaintHelper::StartBufferedPaint()
assert(!pFrameData->mbInBufferedPaint);
pFrameData->mbInBufferedPaint = true;
pFrameData->maBufferedRect = Rectangle();
m_bStartedBufferedPaint = true;
}
......@@ -238,7 +239,7 @@ void PaintHelper::PaintBuffer()
assert(m_bStartedBufferedPaint);
PaintBufferGuard aGuard(pFrameData, m_pWindow);
aGuard.SetPaintRect(m_aPaintRect);
aGuard.SetPaintRect(pFrameData->maBufferedRect);
}
void PaintHelper::DoPaint(const vcl::Region* pRegion)
......@@ -290,6 +291,7 @@ void PaintHelper::DoPaint(const vcl::Region* pRegion)
m_pWindow->PushPaintHelper(this, *pFrameData->mpBuffer.get());
m_pWindow->Paint(*pFrameData->mpBuffer.get(), m_aPaintRect);
pFrameData->maBufferedRect.Union(m_aPaintRect);
}
else
{
......@@ -551,6 +553,7 @@ PaintHelper::~PaintHelper()
{
PaintBuffer();
pFrameData->mbInBufferedPaint = false;
pFrameData->maBufferedRect = Rectangle();
}
// #98943# draw toolbox selection
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment