diff options
author | Tomaž Vajngerl <tomaz.vajngerl@collabora.co.uk> | 2018-02-01 15:28:53 +0900 |
---|---|---|
committer | Tomaž Vajngerl <quikee@gmail.com> | 2018-02-01 11:54:22 +0100 |
commit | e02efb621fe672aa52e56caa916cf5c3fd0a9cb8 (patch) | |
tree | 725947b541b4774722d9d4a9d11a2ac58463a753 /xmloff | |
parent | a61747c2c375d1fe404c976d2a03125e4dc78d8f (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.cxx | 39 | ||||
-rw-r--r-- | xmloff/source/core/xmlimp.cxx | 16 | ||||
-rw-r--r-- | xmloff/source/style/FillStyleContext.cxx | 65 | ||||
-rw-r--r-- | xmloff/source/style/ImageStyle.cxx | 100 |
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() ) { |