[Libreoffice-commits] core.git: include/oox oox/source writerfilter/source
Noel Grandin (via logerrit)
logerrit at kemper.freedesktop.org
Tue Jun 29 09:30:21 UTC 2021
include/oox/shape/ShapeContextHandler.hxx | 6 ++++--
oox/source/shape/ShapeContextHandler.cxx | 10 +++++-----
writerfilter/source/ooxml/OOXMLDocumentImpl.cxx | 8 ++++++++
writerfilter/source/ooxml/OOXMLDocumentImpl.hxx | 12 ++++++++++++
writerfilter/source/ooxml/OOXMLFastContextHandler.cxx | 14 +++++++++++++-
5 files changed, 42 insertions(+), 8 deletions(-)
New commits:
commit 97123add76b743013fc5c222387feb4b9c13daf2
Author: Noel Grandin <noel.grandin at collabora.co.uk>
AuthorDate: Tue Jun 29 08:19:12 2021 +0200
Commit: Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Tue Jun 29 11:29:48 2021 +0200
tdf#135316 share themePtr and ShapeFilterBase across all shapes
.. in a document.
Shavves 20% off my load time.
Change-Id: I8101b4d229485ebdef0c1f72f856e7cda43559d5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118045
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
diff --git a/include/oox/shape/ShapeContextHandler.hxx b/include/oox/shape/ShapeContextHandler.hxx
index 5655cc25acf2..39549c5d33af 100644
--- a/include/oox/shape/ShapeContextHandler.hxx
+++ b/include/oox/shape/ShapeContextHandler.hxx
@@ -50,8 +50,7 @@ class OOX_DLLPUBLIC ShapeContextHandler:
public ::cppu::WeakImplHelper< css::xml::sax::XFastContextHandler >
{
public:
- explicit ShapeContextHandler
- (css::uno::Reference< css::uno::XComponentContext > const & context);
+ explicit ShapeContextHandler(const rtl::Reference<ShapeFilterBase>& xFilterBase);
virtual ~ShapeContextHandler() override;
@@ -108,6 +107,9 @@ public:
void setGraphicMapper(css::uno::Reference<css::graphic::XGraphicMapper> const & rGraphicMapper);
+ void setTheme(const oox::drawingml::ThemePtr& pTheme) { mpThemePtr = pTheme; }
+ const oox::drawingml::ThemePtr& getTheme() { return mpThemePtr; }
+
private:
ShapeContextHandler(ShapeContextHandler const &) = delete;
void operator =(ShapeContextHandler const &) = delete;
diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx
index 3a0ed5a3a306..0d03d322d011 100644
--- a/oox/source/shape/ShapeContextHandler.cxx
+++ b/oox/source/shape/ShapeContextHandler.cxx
@@ -37,6 +37,7 @@
#include <oox/drawingml/themefragmenthandler.hxx>
#include <cppuhelper/supportsservice.hxx>
#include <memory>
+#include <sal/log.hxx>
using namespace ::com::sun::star;
@@ -44,9 +45,9 @@ namespace oox::shape {
using namespace core;
using namespace drawingml;
-ShapeContextHandler::ShapeContextHandler(uno::Reference< uno::XComponentContext > const & context) :
+ShapeContextHandler::ShapeContextHandler(const rtl::Reference<ShapeFilterBase>& xFilterBase) :
mnStartToken(0),
- mxShapeFilterBase( new ShapeFilterBase(context) )
+ mxShapeFilterBase(xFilterBase)
{
}
@@ -257,14 +258,13 @@ void SAL_CALL ShapeContextHandler::startFastElement
{
mxShapeFilterBase->filter(maMediaDescriptor);
- mpThemePtr = std::make_shared<Theme>();
-
if (Element == DGM_TOKEN(relIds) || Element == LC_TOKEN(lockedCanvas) || Element == C_TOKEN(chart) ||
Element == WPS_TOKEN(wsp) || Element == WPG_TOKEN(wgp) || Element == OOX_TOKEN(dmlPicture, pic))
{
// Parse the theme relation, if available; the diagram won't have colors without it.
- if (!msRelationFragmentPath.isEmpty())
+ if (!mpThemePtr && !msRelationFragmentPath.isEmpty())
{
+ mpThemePtr = std::make_shared<Theme>();
// Get Target for Type = "officeDocument" from _rels/.rels file
// aOfficeDocumentFragmentPath is pointing to "word/document.xml" for docx & to "ppt/presentation.xml" for pptx
FragmentHandlerRef rFragmentHandlerRef(new ShapeFragmentHandler(*mxShapeFilterBase, "/"));
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
index e0eb6bc48119..be397048df0f 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx
@@ -25,6 +25,7 @@
#include <com/sun/star/xml/dom/DocumentBuilder.hpp>
#include <com/sun/star/graphic/GraphicMapper.hpp>
#include <ooxml/resourceids.hxx>
+#include <oox/shape/ShapeFilterBase.hxx>
#include "OOXMLStreamImpl.hxx"
#include "OOXMLDocumentImpl.hxx"
#include "OOXMLBinaryObjectReference.hxx"
@@ -879,6 +880,13 @@ uno::Sequence<beans::PropertyValue > OOXMLDocumentImpl::getEmbeddingsList( )
return mxEmbeddingsList;
}
+const rtl::Reference<oox::shape::ShapeFilterBase>& OOXMLDocumentImpl::getShapeFilterBase()
+{
+ if (!mxShapeFilterBase)
+ mxShapeFilterBase = new oox::shape::ShapeFilterBase(mpStream->getContext());
+ return mxShapeFilterBase;
+}
+
OOXMLDocument *
OOXMLDocumentFactory::createDocument
(const OOXMLStream::Pointer_t& pStream,
diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
index c97c208534cf..5572d0c77d7b 100644
--- a/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
+++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.hxx
@@ -23,6 +23,8 @@
#include <com/sun/star/xml/dom/XDocument.hpp>
#include <com/sun/star/graphic/XGraphicMapper.hpp>
+#include <oox/drawingml/drawingmltypes.hxx>
+
#include "OOXMLPropertySet.hxx"
#include <vector>
@@ -66,6 +68,10 @@ class OOXMLDocumentImpl : public OOXMLDocument
css::uno::Sequence<css::beans::PropertyValue> maMediaDescriptor;
/// Graphic mapper
css::uno::Reference<css::graphic::XGraphicMapper> mxGraphicMapper;
+ // For a document there is a single theme in document.xml.rels
+ // and the same is used by header and footer as well.
+ oox::drawingml::ThemePtr mpTheme;
+ rtl::Reference<oox::shape::ShapeFilterBase> mxShapeFilterBase;
bool mbCommentsExtendedResolved = false;
@@ -146,6 +152,12 @@ public:
{
return mxGraphicMapper;
}
+
+ const oox::drawingml::ThemePtr & getTheme() const { return mpTheme; }
+ void setTheme(const oox::drawingml::ThemePtr& pTheme) { mpTheme = pTheme; }
+
+ const rtl::Reference<oox::shape::ShapeFilterBase> & getShapeFilterBase();
+
};
}
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 16abb4987d35..9e190389d938 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -1695,8 +1695,11 @@ void OOXMLFastContextHandlerShape::setToken(Token_t nToken)
if (!mrShapeContext.is())
{
// Define the shape context for the whole document
- mrShapeContext = new oox::shape::ShapeContextHandler(getComponentContext());
+ mrShapeContext = new oox::shape::ShapeContextHandler(getDocument()->getShapeFilterBase());
getDocument()->setShapeContext(mrShapeContext);
+ auto pThemePtr = getDocument()->getTheme();
+ if (pThemePtr)
+ mrShapeContext->setTheme(pThemePtr);
}
mrShapeContext->setModel(getDocument()->getModel());
@@ -1786,6 +1789,15 @@ OOXMLFastContextHandlerShape::lcl_createFastChildContext
(Token_t Element,
const uno::Reference< xml::sax::XFastAttributeList > & Attribs)
{
+ // we need to share a single theme across all the shapes, but we parse it
+ // in ShapeContextHandler. So if it has been parsed there, propogate it to
+ // the document.
+ if (mrShapeContext && mrShapeContext->getTheme() && !getDocument()->getTheme())
+ {
+ auto pThemePtr = mrShapeContext->getTheme();
+ getDocument()->setTheme(pThemePtr);
+ }
+
uno::Reference< xml::sax::XFastContextHandler > xContextHandler;
bool bGroupShape = Element == Token_t(NMSP_vml | XML_group);
More information about the Libreoffice-commits
mailing list