diff options
author | Michael Stahl <mstahl@redhat.com> | 2013-06-24 19:50:30 +0200 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2013-06-24 20:17:43 +0200 |
commit | 38dcfadda85058a0ee87292c8943aec82e34b81e (patch) | |
tree | 1157a8d80f7f8927f0010d850d6bd7ac5275fbbb /svx/source/svdraw/sdrpaintwindow.cxx | |
parent | f022f39638fbe970f1b839c757dcccd3baa69445 (diff) |
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
Diffstat (limited to 'svx/source/svdraw/sdrpaintwindow.cxx')
-rw-r--r-- | svx/source/svdraw/sdrpaintwindow.cxx | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/svx/source/svdraw/sdrpaintwindow.cxx b/svx/source/svdraw/sdrpaintwindow.cxx index a550c9e0bf68..6abacc5089ed 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) |