[Libreoffice-commits] core.git: vcl/source

Miklos Vajna vmiklos at collabora.co.uk
Wed Jul 8 07:38:55 PDT 2015


 vcl/source/window/paint.cxx |   14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

New commits:
commit b3e645cde951906d883f015d342f85fc0eedb2ec
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Wed Jul 8 16:36:28 2015 +0200

    vcl rendercontext: fix off-by-one error in PaintHelper::PaintBuffer()
    
    With this, Writer no longer has leftover 1-pixel-width/height lines on
    scrolling at the right/bottom of the SwEditWin area.
    
    The problem was that PaintBuffer() painted one less row/column of pixels
    than intended. This happened because Rectangle::GetSize() uses
    GetWidth() and GetHeight(), which return "bound2 - bound1 + 1", but
    because the map mode was in twips, the +1 had no effect.
    
    For example, if top=127 and bottom=762 in pixels, then the needed height
    is 636, but (assuming e.g. 96 DPI) counting 11430-1905+1 in twips, then
    converting to pixels is only 635, so the last row/column is not painted.
    
    Fix the problem by making sure that GetSize() is invoked on a rectangle
    that has the size in pixels, that's how e.g.
    SdrPreRenderDevice::OutputPreRenderDevice() uses DrawOutDev(), too.
    
    Change-Id: I6f8686e0a91ba402db93982c25be76992c260abe

diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index c8efe72..a47c042 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -182,7 +182,19 @@ void PaintHelper::PaintBuffer()
         m_pWindow->SetMapMode(m_aPaintRectMapMode);
         m_pBuffer->SetMapMode(m_aPaintRectMapMode);
 
-        m_pWindow->DrawOutDev(m_aPaintRect.TopLeft(), m_aPaintRect.GetSize(), m_aPaintRect.TopLeft(), m_aPaintRect.GetSize(), *m_pBuffer.get());
+        // Make sure that the +1 value GetSize() adds to the size is in pixels.
+        Size aPaintRectSize;
+        if (m_pWindow->GetMapMode().GetMapUnit() == MAP_PIXEL)
+        {
+            aPaintRectSize = m_aPaintRect.GetSize();
+        }
+        else
+        {
+            Rectangle aRectanglePixel = m_pWindow->LogicToPixel(m_aPaintRect);
+            aPaintRectSize = m_pWindow->PixelToLogic(aRectanglePixel.GetSize());
+        }
+
+        m_pWindow->DrawOutDev(m_aPaintRect.TopLeft(), aPaintRectSize, m_aPaintRect.TopLeft(), aPaintRectSize, *m_pBuffer.get());
     }
 }
 


More information about the Libreoffice-commits mailing list