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 <mst...@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 <tbehr...@suse.com> Tested-by: Thorsten Behrens <tbehr...@suse.com> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@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); } }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits