[Libreoffice-commits] core.git: Branch 'libreoffice-5-0' - vcl/inc vcl/source

Miklos Vajna vmiklos at collabora.co.uk
Wed Aug 12 01:53:08 PDT 2015


 vcl/inc/window.h            |    1 +
 vcl/source/window/paint.cxx |    5 ++++-
 2 files changed, 5 insertions(+), 1 deletion(-)

New commits:
commit 05bbeebc44c34f4f8938840f96a52afeb4ac49a5
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Aug 11 17:39:58 2015 +0200

    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 7305941b150097123eab664f9ec9e5f3909a5c52)
    Reviewed-on: https://gerrit.libreoffice.org/17664
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tor Lillqvist <tml at collabora.com>
    Tested-by: Tor Lillqvist <tml at collabora.com>

diff --git a/vcl/inc/window.h b/vcl/inc/window.h
index 213e215..67d5f94 100644
--- a/vcl/inc/window.h
+++ b/vcl/inc/window.h
@@ -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
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index 19f5cdc..bc0050a 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -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


More information about the Libreoffice-commits mailing list