diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2015-09-07 08:42:46 +0200 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2015-09-11 09:36:16 +0000 |
commit | 1b381370b026f62397dc2d41ddcecf9d6523e044 (patch) | |
tree | f2f6283ffd09b250fe8751a6bd702a678929eb5c /sw | |
parent | b7ffafe77d95c72402bdac0328ca3bfcb7444067 (diff) |
tdf#83227 oox: reuse RelId in DML/VML export for the same graphic
So that large images are written only once to the ZIP container when
they are exported using both markups. This affects drawinglayer images,
the Writer ones are handled directly in sw and were already
deduplicated.
(cherry picked from commit b484e9814c66d8d51cea974390963a6944bc9d73)
Conflicts:
oox/source/export/drawingml.cxx
Change-Id: Iff7c769329b42939833056b727b070f6a60da5e3
Reviewed-on: https://gerrit.libreoffice.org/18491
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/tdf83227.docx | bin | 0 -> 14647 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport4.cxx | 12 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 16 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.hxx | 4 |
4 files changed, 32 insertions, 0 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/tdf83227.docx b/sw/qa/extras/ooxmlexport/data/tdf83227.docx Binary files differnew file mode 100644 index 000000000000..bca19a955ecf --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf83227.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx index 372735313b7a..3a273f3766b3 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx @@ -803,6 +803,18 @@ DECLARE_OOXMLEXPORT_TEST(testSimpleSdts, "simple-sdts.docx") } +DECLARE_OOXMLEXPORT_TEST(testTdf83227, "tdf83227.docx") +{ + // Bug document contains a rotated image, which is handled as a draw shape (not as a Writer image) on export. + if (!mbExported) + return; + + uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), maTempFile.GetURL()); + CPPUNIT_ASSERT_EQUAL(true, bool(xNameAccess->hasByName("word/media/image1.png"))); + // This was also true, image was written twice. + CPPUNIT_ASSERT_EQUAL(false, bool(xNameAccess->hasByName("word/media/image2.png"))); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 022ee0bcda5c..00aeb75bd4f3 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4074,6 +4074,22 @@ void DocxAttributeOutput::WriteSrcRect(const SdrObject* pSdrObj ) void DocxAttributeOutput::ClearRelIdCache() { m_aRelIdCache.clear(); + m_aSdrRelIdCache.clear(); +} + +OUString DocxAttributeOutput::FindRelId(BitmapChecksum nChecksum) +{ + OUString aRet; + + if (m_aSdrRelIdCache.find(nChecksum) != m_aSdrRelIdCache.end()) + aRet = m_aSdrRelIdCache[nChecksum]; + + return aRet; +} + +void DocxAttributeOutput::CacheRelId(BitmapChecksum nChecksum, const OUString& rRelId) +{ + m_aSdrRelIdCache[nChecksum] = rRelId; } void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size& rSize, const SwFlyFrameFormat* pOLEFrameFormat, SwOLENode* pOLENode, const SdrObject* pSdrObj ) diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index b7ce59d29db5..4dbc29fb346b 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -906,6 +906,8 @@ private: /// RelId <-> Graphic* cache, so that in case of alternate content, the same graphic only gets written once. std::map<const Graphic*, OString> m_aRelIdCache; + /// RelId <-> BitmapChecksum cache, similar to m_aRelIdCache, but used for non-Writer graphics, handled in oox. + std::map<BitmapChecksum, OUString> m_aSdrRelIdCache; /// members to control the existence of grabbagged SDT properties in the paragraph sal_Int32 m_nParagraphSdtPrToken; @@ -963,6 +965,8 @@ public: virtual void WriteVMLTextBox(css::uno::Reference<css::drawing::XShape> xShape) SAL_OVERRIDE; /// DMLTextExport virtual void WriteTextBox(css::uno::Reference<css::drawing::XShape> xShape) SAL_OVERRIDE; + virtual OUString FindRelId(BitmapChecksum nChecksum) SAL_OVERRIDE; + virtual void CacheRelId(BitmapChecksum nChecksum, const OUString& rRelId) SAL_OVERRIDE; virtual oox::drawingml::DrawingML& GetDrawingML() SAL_OVERRIDE; void BulletDefinition(int nId, const Graphic& rGraphic, Size aSize) SAL_OVERRIDE; |