summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2015-09-07 08:42:46 +0200
committerAndras Timar <andras.timar@collabora.com>2015-09-18 10:10:39 +0200
commit7ed4ee9ede46cd21e99413c6ca8b9e9aa06a9b8a (patch)
tree247bf5f81736a22c56d6dfcdd9165c4a35a7da54 /oox
parentb4efcc2362c42435c1f71dd91bcf8c3cfaf55f12 (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 'oox')
-rw-r--r--oox/source/export/drawingml.cxx33
-rw-r--r--oox/source/export/vmlexport.cxx9
2 files changed, 37 insertions, 5 deletions
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index da384747efbd..878276a531ff 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -769,7 +769,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));
@@ -778,9 +778,18 @@ OUString DrawingML::WriteImage( const OUString& rURL, bool bRelPathToMedia )
if ( index != -1 )
{
- DBG(fprintf (stderr, "begin: %ld %s\n", long( 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
@@ -930,7 +939,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 7161a2f106c9..d90ff82e5e93 100644
--- a/oox/source/export/vmlexport.cxx
+++ b/oox/source/export/vmlexport.cxx
@@ -583,7 +583,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;
}