summaryrefslogtreecommitdiff
path: root/xmloff
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2018-02-01 15:28:53 +0900
committerTomaž Vajngerl <quikee@gmail.com>2018-02-01 11:54:22 +0100
commite02efb621fe672aa52e56caa916cf5c3fd0a9cb8 (patch)
tree725947b541b4774722d9d4a9d11a2ac58463a753 /xmloff
parenta61747c2c375d1fe404c976d2a03125e4dc78d8f (diff)
Change bitmap table to store XBitmap instead of GraphicObject URL
As we want to get rid of GraphicObject URLs for the more robust image life-cycle handling, it was necessary to change the way bitmap table stores and handles images, so that they always store a Graphic object (wrapped in UNO object that provides the XGraphic and XBitmap interface). In addition this changes loading and saving from ODF (xmloff) and OOXML (oox) filters so they don't depend on GraphicObject URL anymore, but load or save directly to / from XGraphic or XBitmap. Change-Id: I2b88e10056e7d6c920249d59188f86b1a5a32d21 Reviewed-on: https://gerrit.libreoffice.org/49074 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'xmloff')
-rw-r--r--xmloff/source/core/xmlexp.cxx39
-rw-r--r--xmloff/source/core/xmlimp.cxx16
-rw-r--r--xmloff/source/style/FillStyleContext.cxx65
-rw-r--r--xmloff/source/style/ImageStyle.cxx100
4 files changed, 169 insertions, 51 deletions
diff --git a/xmloff/source/core/xmlexp.cxx b/xmloff/source/core/xmlexp.cxx
index d06eb49da770..cfee78ca7762 100644
--- a/xmloff/source/core/xmlexp.cxx
+++ b/xmloff/source/core/xmlexp.cxx
@@ -87,6 +87,7 @@
#include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
#include <com/sun/star/document/XMLOasisBasicExporter.hpp>
#include <com/sun/star/embed/XEncryptionProtectedSource2.hpp>
+#include <com/sun/star/document/XGraphicStorageHandler.hpp>
#include <com/sun/star/rdf/XMetadatable.hpp>
#include <RDFaExportHelper.hxx>
@@ -1881,6 +1882,23 @@ OUString SvXMLExport::AddEmbeddedGraphicObject( const OUString& rGraphicObjectUR
return sRet;
}
+OUString SvXMLExport::AddEmbeddedXGraphic(uno::Reference<graphic::XGraphic> const & rxGraphic)
+{
+ OUString sInternalURL;
+
+ uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler(mxGraphicResolver, uno::UNO_QUERY);
+
+ if (mxGraphicResolver.is() && xGraphicStorageHandler.is())
+ {
+ if (!(getExportFlags() & SvXMLExportFlags::EMBEDDED))
+ {
+ sInternalURL = xGraphicStorageHandler->saveGraphic(rxGraphic);
+ }
+ }
+
+ return sInternalURL;
+}
+
Reference< XInputStream > SvXMLExport::GetEmbeddedGraphicObjectStream( const OUString& rGraphicObjectURL )
{
if( (getExportFlags() & SvXMLExportFlags::EMBEDDED) &&
@@ -1899,6 +1917,27 @@ Reference< XInputStream > SvXMLExport::GetEmbeddedGraphicObjectStream( const OUS
return nullptr;
}
+bool SvXMLExport::AddEmbeddedXGraphicAsBase64(uno::Reference<graphic::XGraphic> const & rxGraphic)
+{
+ if ((getExportFlags() & SvXMLExportFlags::EMBEDDED) &&
+ mxGraphicResolver.is())
+ {
+ uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler(mxGraphicResolver, uno::UNO_QUERY);
+
+ if (xGraphicStorageHandler.is())
+ {
+ Reference<XInputStream> xInputStream(xGraphicStorageHandler->createInputStream(rxGraphic));
+ if (xInputStream.is())
+ {
+ XMLBase64Export aBase64Exp(*this);
+ return aBase64Exp.exportOfficeBinaryDataElement(xInputStream);
+ }
+ }
+ }
+
+ return false;
+}
+
bool SvXMLExport::AddEmbeddedGraphicObjectAsBase64( const OUString& rGraphicObjectURL )
{
bool bRet = false;
diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx
index c8a2417603c9..5203cdc4d751 100644
--- a/xmloff/source/core/xmlimp.cxx
+++ b/xmloff/source/core/xmlimp.cxx
@@ -44,6 +44,7 @@
#include <com/sun/star/util/MeasureUnit.hpp>
#include <com/sun/star/document/XBinaryStreamResolver.hpp>
#include <com/sun/star/document/XStorageBasedDocument.hpp>
+#include <com/sun/star/document/XGraphicStorageHandler.hpp>
#include <com/sun/star/xml/sax/XLocator.hpp>
#include <com/sun/star/xml/sax/FastParser.hpp>
#include <com/sun/star/packages/zip/ZipIOException.hpp>
@@ -1312,6 +1313,8 @@ bool SvXMLImport::IsPackageURL( const OUString& rURL ) const
if( (mnImportFlags & nTest) == nTest )
return false;
+ // TODO: from this point extract to own static function
+
// Some quick tests: Some may rely on the package structure!
sal_Int32 nLen = rURL.getLength();
if( nLen > 0 && '/' == rURL[0] )
@@ -1350,6 +1353,19 @@ bool SvXMLImport::IsPackageURL( const OUString& rURL ) const
return true;
}
+css::uno::Reference<css::graphic::XGraphic> SvXMLImport::loadGraphicByURL(const OUString& rURL)
+{
+ css::uno::Reference<css::graphic::XGraphic> xGraphic;
+ uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler(mxGraphicResolver, uno::UNO_QUERY);
+
+ if (IsPackageURL(rURL) && xGraphicStorageHandler.is())
+ {
+ xGraphic = xGraphicStorageHandler->loadGraphic(rURL);
+ }
+
+ return xGraphic;
+}
+
OUString SvXMLImport::ResolveGraphicObjectURL( const OUString& rURL,
bool bLoadOnDemand )
{
diff --git a/xmloff/source/style/FillStyleContext.cxx b/xmloff/source/style/FillStyleContext.cxx
index 89c73965749f..5c89613e826f 100644
--- a/xmloff/source/style/FillStyleContext.cxx
+++ b/xmloff/source/style/FillStyleContext.cxx
@@ -18,6 +18,8 @@
*/
#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
+#include <com/sun/star/awt/XBitmap.hpp>
#include "FillStyleContext.hxx"
#include <xmloff/xmlimp.hxx>
#include <xmloff/GradientStyle.hxx>
@@ -158,34 +160,61 @@ SvXMLImportContextRef XMLBitmapStyleContext::CreateChildContext( sal_uInt16 nPre
void XMLBitmapStyleContext::EndElement()
{
- OUString sURL;
- maAny >>= sURL;
-
- if( sURL.isEmpty() && mxBase64Stream.is() )
+ if (maAny.has<uno::Reference<graphic::XGraphic>>())
{
- sURL = GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream );
- mxBase64Stream = nullptr;
- maAny <<= sURL;
- }
+ uno::Reference<container::XNameContainer> xBitmapContainer(GetImport().GetBitmapHelper());
- uno::Reference< container::XNameContainer > xBitmap( GetImport().GetBitmapHelper() );
+ uno::Reference<graphic::XGraphic> xGraphic = maAny.get<uno::Reference<graphic::XGraphic>>();
+ uno::Reference<awt::XBitmap> xBitmap(xGraphic, uno::UNO_QUERY);
- try
- {
- if(xBitmap.is())
+ try
{
- if( xBitmap->hasByName( maStrName ) )
+ if (xBitmapContainer.is())
{
- xBitmap->replaceByName( maStrName, maAny );
+ if (xBitmapContainer->hasByName(maStrName))
+ {
+ xBitmapContainer->replaceByName(maStrName, uno::Any(xBitmap));
+ }
+ else
+ {
+ xBitmapContainer->insertByName(maStrName, uno::Any(xBitmap));
+ }
}
- else
+ }
+ catch (container::ElementExistException&)
+ {}
+ }
+ else
+ {
+ OUString sURL;
+ maAny >>= sURL;
+
+ if( sURL.isEmpty() && mxBase64Stream.is() )
+ {
+ sURL = GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream );
+ mxBase64Stream = nullptr;
+ maAny <<= sURL;
+ }
+
+ uno::Reference< container::XNameContainer > xBitmap( GetImport().GetBitmapHelper() );
+
+ try
+ {
+ if(xBitmap.is())
{
- xBitmap->insertByName( maStrName, maAny );
+ if( xBitmap->hasByName( maStrName ) )
+ {
+ xBitmap->replaceByName( maStrName, maAny );
+ }
+ else
+ {
+ xBitmap->insertByName( maStrName, maAny );
+ }
}
}
+ catch( container::ElementExistException& )
+ {}
}
- catch( container::ElementExistException& )
- {}
}
bool XMLBitmapStyleContext::IsTransient() const
diff --git a/xmloff/source/style/ImageStyle.cxx b/xmloff/source/style/ImageStyle.cxx
index d4be8a0a2a1f..cd8b7fcb4659 100644
--- a/xmloff/source/style/ImageStyle.cxx
+++ b/xmloff/source/style/ImageStyle.cxx
@@ -45,39 +45,73 @@ enum SvXMLTokenMapAttrs
void XMLImageStyle::exportXML(OUString const & rStrName, uno::Any const & rValue, SvXMLExport& rExport)
{
- OUString sImageURL;
+ if (rStrName.isEmpty())
+ return;
- if( !rStrName.isEmpty() )
+ if (rValue.has<uno::Reference<awt::XBitmap>>())
{
- if( rValue >>= sImageURL )
+ // Name
+ bool bEncoded = false;
+ rExport.AddAttribute(XML_NAMESPACE_DRAW, XML_NAME,
+ rExport.EncodeStyleName(rStrName, &bEncoded));
+ if (bEncoded)
{
- // Name
- bool bEncoded = false;
- rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME,
- rExport.EncodeStyleName( rStrName,
- &bEncoded ) );
- if( bEncoded )
- rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME,
- rStrName );
-
- // uri
- const OUString aStr( rExport.AddEmbeddedGraphicObject( sImageURL ) );
- if( !aStr.isEmpty() )
- {
- rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aStr );
- rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
- rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
- rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
- }
-
- // Do Write
- SvXMLElementExport aElem( rExport, XML_NAMESPACE_DRAW, XML_FILL_IMAGE, true, true );
-
- if( !sImageURL.isEmpty() )
- {
- // optional office:binary-data
- rExport.AddEmbeddedGraphicObjectAsBase64( sImageURL );
- }
+ rExport.AddAttribute(XML_NAMESPACE_DRAW, XML_DISPLAY_NAME, rStrName);
+ }
+
+ auto xBitmap = rValue.get<uno::Reference<awt::XBitmap>>();
+ uno::Reference<graphic::XGraphic> xGraphic(xBitmap, uno::UNO_QUERY);
+
+ const OUString aStr = rExport.AddEmbeddedXGraphic(xGraphic);
+
+ // uri
+ if (!aStr.isEmpty())
+ {
+ rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aStr );
+ rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
+ rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
+ rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
+ }
+
+ // Do Write
+ SvXMLElementExport aElem(rExport, XML_NAMESPACE_DRAW, XML_FILL_IMAGE, true, true);
+
+ if (xBitmap.is() && xGraphic.is())
+ {
+ // optional office:binary-data
+ rExport.AddEmbeddedXGraphicAsBase64(xGraphic);
+ }
+ }
+ else if (rValue.has<OUString>()) // TODO: Remove when GraphicObject URL aren't used anymore
+ {
+ OUString sImageURL = rValue.get<OUString>();
+
+ // Name
+ bool bEncoded = false;
+ rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_NAME,
+ rExport.EncodeStyleName( rStrName,
+ &bEncoded ) );
+ if( bEncoded )
+ rExport.AddAttribute( XML_NAMESPACE_DRAW, XML_DISPLAY_NAME,
+ rStrName );
+
+ // uri
+ const OUString aStr( rExport.AddEmbeddedGraphicObject( sImageURL ) );
+ if( !aStr.isEmpty() )
+ {
+ rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, aStr );
+ rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
+ rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
+ rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD );
+ }
+
+ // Do Write
+ SvXMLElementExport aElem( rExport, XML_NAMESPACE_DRAW, XML_FILL_IMAGE, true, true );
+
+ if( !sImageURL.isEmpty() )
+ {
+ // optional office:binary-data
+ rExport.AddEmbeddedGraphicObjectAsBase64( sImageURL );
}
}
}
@@ -98,8 +132,8 @@ bool XMLImageStyle::importXML(uno::Reference<xml::sax::XAttributeList> const & x
bool bHasHRef = false;
bool bHasName = false;
- OUString aStrURL;
OUString aDisplayName;
+ uno::Reference<graphic::XGraphic> xGraphic;
SvXMLTokenMap aTokenMap( aHatchAttrTokenMap );
@@ -126,7 +160,7 @@ bool XMLImageStyle::importXML(uno::Reference<xml::sax::XAttributeList> const & x
break;
case XML_TOK_IMAGE_URL:
{
- aStrURL = rImport.ResolveGraphicObjectURL( rStrValue, false );
+ xGraphic = rImport.loadGraphicByURL(rStrValue);
bHasHRef = true;
}
break;
@@ -144,7 +178,7 @@ bool XMLImageStyle::importXML(uno::Reference<xml::sax::XAttributeList> const & x
}
}
- rValue <<= aStrURL;
+ rValue <<= xGraphic;
if( !aDisplayName.isEmpty() )
{