[Libreoffice-commits] core.git: Branch 'libreoffice-4-0' - svx/inc svx/source sw/source

Michael Stahl mstahl at redhat.com
Thu Jun 27 12:12:59 PDT 2013


 svx/inc/svx/sdrpaintwindow.hxx                    |    6 ++++
 svx/source/sdr/overlay/overlaymanagerbuffered.cxx |   29 +++++-----------------
 svx/source/svdraw/sdrpaintwindow.cxx              |   27 ++++++++++++++++++++
 sw/source/core/view/viewsh.cxx                    |   28 +--------------------
 4 files changed, 42 insertions(+), 48 deletions(-)

New commits:
commit 904de3293692949eba25229b27a6e1afaabc183b
Author: Michael Stahl <mstahl at redhat.com>
Date:   Mon Jun 24 19:50:30 2013 +0200

    fdo#58029: replace quadratic child window loop with linear
    
    ... which should speed things up without introducing problems.
    
    (Window::GetChild(n) is inefficient because the children are a linked
    list)
    
    Change-Id: I343d51a6866c5014cbca4c256b0c15f938958c39
    (cherry picked from commit 38dcfadda85058a0ee87292c8943aec82e34b81e)
    Reviewed-on: https://gerrit.libreoffice.org/4491
    Reviewed-by: Thorsten Behrens <tbehrens at suse.com>
    Tested-by: Thorsten Behrens <tbehrens at suse.com>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/svx/inc/svx/sdrpaintwindow.hxx b/svx/inc/svx/sdrpaintwindow.hxx
index fa2f6e9..1eed124 100644
--- a/svx/inc/svx/sdrpaintwindow.hxx
+++ b/svx/inc/svx/sdrpaintwindow.hxx
@@ -41,6 +41,12 @@ namespace sdr
 #endif
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
+/// paint the transparent children of rWin that overlap rPixelRect
+/// (for example, transparent form controls like check boxes)
+void SVX_DLLPUBLIC
+PaintTransparentChildren(Window & rWindow, Rectangle const& rPixelRect);
+
+
 class SdrPreRenderDevice
 {
     // The original OutputDevice
diff --git a/svx/source/sdr/overlay/overlaymanagerbuffered.cxx b/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
index 64ac99d..56159a2 100644
--- a/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
+++ b/svx/source/sdr/overlay/overlaymanagerbuffered.cxx
@@ -18,6 +18,7 @@
  */
 
 #include <svx/sdr/overlay/overlaymanagerbuffered.hxx>
+#include <svx/sdrpaintwindow.hxx>
 #include <vcl/outdev.hxx>
 #include <basegfx/point/b2dpoint.hxx>
 #include <basegfx/range/b2drange.hxx>
@@ -349,28 +350,12 @@ namespace sdr
                 {
                     Window& rWindow = static_cast< Window& >(rmOutputDevice);
 
-                    if(rWindow.IsChildTransparentModeEnabled() && rWindow.GetChildCount())
-                    {
-                        const Rectangle aRegionRectanglePixel(
-                            maBufferRememberedRangePixel.getMinX(), maBufferRememberedRangePixel.getMinY(),
-                            maBufferRememberedRangePixel.getMaxX(), maBufferRememberedRangePixel.getMaxY());
-
-                        for(sal_uInt16 a(0); a < rWindow.GetChildCount(); a++)
-                        {
-                            Window* pCandidate = rWindow.GetChild(a);
-
-                            if(pCandidate && pCandidate->IsPaintTransparent())
-                            {
-                                const Rectangle aCandidatePosSizePixel(pCandidate->GetPosPixel(), pCandidate->GetSizePixel());
-
-                                if(aCandidatePosSizePixel.IsOver(aRegionRectanglePixel))
-                                {
-                                    pCandidate->Invalidate(INVALIDATE_NOTRANSPARENT|INVALIDATE_CHILDREN);
-                                    pCandidate->Update();
-                                }
-                            }
-                        }
-                    }
+                    const Rectangle aRegionRectanglePixel(
+                        maBufferRememberedRangePixel.getMinX(),
+                        maBufferRememberedRangePixel.getMinY(),
+                        maBufferRememberedRangePixel.getMaxX(),
+                        maBufferRememberedRangePixel.getMaxY());
+                    PaintTransparentChildren(rWindow, aRegionRectanglePixel);
                 }
 
                 // #i80730# restore visibility of VCL cursor
diff --git a/svx/source/svdraw/sdrpaintwindow.cxx b/svx/source/svdraw/sdrpaintwindow.cxx
index cf9548d..f5cedd8 100644
--- a/svx/source/svdraw/sdrpaintwindow.cxx
+++ b/svx/source/svdraw/sdrpaintwindow.cxx
@@ -23,6 +23,33 @@
 #include <vcl/gdimtf.hxx>
 #include <vcl/svapp.hxx>
 
+
+void PaintTransparentChildren(Window & rWindow, Rectangle const& rPixelRect)
+{
+    if (rWindow.IsChildTransparentModeEnabled())
+    {
+        Window * pCandidate = rWindow.GetWindow( WINDOW_FIRSTCHILD );
+        while (pCandidate)
+        {
+            if (pCandidate->IsPaintTransparent())
+            {
+                const Rectangle aCandidatePosSizePixel(
+                                pCandidate->GetPosPixel(),
+                                pCandidate->GetSizePixel());
+
+                if (aCandidatePosSizePixel.IsOver(rPixelRect))
+                {
+                    pCandidate->Invalidate(
+                        INVALIDATE_NOTRANSPARENT|INVALIDATE_CHILDREN );
+                    // important: actually paint the child here!
+                    pCandidate->Update();
+                }
+            }
+            pCandidate = pCandidate->GetWindow( WINDOW_NEXT );
+        }
+    }
+}
+
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 SdrPreRenderDevice::SdrPreRenderDevice(OutputDevice& rOriginal)
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index a3418ef..7f1c823 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -115,32 +115,8 @@ lcl_PaintTransparentFormControls(ViewShell & rShell, SwRect const& rRect)
     if (rShell.GetWin())
     {
         Window& rWindow = *(rShell.GetWin());
-        if (rWindow.IsChildTransparentModeEnabled())
-        {
-            Window * pCandidate = rWindow.GetWindow( WINDOW_FIRSTCHILD );
-            if (pCandidate)
-            {
-                const Rectangle aRectanglePixel(
-                            rWindow.LogicToPixel(rRect.SVRect()));
-                while (pCandidate)
-                {
-                    if (pCandidate->IsPaintTransparent())
-                    {
-                        const Rectangle aCandidatePosSizePixel(
-                                        pCandidate->GetPosPixel(),
-                                        pCandidate->GetSizePixel());
-
-                        if (aCandidatePosSizePixel.IsOver(aRectanglePixel))
-                        {
-                            pCandidate->Invalidate(
-                                INVALIDATE_NOTRANSPARENT|INVALIDATE_CHILDREN );
-                            pCandidate->Update();
-                        }
-                    }
-                    pCandidate = pCandidate->GetWindow( WINDOW_NEXT );
-                }
-            }
-        }
+        const Rectangle aRectanglePixel(rWindow.LogicToPixel(rRect.SVRect()));
+        PaintTransparentChildren(rWindow, aRectanglePixel);
     }
 }
 


More information about the Libreoffice-commits mailing list