diff options
author | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-02-21 12:57:57 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2014-02-21 13:02:31 +0100 |
commit | 32ada80a9f47b095d7b0c4d16e3422f6ef7f2ac2 (patch) | |
tree | 13734c176bb71fb272384b37b88c71ff89ac0dbd /sw | |
parent | DOCX export: fix image counters for multiple documents (diff) | |
download | core-32ada80a9f47b095d7b0c4d16e3422f6ef7f2ac2.tar.gz core-32ada80a9f47b095d7b0c4d16e3422f6ef7f2ac2.zip |
DOCX export: make sure a graphic is only written once
Even if it's referenced multiple times, because of mc:AlternateContent.
Change-Id: Ie4cb0ec088d12be5421bac43113c8ae4636028e0
Diffstat (limited to 'sw')
-rwxr-xr-x | sw/qa/extras/ooxmlexport/data/dml-picture-in-textframe.docx | bin | 0 -> 17252 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 11 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 14 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.hxx | 3 |
4 files changed, 25 insertions, 3 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/dml-picture-in-textframe.docx b/sw/qa/extras/ooxmlexport/data/dml-picture-in-textframe.docx Binary files differnew file mode 100755 index 000000000000..7d5876108d73 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/dml-picture-in-textframe.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index c68d3dfaab83..025b27e2d84e 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -2307,6 +2307,17 @@ DECLARE_OOXMLEXPORT_TEST(testDmlShapeRelsize, "dml-shape-relsize.docx") assertXPath(pXmlDoc, "/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/wp14:sizeRelH", "relativeFrom", "margin"); } +DECLARE_OOXMLEXPORT_TEST(testDmlPictureInTextframe, "dml-picture-in-textframe.docx") +{ + if (!m_bExported) + return; + + uno::Reference<packages::zip::XZipFileAccess2> xNameAccess = packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory), m_aTempFile.GetURL()); + CPPUNIT_ASSERT_EQUAL(true, bool(xNameAccess->hasByName("word/media/image1.gif"))); + // This was also true, image was written twice. + CPPUNIT_ASSERT_EQUAL(false, bool(xNameAccess->hasByName("word/media/image2.gif"))); +} + DECLARE_OOXMLEXPORT_TEST(testDmlGroupshapeRelsize, "dml-groupshape-relsize.docx") { xmlDocPtr pXmlDoc = parseExport("word/document.xml"); diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index afeb0573e071..ab71fd93075f 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -3020,10 +3020,18 @@ void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size else pGraphic = pOLENode->GetGraphic(); - m_rDrawingML.SetFS( m_pSerializer ); // to be sure that we write to the right stream - OUString aImageId = m_rDrawingML.WriteImage( *pGraphic ); + if (m_aRelIdCache.find(pGraphic) != m_aRelIdCache.end()) + // We already have a RelId for this Graphic. + aRelId = m_aRelIdCache[pGraphic]; + else + { + // Not in cache, then need to write it. + m_rDrawingML.SetFS( m_pSerializer ); // to be sure that we write to the right stream + OUString aImageId = m_rDrawingML.WriteImage( *pGraphic ); - aRelId = OUStringToOString( aImageId, RTL_TEXTENCODING_UTF8 ); + aRelId = OUStringToOString( aImageId, RTL_TEXTENCODING_UTF8 ); + m_aRelIdCache[pGraphic] = aRelId; + } nImageType = XML_embed; } diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index e25606deb4c6..47ce782b8443 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -824,6 +824,9 @@ private: bool m_setFootnote; + /// RelId <-> Graphic* cache, so that in case of alternate content, the same graphic only gets written once. + std::map<const Graphic*, OString> m_aRelIdCache; + public: DocxAttributeOutput( DocxExport &rExport, ::sax_fastparser::FSHelperPtr pSerializer, oox::drawingml::DrawingML* pDrawingML ); |