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

Miklos Vajna vmiklos at collabora.co.uk
Thu Aug 6 09:13:16 PDT 2015


 vcl/source/control/edit.cxx |   21 +++++++++++++++++++++
 vcl/source/window/paint.cxx |   12 ------------
 2 files changed, 21 insertions(+), 12 deletions(-)

New commits:
commit f4a2c604c73337cd21cd98d975b4f2b943fbab60
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Aug 6 18:11:44 2015 +0200

    tdf#92982 vcl rendercontext: fix missing background repaint of Edit
    
    Change-Id: Ic45f65d10835eb39b6709e7adeed1392905ea631

diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx
index cb10b95..8d64c5e 100644
--- a/vcl/source/control/edit.cxx
+++ b/vcl/source/control/edit.cxx
@@ -1034,6 +1034,27 @@ void Edit::ImplClearBackground(vcl::RenderContext& rRenderContext, long nXStart,
 
     if( !(ImplUseNativeBorder(rRenderContext, GetStyle()) || IsPaintTransparent()))
         rRenderContext.Erase(aRect);
+    else if (SupportsDoubleBuffering() && mbIsSubEdit)
+    {
+        // ImplPaintBorder() is a NOP, we have a native border, and this is a sub-edit of a control.
+        // That means we have to draw the parent native widget to paint the edit area to clear our background.
+        long nLeft = mnXOffset + ImplGetExtraXOffset();
+        long nTop = ImplGetTextYPosition();
+        long nRight = GetOutputWidthPixel();
+        long nHeight = GetTextHeight();
+        Rectangle aEditArea(nLeft, nTop, nRight, nTop + nHeight);
+
+        ControlType aCtrlType = ImplGetNativeControlType();
+        ControlPart aCtrlPart = PART_ENTIRE_CONTROL;
+        Rectangle aCtrlRegion(0, 0, GetParent()->GetOutputWidthPixel(), GetParent()->GetOutputHeightPixel());
+        ControlState nState = ControlState::ENABLED;
+        ImplControlValue aControlValue;
+
+        rRenderContext.Push(PushFlags::CLIPREGION);
+        rRenderContext.SetClipRegion(vcl::Region(aEditArea));
+        rRenderContext.DrawNativeControl(aCtrlType, aCtrlPart, aCtrlRegion, nState, aControlValue, OUString());
+        rRenderContext.Pop();
+    }
 }
 
 void Edit::ImplPaintBorder(vcl::RenderContext& rRenderContext, long nXStart, long nXEnd)
diff --git a/vcl/source/window/paint.cxx b/vcl/source/window/paint.cxx
index c0ba70a..5e83a00 100644
--- a/vcl/source/window/paint.cxx
+++ b/vcl/source/window/paint.cxx
@@ -190,18 +190,6 @@ void PaintHelper::StartBufferedPaint()
     ImplFrameData* pFrameData = m_pWindow->mpWindowImpl->mpFrameData;
     assert(!pFrameData->mbInBufferedPaint);
 
-    // Instead of creating a new VirtualDevice, just erase the area we'll be
-    // painting over, as VirtualDevice::ImplInitVirDev() would do.
-    // The painted area is m_aPaintRect, or in case it's empty, then the whole window.
-    pFrameData->mpBuffer->SetBackground(Wallpaper(Color(COL_WHITE)));
-    {
-        PaintBufferGuard g(pFrameData, m_pWindow);
-        if (m_aPaintRect.IsEmpty())
-            pFrameData->mpBuffer->Erase(Rectangle(Point(0, 0), m_pWindow->GetOutputSize()));
-        else
-            pFrameData->mpBuffer->Erase(m_aPaintRect);
-    }
-
     pFrameData->mbInBufferedPaint = true;
     m_bStartedBufferedPaint = true;
 }


More information about the Libreoffice-commits mailing list