summaryrefslogtreecommitdiff
path: root/sw
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-09-07 08:42:46 +0200
committerCaolán McNamara <caolanm@redhat.com>2015-09-15 14:16:16 +0000
commitc9a290c2a87e9af3b0cd4ccbdd751dddab3532da (patch)
tree785ca6f9343d067a4b4ab7ef9a751ae529e36bd2 /sw
parent6aa076cd6990e1678f52372cbcd9eb3093cd3cdc (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/18581 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.docxbin0 -> 14647 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport4.cxx12
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.cxx16
-rw-r--r--sw/source/filter/ww8/docxattributeoutput.hxx4
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
new file mode 100644
index 000000000000..bca19a955ecf
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf83227.docx
Binary files differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
index 9a495fd2a944..56905077b4a2 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx
@@ -798,6 +798,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 8d378218646e..4cba42779c80 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -4046,6 +4046,22 @@ void DocxAttributeOutput::WriteSrcRect(const SdrObject* pSdrObj )
void DocxAttributeOutput::ClearRelIdCache()
{
m_aRelIdCache.clear();
+ m_aSdrRelIdCache.clear();
+}
+
+OUString DocxAttributeOutput::FindRelId(sal_uInt32 nChecksum)
+{
+ OUString aRet;
+
+ if (m_aSdrRelIdCache.find(nChecksum) != m_aSdrRelIdCache.end())
+ aRet = m_aSdrRelIdCache[nChecksum];
+
+ return aRet;
+}
+
+void DocxAttributeOutput::CacheRelId(sal_uInt32 nChecksum, const OUString& rRelId)
+{
+ m_aSdrRelIdCache[nChecksum] = rRelId;
}
void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size& rSize, const SwFlyFrmFmt* pOLEFrmFmt, SwOLENode* pOLENode, const SdrObject* pSdrObj )
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index a5e13d9d07f5..f8ae6267b4bc 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -901,6 +901,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 <-> sal_uInt32 (bitmap checksum) cache, similar to m_aRelIdCache, but used for non-Writer graphics, handled in oox.
+ std::map<sal_uInt32, OUString> m_aSdrRelIdCache;
/// members to control the existence of grabbagged SDT properties in the paragraph
sal_Int32 m_nParagraphSdtPrToken;
@@ -958,6 +960,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(sal_uInt32 nChecksum) SAL_OVERRIDE;
+ virtual void CacheRelId(sal_uInt32 nChecksum, const OUString& rRelId) SAL_OVERRIDE;
virtual oox::drawingml::DrawingML& GetDrawingML() SAL_OVERRIDE;
void BulletDefinition(int nId, const Graphic& rGraphic, Size aSize) SAL_OVERRIDE;