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())
