From 4126c6b94e87f7ad2a1aa93d66bbb3edf67ec790 Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Mon, 25 Mar 2024 10:39:41 +0200 Subject: tdf#158556 speedup docx load If we want to know if an XText is a header/footer object, no need to loop over the draw objects, we can just query its service name. Reduces load time from 167s to 97s Change-Id: I10158c11dd24c4945b3ea6cfed4916717bd4f2f8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165269 Tested-by: Noel Grandin Reviewed-by: Noel Grandin (cherry picked from commit ab29c857c669bcca3d8eea8a5a9e6ad5eae622d7) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/165618 Tested-by: Jenkins Reviewed-by: Xisco Fauli --- writerfilter/source/dmapper/DomainMapper_Impl.cxx | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index 2b9091452dde..028b4b4c9aee 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -3793,26 +3793,14 @@ void DomainMapper_Impl::ConvertHeaderFooterToTextFrame(bool bDynamicHeightTop, b namespace { // Determines if the XText content is empty (no text, no shapes, no tables) -bool isContentEmpty(uno::Reference const& xText, uno::Reference const& xTextDocument) +bool isContentEmpty(uno::Reference const& xText) { if (!xText.is()) return true; // no XText means it's empty - uno::Reference xDrawPageSupplier(xTextDocument, uno::UNO_QUERY); - auto xDrawPage = xDrawPageSupplier->getDrawPage(); - if (xDrawPage && xDrawPage->hasElements()) - { - for (sal_Int32 i = 0; i < xDrawPage->getCount(); ++i) - { - uno::Reference xShape(xDrawPage->getByIndex(i), uno::UNO_QUERY); - if (xShape.is()) - { - uno::Reference xAnchor = xShape->getAnchor(); - if (xAnchor.is() && xAnchor->getText() == xText) - return false; - } - } - } + uno::Reference xTextServiceInfo(xText, uno::UNO_QUERY); + if (xTextServiceInfo && xTextServiceInfo->getImplementationName() == "SwXHeadFootText") + return false; uno::Reference xEnumAccess(xText->getText(), uno::UNO_QUERY); uno::Reference xEnum = xEnumAccess->createEnumeration(); @@ -3959,7 +3947,7 @@ void DomainMapper_Impl::checkIfHeaderFooterIsEmpty(PagePartType ePagePartType, P if (!xPageStyle.is()) return; - bool bEmpty = isContentEmpty(m_aTextAppendStack.top().xTextAppend, GetTextDocument()); + bool bEmpty = isContentEmpty(m_aTextAppendStack.top().xTextAppend); if (eType == PageType::FIRST && bEmpty) { -- cgit v1.2.3