oox/source/core/filterbase.cxx | 7 +++++-- sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx | 14 ++++++++++---- sw/source/writerfilter/ooxml/OOXMLDocumentImpl.hxx | 5 ++++- 3 files changed, 19 insertions(+), 7 deletions(-)
New commits: commit eb318cfcc1c9c5bbad22c53af41fff615c984cca Author: Noel Grandin <[email protected]> AuthorDate: Thu Feb 12 13:10:13 2026 +0200 Commit: Miklos Vajna <[email protected]> CommitDate: Fri Feb 13 11:31:37 2026 +0100 tdf#170595 reduce the number of times we open and parse the zip.. file container from 851 to 8. This shaves 30% off the opening time. This requires that we (a) share the same instance of ShapeFilterBase in the child OODocumentImpl objects we create (b) and re-use the mxPackage in the FilterBase class, instead of re-opening the stream with a new OStorage object. Change-Id: I058bddd04e93e7200bf446f00b5a1c24201b9041 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199269 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Miklos Vajna <[email protected]> diff --git a/oox/source/core/filterbase.cxx b/oox/source/core/filterbase.cxx index 9c8cc11596e4..c71c85f49a17 100644 --- a/oox/source/core/filterbase.cxx +++ b/oox/source/core/filterbase.cxx @@ -465,7 +465,8 @@ sal_Bool SAL_CALL FilterBase::filter( const Sequence< PropertyValue >& rMediaDes throw RuntimeException(); bool bRet = false; - setMediaDescriptor( rMediaDescSeq ); + if (!mxImpl->mxStorage) + setMediaDescriptor( rMediaDescSeq ); DocumentOpenedGuard aOpenedGuard( mxImpl->maFileUrl ); if( aOpenedGuard.isValid() || mxImpl->maFileUrl.isEmpty() ) { @@ -480,7 +481,9 @@ sal_Bool SAL_CALL FilterBase::filter( const Sequence< PropertyValue >& rMediaDes case FILTERDIRECTION_UNKNOWN: break; case FILTERDIRECTION_IMPORT: - if( mxImpl->mxInStream.is() ) + if (mxImpl->mxStorage) + bRet = true; + else if( mxImpl->mxInStream.is() ) { mxImpl->mxStorage = implCreateStorage( mxImpl->mxInStream ); bRet = mxImpl->mxStorage && importDocument(); diff --git a/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx b/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx index 8caaddbc1e6a..ffba5bbbfbf7 100644 --- a/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx +++ b/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.cxx @@ -54,7 +54,11 @@ using namespace ::com::sun::star; namespace writerfilter::ooxml { -OOXMLDocumentImpl::OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream, uno::Reference<task::XStatusIndicator> xStatusIndicator, bool bSkipImages, const uno::Sequence<beans::PropertyValue>& rDescriptor) +OOXMLDocumentImpl::OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream, + uno::Reference<task::XStatusIndicator> xStatusIndicator, + bool bSkipImages, + const uno::Sequence<beans::PropertyValue>& rDescriptor, + const rtl::Reference<oox::shape::ShapeFilterBase>& rxShapeFilterBase) : mpStream(std::move(pStream)) , mxStatusIndicator(std::move(xStatusIndicator)) , mnXNoteId(0) @@ -67,6 +71,7 @@ OOXMLDocumentImpl::OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream, uno::Refere , m_rBaseURL(utl::MediaDescriptor(rDescriptor).getUnpackedValueOrDefault(u"DocumentBaseURL"_ustr, OUString())) , maMediaDescriptor(rDescriptor) , mxGraphicMapper(graphic::GraphicMapper::create(mpStream->getContext())) + , mxShapeFilterBase(rxShapeFilterBase) { pushShapeContext(); } @@ -248,7 +253,8 @@ OOXMLDocumentImpl::getSubStream(const OUString & rId) OOXMLDocumentImpl * pTemp; // Do not pass status indicator to sub-streams: they are typically marginal in size, so we just track the main document for now. writerfilter::Reference<Stream>::Pointer_t pRet( pTemp = - new OOXMLDocumentImpl(std::move(pStream), uno::Reference<task::XStatusIndicator>(), mbSkipImages, maMediaDescriptor)); + new OOXMLDocumentImpl(std::move(pStream), uno::Reference<task::XStatusIndicator>(), + mbSkipImages, maMediaDescriptor, getShapeFilterBase())); pTemp->setModel(mxModel); pTemp->setDrawPage(mxDrawPage); pTemp->mbIsSubstream = true; @@ -260,7 +266,7 @@ OOXMLDocumentImpl::getXNoteStream(OOXMLStream::StreamType_t nType, const sal_Int { // See above, no status indicator for the note stream, either. OOXMLDocumentImpl * pDocument = new OOXMLDocumentImpl(OOXMLDocumentFactory::createStream(mpStream, nType), - uno::Reference<task::XStatusIndicator>(), mbSkipImages, maMediaDescriptor); + uno::Reference<task::XStatusIndicator>(), mbSkipImages, maMediaDescriptor, nullptr); pDocument->setXNoteId(nId); pDocument->setModel(getModel()); pDocument->setDrawPage(getDrawPage()); @@ -919,7 +925,7 @@ OOXMLDocumentFactory::createDocument const uno::Reference<task::XStatusIndicator>& xStatusIndicator, bool mbSkipImages, const uno::Sequence<beans::PropertyValue>& rDescriptor) { - return new OOXMLDocumentImpl(pStream, xStatusIndicator, mbSkipImages, rDescriptor); + return new OOXMLDocumentImpl(pStream, xStatusIndicator, mbSkipImages, rDescriptor, nullptr); } } diff --git a/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.hxx b/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.hxx index 602432ddcf51..1bc9ced84ae2 100644 --- a/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.hxx +++ b/sw/source/writerfilter/ooxml/OOXMLDocumentImpl.hxx @@ -104,7 +104,10 @@ private: void resolveCommentsExtendedStream(Stream & rStream); public: - OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream, css::uno::Reference<css::task::XStatusIndicator> xStatusIndicator, bool bSkipImages, const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor); + OOXMLDocumentImpl(OOXMLStream::Pointer_t pStream, + css::uno::Reference<css::task::XStatusIndicator> xStatusIndicator, + bool bSkipImages, const css::uno::Sequence<css::beans::PropertyValue>& rDescriptor, + const rtl::Reference<oox::shape::ShapeFilterBase>& rxShapeFilterBase); virtual ~OOXMLDocumentImpl() override; virtual void resolve(Stream & rStream) override;
