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

Jan-Marek Glogowski (via logerrit) logerrit at kemper.freedesktop.org
Tue Apr 27 00:59:15 UTC 2021


 sw/source/core/layout/layact.cxx |   57 +++++++++++++++------------------------
 1 file changed, 23 insertions(+), 34 deletions(-)

New commits:
commit ec36122b8baba9758705383559246bcb91991c98
Author:     Jan-Marek Glogowski <glogow at fbihome.de>
AuthorDate: Fri Apr 16 23:04:08 2021 +0200
Commit:     Jan-Marek Glogowski <glogow at fbihome.de>
CommitDate: Tue Apr 27 02:58:36 2021 +0200

    SW layout: convert XCHECKPAGE to lambda
    
    Some refactoring, better to debug then preprocessor macro code.
    
    Change-Id: If2e8b126915b97dfa1d132713a57948993eace15
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/114678
    Tested-by: Jenkins
    Reviewed-by: Jan-Marek Glogowski <glogow at fbihome.de>

diff --git a/sw/source/core/layout/layact.cxx b/sw/source/core/layout/layact.cxx
index d5d9eaf55c39..a54c20d6e7cf 100644
--- a/sw/source/core/layout/layact.cxx
+++ b/sw/source/core/layout/layact.cxx
@@ -67,16 +67,6 @@
 #include <vector>
 #include <tools/diagnose_ex.h>
 
-// Save some typing work to avoid accessing destroyed pages.
-#define XCHECKPAGE \
-            {   if ( IsAgain() ) \
-                { \
-                    if( bNoLoop ) \
-                        rLayoutAccess.GetLayouter()->EndLoopControl(); \
-                    return; \
-                } \
-            }
-
 void SwLayAction::CheckWaitCursor()
 {
     if (IsReschedule())
@@ -449,8 +439,17 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
         pPage = static_cast<SwPageFrame*>(pPage->GetNext());
 
     IDocumentLayoutAccess& rLayoutAccess = m_pRoot->GetFormat()->getIDocumentLayoutAccess();
-    bool bNoLoop = pPage && SwLayouter::StartLoopControl( m_pRoot->GetFormat()->GetDoc(), pPage );
+    const bool bNoLoop = pPage && SwLayouter::StartLoopControl(m_pRoot->GetFormat()->GetDoc(), pPage);
     sal_uInt16 nPercentPageNum = 0;
+
+    auto lcl_isLayoutLooping = [&]()
+    {
+        const bool bAgain = this->IsAgain();
+        if (bAgain && bNoLoop)
+            rLayoutAccess.GetLayouter()->EndLoopControl();
+        return bAgain;
+    };
+
     while ( (pPage && !IsInterrupt()) || m_nCheckPageNum != USHRT_MAX )
     {
         // note: this is the only place that consumes and resets m_nCheckPageNum
@@ -488,7 +487,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
         if ( !IsIdle() && !IsComplete() && IsShortCut( pPage ) )
         {
             m_pRoot->DeleteEmptySct();
-            XCHECKPAGE;
+            if (lcl_isLayoutLooping()) return;
             if ( !IsInterrupt() &&
                  (m_pRoot->IsSuperfluous() || m_pRoot->IsAssertFlyPages()) )
             {
@@ -500,12 +499,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
                     m_pRoot->RemoveSuperfluous();
                     m_bAgain = bOld;
                 }
-                if ( IsAgain() )
-                {
-                    if( bNoLoop )
-                        rLayoutAccess.GetLayouter()->EndLoopControl();
-                    return;
-                }
+                if (lcl_isLayoutLooping()) return;
                 pPage = static_cast<SwPageFrame*>(m_pRoot->Lower());
                 while ( pPage && !pPage->IsInvalid() && !pPage->IsInvalidFly() )
                     pPage = static_cast<SwPageFrame*>(pPage->GetNext());
@@ -519,7 +513,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
         else
         {
             m_pRoot->DeleteEmptySct();
-            XCHECKPAGE;
+            if (lcl_isLayoutLooping()) return;
 
             while ( !IsInterrupt() && !IsNextCycle() &&
                     ((pPage->GetSortedObjs() && pPage->IsInvalidFly()) || pPage->IsInvalid()) )
@@ -539,7 +533,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
                           (pPage->GetSortedObjs() && pPage->IsInvalidFly()) ) )
                 {
                     PROTOCOL( pPage, PROT::FileInit, DbgAction::NONE, nullptr)
-                    XCHECKPAGE;
+                    if (lcl_isLayoutLooping()) return;
 
                     // new loop control
                     int nLoopControlRuns_1 = 0;
@@ -556,7 +550,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
                         }
 
                         FormatLayout( pRenderContext, pPage );
-                        XCHECKPAGE;
+                        if (lcl_isLayoutLooping()) return;
                     }
                     // change condition
                     if ( !IsNextCycle() &&
@@ -569,7 +563,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
                         pPage->ValidateFlyContent();
                         if ( !FormatContent( pPage ) )
                         {
-                            XCHECKPAGE;
+                            if (lcl_isLayoutLooping()) return;
                             pPage->InvalidateContent();
                             pPage->InvalidateFlyInCnt();
                             pPage->InvalidateFlyLayout();
@@ -586,7 +580,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
             }
 
             // A previous page may be invalid again.
-            XCHECKPAGE;
+            if (lcl_isLayoutLooping()) return;
             if ( !pPage->GetSortedObjs() )
             {
                 // If there are no (more) Flys, the flags are superfluous.
@@ -647,12 +641,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
                 m_pRoot->RemoveSuperfluous();
                 m_bAgain = bOld;
             }
-            if ( IsAgain() )
-            {
-                if( bNoLoop )
-                    rLayoutAccess.GetLayouter()->EndLoopControl();
-                return;
-            }
+            if (lcl_isLayoutLooping()) return;
             pPage = static_cast<SwPageFrame*>(m_pRoot->Lower());
             while ( pPage && !pPage->IsInvalid() && !pPage->IsInvalidFly() )
                 pPage = static_cast<SwPageFrame*>(pPage->GetNext());
@@ -680,7 +669,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
         // register itself, because it's (LayoutFrame) flags have been reset
         // already - the border of the page will never be painted.
         SwPageFrame *pPg = pPage;
-        XCHECKPAGE;
+        if (lcl_isLayoutLooping()) return;
         const SwRect &rVis = m_pImp->GetShell()->VisArea();
 
         while( pPg && pPg->getFrameArea().Bottom() < rVis.Top() )
@@ -699,7 +688,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
         {
             unlockPositionOfObjects( pPg );
 
-            XCHECKPAGE;
+            if (lcl_isLayoutLooping()) return;
 
             // new loop control
             int nLoopControlRuns_2 = 0;
@@ -713,7 +702,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
                         ( pPg->GetSortedObjs() && pPg->IsInvalidFly() ) ) ) ||
                     ( !mbFormatContentOnInterrupt && pPg->IsInvalidLayout() ) )
             {
-                XCHECKPAGE;
+                if (lcl_isLayoutLooping()) return;
                 // format also at-page anchored objects
                 SwObjectFormatter::FormatObjsAtFrame( *pPg, *pPg, this );
                 if ( !pPg->GetSortedObjs() )
@@ -736,7 +725,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
                     }
 
                     FormatLayout( pRenderContext, pPg );
-                    XCHECKPAGE;
+                    if (lcl_isLayoutLooping()) return;
                 }
 
                 if ( mbFormatContentOnInterrupt &&
@@ -756,7 +745,7 @@ void SwLayAction::InternalAction(OutputDevice* pRenderContext)
 
                     if ( !FormatContent( pPg ) )
                     {
-                        XCHECKPAGE;
+                        if (lcl_isLayoutLooping()) return;
                         pPg->InvalidateContent();
                         pPg->InvalidateFlyInCnt();
                         pPg->InvalidateFlyLayout();


More information about the Libreoffice-commits mailing list