sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx |   18 +++++++++++++++---
 sw/source/writerfilter/dmapper/PropertyMap.cxx       |   18 +++++++++++++++---
 2 files changed, 30 insertions(+), 6 deletions(-)

New commits:
commit ccb557636ea87a40d5fcc370b7434029c0153588
Author:     Noel Grandin <[email protected]>
AuthorDate: Tue Jun 25 20:01:47 2024 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Wed Jun 26 11:11:17 2024 +0200

    speed up complex doc with lots of footers/headers
    
    setting the header/footer property values is extremely expensive, so
    check before setting them.
    
    Shaves 30% off the load time of a large DOCX
    
    Change-Id: I7ac61434b8b4f59e199620dfcc11680164efe203
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/169532
    Reviewed-by: Noel Grandin <[email protected]>
    Tested-by: Jenkins

diff --git a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx 
b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
index 8bb8da5b1db1..4053baee1164 100644
--- a/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
+++ b/sw/source/writerfilter/dmapper/DomainMapper_Impl.cxx
@@ -3830,13 +3830,25 @@ void 
DomainMapper_Impl::PushPageHeaderFooter(PagePartType ePagePartType, PageTyp
 
     try
     {
+        // Note that the header property calls are very expensive, hence the 
need to check if the property needs
+        // setting before calling setPropertyValue.
+
         // Turn on the headers
-        xPageStyle->setPropertyValue(getPropertyName(ePropIsOn), 
uno::Any(true));
+        bool bPropIsOn = false;
+        xPageStyle->getPropertyValue(getPropertyName(ePropIsOn)) >>= bPropIsOn;
+        if (!bPropIsOn)
+            xPageStyle->setPropertyValue(getPropertyName(ePropIsOn), 
uno::Any(true));
 
         // Set both sharing left and first to off so we can import the content 
regardless of what value
         // the "titlePage" or "evenAndOdd" flags are set (which decide what 
the sharing is set to in the document).
-        xPageStyle->setPropertyValue(getPropertyName(ePropShared), 
uno::Any(false));
-        xPageStyle->setPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED), 
uno::Any(false));
+        bool bPropShared = false;
+        xPageStyle->getPropertyValue(getPropertyName(ePropShared)) >>= 
bPropShared;
+        if (bPropShared)
+            xPageStyle->setPropertyValue(getPropertyName(ePropShared), 
uno::Any(false));
+        bool bFirstShared = false;
+        xPageStyle->getPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED)) 
>>= bFirstShared;
+        if (bFirstShared)
+            
xPageStyle->setPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED), 
uno::Any(false));
 
         if (eType == PageType::LEFT)
         {
diff --git a/sw/source/writerfilter/dmapper/PropertyMap.cxx 
b/sw/source/writerfilter/dmapper/PropertyMap.cxx
index 3d071ff427bd..91d7acc7f4ca 100644
--- a/sw/source/writerfilter/dmapper/PropertyMap.cxx
+++ b/sw/source/writerfilter/dmapper/PropertyMap.cxx
@@ -535,12 +535,21 @@ void 
SectionPropertyMap::setHeaderFooterProperties(DomainMapper_Impl& rDM_Impl)
 
     bool bHasHeader = false;
     bool bHasFooter = false;
+    bool bHeaderIsShared = false;
+    bool bFooterIsShared = false;
+    bool bFirstIsShared = false;
 
     const OUString& sHeaderIsOn = getPropertyName(PROP_HEADER_IS_ON);
     const OUString& sFooterIsOn = getPropertyName(PROP_FOOTER_IS_ON);
+    const OUString& sHeaderIsShared = getPropertyName(PROP_HEADER_IS_SHARED);
+    const OUString& sFooterIsShared = getPropertyName(PROP_FOOTER_IS_SHARED);
+    const OUString& sFirstIsShared = getPropertyName(PROP_FIRST_IS_SHARED);
 
     m_aPageStyle->getPropertyValue(sHeaderIsOn) >>= bHasHeader;
     m_aPageStyle->getPropertyValue(sFooterIsOn) >>= bHasFooter;
+    m_aPageStyle->getPropertyValue(sHeaderIsShared) >>= bHeaderIsShared;
+    m_aPageStyle->getPropertyValue(sFooterIsShared) >>= bFooterIsShared;
+    m_aPageStyle->getPropertyValue(sFirstIsShared) >>= bFirstIsShared;
 
     bool bEvenAndOdd = rDM_Impl.GetSettingsTable()->GetEvenAndOddHeaders();
 
@@ -576,9 +585,12 @@ void 
SectionPropertyMap::setHeaderFooterProperties(DomainMapper_Impl& rDM_Impl)
             SectionPropertyMap::removeXTextContent(xText);
     }
 
-    m_aPageStyle->setPropertyValue(getPropertyName(PROP_HEADER_IS_SHARED), 
uno::Any(!bEvenAndOdd));
-    m_aPageStyle->setPropertyValue(getPropertyName(PROP_FOOTER_IS_SHARED), 
uno::Any(!bEvenAndOdd));
-    m_aPageStyle->setPropertyValue(getPropertyName(PROP_FIRST_IS_SHARED), 
uno::Any(!m_bTitlePage));
+    if ( bHeaderIsShared != !bEvenAndOdd )
+        m_aPageStyle->setPropertyValue(sHeaderIsShared, 
uno::Any(!bEvenAndOdd));
+    if ( bFooterIsShared != !bEvenAndOdd )
+        m_aPageStyle->setPropertyValue(sFooterIsShared, 
uno::Any(!bEvenAndOdd));
+    if ( bFirstIsShared != !m_bTitlePage )
+        m_aPageStyle->setPropertyValue(sFirstIsShared, 
uno::Any(!m_bTitlePage));
 
     bool bHadFirstHeader = m_bHadFirstHeader && m_bTitlePage;
     if (bHasHeader && !bHadFirstHeader && !m_bHadLeftHeader && 
!m_bHadRightHeader && rDM_Impl.IsNewDoc())

Reply via email to