sw/qa/core/data/ooxml/pass/tdf161139_orrick-org-min3.docx |binary sw/source/writerfilter/dmapper/PropertyMap.cxx | 43 ++++++++++---- 2 files changed, 32 insertions(+), 11 deletions(-)
New commits: commit e61a19f8fff727e691d0ab23e6e8642b9f63ecf7 Author: Justin Luth <jl...@mail.com> AuthorDate: Mon Aug 19 13:52:38 2024 -0400 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Tue Aug 20 12:25:05 2024 +0200 tdf#161139: add unit test to sw filters pass make CppunitTest_sw_filters_test Change-Id: I6764dfb19ec8af12da44821bf1a55ff300780369 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172051 Reviewed-by: Justin Luth <jl...@mail.com> Tested-by: Jenkins Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172100 diff --git a/sw/qa/core/data/ooxml/pass/tdf161139_orrick-org-min3.docx b/sw/qa/core/data/ooxml/pass/tdf161139_orrick-org-min3.docx new file mode 100644 index 000000000000..2f1634dd5480 Binary files /dev/null and b/sw/qa/core/data/ooxml/pass/tdf161139_orrick-org-min3.docx differ commit 08531dc6d94a4cd1b591bc6e72bff753605746d3 Author: Miklos Vajna <vmik...@collabora.com> AuthorDate: Tue Aug 6 08:30:22 2024 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Tue Aug 20 12:24:51 2024 +0200 Related: tdf#162295 DOCX import: optimize copying headers/footers The original DOCX bugdoc has 150 sections on 88 pages, which means that copyHeaderFooter() in the domain mapper is a significant cost. Setting a property on a page style involves making a copy of the SwPageDesc, working on that copy and then copying it back. Which means that setting UNO properties one by one vs working via setPropertyValues() is a big difference. - old cost: 11984 ms - new cost: 7764 ms (65% of baseline) Change-Id: Iea99fb3ad9d3e61494c9f012c4c7fa10cc7ab09d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171519 Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk> Tested-by: Jenkins Reviewed-by: Miklos Vajna <vmik...@collabora.com> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172050 diff --git a/sw/source/writerfilter/dmapper/PropertyMap.cxx b/sw/source/writerfilter/dmapper/PropertyMap.cxx index b0cefec30ad4..9dbf1c1eb47d 100644 --- a/sw/source/writerfilter/dmapper/PropertyMap.cxx +++ b/sw/source/writerfilter/dmapper/PropertyMap.cxx @@ -1039,11 +1039,22 @@ void copyHeaderFooter(const DomainMapper_Impl& rDM_Impl, xStyle->getPropertyValue(sHeaderIsOn) >>= bHasHeader; xStyle->getPropertyValue(sFooterIsOn) >>= bHasFooter; - xStyle->setPropertyValue(sHeaderIsOn, uno::Any(bPreviousHasHeader || bHasHeader)); - xStyle->setPropertyValue(sFooterIsOn, uno::Any(bPreviousHasFooter || bHasFooter)); - xStyle->setPropertyValue(sHeaderIsShared, uno::Any(false)); - xStyle->setPropertyValue(sFooterIsShared, uno::Any(false)); - xStyle->setPropertyValue(sFirstIsShared, uno::Any(false)); + // Set all properties at once before the copy, to avoid needless SwPageDesc copying. + uno::Sequence<OUString> aNames = { + sHeaderIsOn, + sFooterIsOn, + sHeaderIsShared, + sFooterIsShared, + sFirstIsShared, + }; + uno::Sequence<uno::Any> aValues = { + uno::Any(bPreviousHasHeader || bHasHeader), + uno::Any(bPreviousHasFooter || bHasFooter), + uno::Any(false), + uno::Any(false), + uno::Any(false), + }; + xStyle->setPropertyValues(aNames, aValues); if (bPreviousHasHeader && bCopyHeader) { @@ -1065,12 +1076,22 @@ void copyHeaderFooter(const DomainMapper_Impl& rDM_Impl, copyHeaderFooterTextProperty(xPreviousStyle, xStyle, PROP_FOOTER_TEXT_FIRST); } - xStyle->setPropertyValue(sHeaderIsOn, uno::Any(bPreviousHasHeader || bHasHeader)); - xStyle->setPropertyValue(sFooterIsOn, uno::Any(bPreviousHasFooter || bHasFooter)); - - xStyle->setPropertyValue(sHeaderIsShared, uno::Any(!bEvenAndOdd)); - xStyle->setPropertyValue(sFooterIsShared, uno::Any(!bEvenAndOdd)); - xStyle->setPropertyValue(sFirstIsShared, uno::Any(!bTitlePage)); + // Set all properties at once after the copy, to avoid needless SwPageDesc copying. + aNames = { + sHeaderIsOn, + sFooterIsOn, + sHeaderIsShared, + sFooterIsShared, + sFirstIsShared, + }; + aValues = { + uno::Any(bPreviousHasHeader || bHasHeader), + uno::Any(bPreviousHasFooter || bHasFooter), + uno::Any(!bEvenAndOdd), + uno::Any(!bEvenAndOdd), + uno::Any(!bTitlePage), + }; + xStyle->setPropertyValues(aNames, aValues); } } // end anonymous namespace