[Libreoffice-commits] core.git: Branch 'aoo/trunk' - sw/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Aug 1 06:10:16 UTC 2018


 sw/source/core/inc/cntfrm.hxx    |   11 +++++++++++
 sw/source/core/layout/tabfrm.cxx |    6 +++---
 2 files changed, 14 insertions(+), 3 deletions(-)

New commits:
commit 9c7171a1aa94068fd9df3f5dc47f836a95d27546
Author:     Don Lewis <truckman at apache.org>
AuthorDate: Wed Aug 1 04:58:36 2018 +0000
Commit:     Don Lewis <truckman at apache.org>
CommitDate: Wed Aug 1 04:58:36 2018 +0000

    Fix SwCntntFrm::CalcLowers() so that it visits all on-page objects.
    
    SwCntntFrm::CalcLowers() walks the object tree walk and it assumes
    that the objects visited will be at a monotonically increasing
    distance from the top of the page, so it terminates the walk once
    it encounters the first object below the bottom of the page.  Even
    though the objects are vertically sorted in each branch of the tree,
    there is no guarantee that the order of the objects visited in the
    depth-first walk will be perfectly sorted vertically, so the walk
    may terminate before visiting all of the objects on the page.  Fix
    this problem by pruning branches when they cross the lower page
    boundary and only terminating the walk once there are no longer any
    paths forward.

diff --git a/sw/source/core/inc/cntfrm.hxx b/sw/source/core/inc/cntfrm.hxx
index d3ace06bca53..7ee16e55b539 100644
--- a/sw/source/core/inc/cntfrm.hxx
+++ b/sw/source/core/inc/cntfrm.hxx
@@ -103,6 +103,7 @@ public:
     sal_Bool MoveFtnCntFwd( sal_Bool, SwFtnBossFrm* );//von MoveFwd gerufen bei Ftn-Inhalt
 
     inline  SwCntntFrm* GetNextCntntFrm() const;
+    inline  SwCntntFrm* GetNextCntntFrm( bool ) const;
     inline  SwCntntFrm* GetPrevCntntFrm() const;
     static bool CalcLowers( SwLayoutFrm* pLay, const SwLayoutFrm* pDontLeave, long nBottom, bool bSkipRowSpanCells );
     void RegisterToNode( SwCntntNode& );
@@ -117,6 +118,16 @@ inline SwCntntFrm* SwCntntFrm::GetNextCntntFrm() const
         return (SwCntntFrm*)ImplGetNextCntntFrm( true );
 }
 
+inline SwCntntFrm* SwCntntFrm::GetNextCntntFrm( bool bPrune ) const
+{
+    if ( bPrune && !GetPrev() )
+        return NULL;
+    else if ( bPrune || !(GetNext() && GetNext()->IsCntntFrm()))
+        return (SwCntntFrm*)ImplGetNextCntntFrm( true );
+    else
+        return (SwCntntFrm*)GetNext();
+}
+
 inline SwCntntFrm* SwCntntFrm::GetPrevCntntFrm() const
 {
     if ( GetPrev() && GetPrev()->IsCntntFrm() )
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index ae435dfb4287..18fc3843f618 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -1536,6 +1536,7 @@ bool SwCntntFrm::CalcLowers( SwLayoutFrm* pLay, const SwLayoutFrm* pDontLeave,
     // LONG_MAX == nBottom means we have to calculate all
     bool bAll = LONG_MAX == nBottom;
     bool bRet = sal_False;
+    bool bPrune;
     SwCntntFrm *pCnt = pLay->ContainsCntnt();
     SWRECTFN( pLay )
 
@@ -1612,9 +1613,8 @@ bool SwCntntFrm::CalcLowers( SwLayoutFrm* pLay, const SwLayoutFrm* pDontLeave,
             pCnt->GetUpper()->Calc();
         }
         // <--
-        if( ! bAll && (*fnRect->fnYDiff)((pCnt->Frm().*fnRect->fnGetTop)(), nBottom) > 0 )
-            break;
-        pCnt = pCnt->GetNextCntntFrm();
+        bPrune = !bAll && ( (*fnRect->fnYDiff)((pCnt->Frm().*fnRect->fnGetTop)(), nBottom) > 0 );
+        pCnt = pCnt->GetNextCntntFrm( bPrune );
     }
     return bRet;
 }


More information about the Libreoffice-commits mailing list