diff options
-rw-r--r-- | include/oox/export/drawingml.hxx | 4 | ||||
-rw-r--r-- | include/oox/export/vmlexport.hxx | 4 | ||||
-rw-r--r-- | oox/source/export/drawingml.cxx | 33 | ||||
-rw-r--r-- | oox/source/export/vmlexport.cxx | 9 | ||||
-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 |
8 files changed, 77 insertions, 5 deletions
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx index 55ef5c7ffe1f..f1e6ddc91c99 100644 --- a/include/oox/export/drawingml.hxx +++ b/include/oox/export/drawingml.hxx @@ -74,6 +74,10 @@ public: virtual void WriteOutliner(const OutlinerParaObject& rParaObj) = 0; /// Write the contents of the textbox that is associated to this shape. virtual void WriteTextBox(css::uno::Reference<css::drawing::XShape> xShape) = 0; + /// Look up the RelId of a graphic based on its checksum. + virtual OUString FindRelId(BitmapChecksum nChecksum) = 0; + /// Store the RelId of a graphic based on its checksum. + virtual void CacheRelId(BitmapChecksum nChecksum, const OUString& rRelId) = 0; protected: DMLTextExport() {} virtual ~DMLTextExport() {} diff --git a/include/oox/export/vmlexport.hxx b/include/oox/export/vmlexport.hxx index a87ed16eb90a..922b019c9b27 100644 --- a/include/oox/export/vmlexport.hxx +++ b/include/oox/export/vmlexport.hxx @@ -39,6 +39,10 @@ public: virtual oox::drawingml::DrawingML& GetDrawingML() = 0; /// Write the contents of the textbox that is associated to this shape in VML format. virtual void WriteVMLTextBox(css::uno::Reference<css::drawing::XShape> xShape) = 0; + /// Look up the RelId of a graphic based on its checksum. + virtual OUString FindRelId(BitmapChecksum nChecksum) = 0; + /// Store the RelId of a graphic based on its checksum. + virtual void CacheRelId(BitmapChecksum nChecksum, const OUString& rRelId) = 0; protected: VMLTextExport() {} virtual ~VMLTextExport() {} diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 9bb0c5acc42a..eeae3231fb5b 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -772,7 +772,7 @@ void DrawingML::WriteOutline( Reference<XPropertySet> rXPropSet ) mpFS->endElementNS( XML_a, XML_ln ); } -OUString DrawingML::WriteImage( const OUString& rURL, bool bRelPathToMedia ) +bool lcl_URLToGraphic(const OUString& rURL, Graphic& rGraphic) { OString aURLBS(OUStringToOString(rURL, RTL_TEXTENCODING_UTF8)); @@ -781,9 +781,18 @@ OUString DrawingML::WriteImage( const OUString& rURL, bool bRelPathToMedia ) if ( index != -1 ) { - SAL_INFO("oox.shape", "begin: " << sizeof( aURLBegin ) << " " << USS( rURL ) + RTL_CONSTASCII_LENGTH( aURLBegin )); - Graphic aGraphic = GraphicObject( aURLBS.copy(RTL_CONSTASCII_LENGTH(aURLBegin)) ).GetTransformedGraphic (); + rGraphic = GraphicObject(aURLBS.copy(RTL_CONSTASCII_LENGTH(aURLBegin))).GetTransformedGraphic(); + return true; + } + + return false; +} +OUString DrawingML::WriteImage( const OUString& rURL, bool bRelPathToMedia ) +{ + Graphic aGraphic; + if (lcl_URLToGraphic(rURL, aGraphic)) + { return WriteImage( aGraphic , bRelPathToMedia ); } else @@ -933,7 +942,23 @@ OUString DrawingML::WriteImage( const Graphic& rGraphic , bool bRelPathToMedia ) OUString DrawingML::WriteBlip( Reference< XPropertySet > rXPropSet, const OUString& rURL, bool bRelPathToMedia, const Graphic *pGraphic ) { - OUString sRelId = pGraphic ? WriteImage( *pGraphic, bRelPathToMedia ) : WriteImage( rURL, bRelPathToMedia ); + OUString sRelId; + BitmapChecksum nChecksum = 0; + if (!rURL.isEmpty() && mpTextExport) + { + Graphic aGraphic; + if (lcl_URLToGraphic(rURL, aGraphic)) + { + nChecksum = aGraphic.GetChecksum(); + sRelId = mpTextExport->FindRelId(nChecksum); + } + } + if (sRelId.isEmpty()) + { + sRelId = pGraphic ? WriteImage( *pGraphic, bRelPathToMedia ) : WriteImage( rURL, bRelPathToMedia ); + if (!rURL.isEmpty() && mpTextExport) + mpTextExport->CacheRelId(nChecksum, sRelId); + } sal_Int16 nBright = 0; sal_Int32 nContrast = 0; diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx index 5568f56b71f9..c71ffa7564c6 100644 --- a/oox/source/export/vmlexport.cxx +++ b/oox/source/export/vmlexport.cxx @@ -586,7 +586,14 @@ void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect aStream.Seek(0); Graphic aGraphic; GraphicConverter::Import(aStream, aGraphic); - OUString aImageId = m_pTextExport->GetDrawingML().WriteImage( aGraphic ); + + BitmapChecksum nChecksum = aGraphic.GetChecksum(); + OUString aImageId = m_pTextExport->FindRelId(nChecksum); + if (aImageId.isEmpty()) + { + aImageId = m_pTextExport->GetDrawingML().WriteImage( aGraphic ); + m_pTextExport->CacheRelId(nChecksum, aImageId); + } pAttrList->add(FSNS(XML_r, XML_id), OUStringToOString(aImageId, RTL_TEXTENCODING_UTF8)); imageData = true; } 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 f14190096e50..37c19c2939c3 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport4.cxx @@ -800,6 +800,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 6f9251ef2ca9..d3ccb5a0c791 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4125,6 +4125,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 54d3f11ccb8f..6479726f0e64 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; |