summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--filter/source/msfilter/escherex.cxx76
-rw-r--r--filter/source/msfilter/eschesdo.cxx4
-rw-r--r--filter/source/msfilter/msdffimp.cxx4
-rw-r--r--include/oox/export/drawingml.hxx9
-rw-r--r--include/xmloff/xmlimp.hxx3
-rw-r--r--oox/source/export/drawingml.cxx33
-rw-r--r--oox/source/export/shapes.cxx19
-rw-r--r--sd/CppunitTest_sd_import_tests.mk1
-rw-r--r--sd/qa/unit/import-tests.cxx10
-rw-r--r--sd/source/filter/eppt/epptso.cxx4
-rw-r--r--svx/source/svdraw/svdograf.cxx3
-rw-r--r--sw/qa/extras/globalfilter/globalfilter.cxx50
-rw-r--r--sw/source/filter/ww8/rtfsdrexport.cxx37
-rw-r--r--xmloff/inc/xmlmultiimagehelper.hxx1
-rw-r--r--xmloff/source/core/xmlexp.cxx23
-rw-r--r--xmloff/source/core/xmlimp.cxx44
-rw-r--r--xmloff/source/core/xmlmultiimagehelper.cxx52
-rw-r--r--xmloff/source/draw/shapeexport.cxx82
-rw-r--r--xmloff/source/draw/ximpshap.cxx66
-rw-r--r--xmloff/source/draw/ximpshap.hxx2
20 files changed, 390 insertions, 133 deletions
diff --git a/filter/source/msfilter/escherex.cxx b/filter/source/msfilter/escherex.cxx
index 8807d84173c2..a308d9edc53b 100644
--- a/filter/source/msfilter/escherex.cxx
+++ b/filter/source/msfilter/escherex.cxx
@@ -85,6 +85,7 @@
#include <com/sun/star/drawing/Position3D.hpp>
#include <com/sun/star/drawing/Direction3D.hpp>
#include <com/sun/star/drawing/Hatch.hpp>
+#include <com/sun/star/graphic/XGraphic.hpp>
#include <com/sun/star/text/GraphicCrop.hpp>
#include <unotools/ucbstreamhelper.hxx>
#include <unotools/localfilehelper.hxx>
@@ -1390,10 +1391,12 @@ void EscherPropertyContainer::CreateEmbeddedHatchProperties(const drawing::Hatch
AddOpt( ESCHER_Prop_fillType, ESCHER_FillTexture );
}
-bool EscherPropertyContainer::CreateGraphicProperties(
- const uno::Reference<beans::XPropertySet> & rXPropSet,
- const OUString& rSource, const bool bCreateFillBitmap, const bool bCreateCroppingAttributes,
- const bool bFillBitmapModeAllowed, const bool bOOxmlExport )
+bool EscherPropertyContainer::CreateGraphicProperties(const uno::Reference<beans::XPropertySet> & rXPropSet,
+ const OUString& rSource,
+ const bool bCreateFillBitmap,
+ const bool bCreateCroppingAttributes,
+ const bool bFillBitmapModeAllowed,
+ const bool bOOxmlExport )
{
bool bRetValue = false;
bool bCreateFillStyles = false;
@@ -1403,6 +1406,8 @@ bool EscherPropertyContainer::CreateGraphicProperties(
OUString aGraphicUrl;
OString aUniqueId;
+ uno::Reference<graphic::XGraphic> xGraphic;
+
drawing::BitmapMode eBitmapMode(drawing::BitmapMode_NO_REPEAT);
uno::Any aAny;
@@ -1465,6 +1470,11 @@ bool EscherPropertyContainer::CreateGraphicProperties(
aGraphicUrl = *o3tl::doAccess<OUString>(aAny);
bCreateFillStyles = true;
}
+ else if ( rSource == "Graphic" )
+ {
+ xGraphic = aAny.get<uno::Reference<graphic::XGraphic>>();
+ bCreateFillStyles = true;
+ }
else if ( rSource == "FillHatch" )
{
drawing::Hatch aHatch;
@@ -1531,6 +1541,12 @@ bool EscherPropertyContainer::CreateGraphicProperties(
: 0;
}
+ if (xGraphic.is())
+ {
+ Graphic aGraphic(xGraphic);
+ aGraphicUrl = aGraphic.getOriginURL();
+ }
+
if ( aGraphicUrl.getLength() )
{
OUString aVndUrl( "vnd.sun.star.GraphicObject:" );
@@ -1598,7 +1614,7 @@ bool EscherPropertyContainer::CreateGraphicProperties(
}
}
- if ( aGraphicUrl.getLength() || !aUniqueId.isEmpty() )
+ if ( aGraphicUrl.getLength() || !aUniqueId.isEmpty() || xGraphic.is())
{
if(bMirrored || nTransparency || nRed || nGreen || nBlue || (1.0 != fGamma))
{
@@ -1675,7 +1691,55 @@ bool EscherPropertyContainer::CreateGraphicProperties(
else
AddOpt( ESCHER_Prop_fillType, ESCHER_FillPicture );
- if ( !aUniqueId.isEmpty() )
+ if (xGraphic.is())
+ {
+ Graphic aGraphic(xGraphic);
+ if (!aGraphic.getOriginURL().isEmpty())
+ {
+ AddOpt(ESCHER_Prop_pibName, aGraphicUrl);
+ sal_uInt32 nPibFlags = 0;
+ GetOpt(ESCHER_Prop_pibFlags, nPibFlags);
+ AddOpt(ESCHER_Prop_pibFlags, ESCHER_BlipFlagLinkToFile | ESCHER_BlipFlagFile | ESCHER_BlipFlagDoNotSave | nPibFlags);
+ }
+ else if (pGraphicProvider && pPicOutStrm && pShapeBoundRect) // write out embedded graphic
+ {
+ GraphicObject aGraphicObject(aGraphic);
+ const sal_uInt32 nBlibId(pGraphicProvider->GetBlibID(*pPicOutStrm, aGraphicObject, nullptr, pGraphicAttr.get()));
+
+ if(nBlibId)
+ {
+ if(bCreateFillBitmap)
+ {
+ AddOpt(ESCHER_Prop_fillBlip, nBlibId, true);
+ }
+ else
+ {
+ AddOpt( ESCHER_Prop_pib, nBlibId, true );
+ ImplCreateGraphicAttributes( rXPropSet, nBlibId, bCreateCroppingAttributes );
+ }
+
+ bRetValue = true;
+ }
+ }
+ else
+ {
+ EscherGraphicProvider aProvider;
+ SvMemoryStream aMemStrm;
+ GraphicObject aGraphicObject(aGraphic);
+
+ if (aProvider.GetBlibID(aMemStrm, aGraphicObject, nullptr, pGraphicAttr.get(), bOOxmlExport))
+ {
+ // grab BLIP from stream and insert directly as complex property
+ // ownership of stream memory goes to complex property
+ aMemStrm.ObjectOwnsMemory( false );
+ sal_uInt8 const * pBuf = static_cast<sal_uInt8 const *>(aMemStrm.GetData());
+ sal_uInt32 nSize = aMemStrm.Seek( STREAM_SEEK_TO_END );
+ AddOpt(ESCHER_Prop_fillBlip, true, nSize, const_cast<sal_uInt8 *>(pBuf), nSize );
+ bRetValue = true;
+ }
+ }
+ }
+ else if ( !aUniqueId.isEmpty() )
{
// write out embedded graphic
if ( pGraphicProvider && pPicOutStrm && pShapeBoundRect )
diff --git a/filter/source/msfilter/eschesdo.cxx b/filter/source/msfilter/eschesdo.cxx
index d10e96bb5765..a4df39e814ed 100644
--- a/filter/source/msfilter/eschesdo.cxx
+++ b/filter/source/msfilter/eschesdo.cxx
@@ -549,7 +549,7 @@ sal_uInt32 ImplEESdrWriter::ImplWriteShape( ImplEESdrObject& rObj,
have to create a simple Rectangle with fill bitmap instead (while not allowing BitmapMode_Repeat).
*/
addShape( ESCHER_ShpInst_Rectangle, ShapeFlag::HaveShapeProperty | ShapeFlag::HaveAnchor );
- if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, "GraphicURL", true, true, false ) )
+ if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, "Graphic", true, true, false ) )
{
aPropOpt.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapNone );
aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
@@ -565,7 +565,7 @@ sal_uInt32 ImplEESdrWriter::ImplWriteShape( ImplEESdrObject& rObj,
else
{
addShape( ESCHER_ShpInst_PictureFrame, ShapeFlag::HaveShapeProperty | ShapeFlag::HaveAnchor );
- if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, "GraphicURL", false, true, true, bOOxmlExport ) )
+ if ( aPropOpt.CreateGraphicProperties( rObj.mXPropSet, "Graphic", false, true, true, bOOxmlExport ) )
aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
}
}
diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx
index 6743f503480e..dc26bc4a6c57 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -4010,7 +4010,11 @@ SdrObject* SvxMSDffManager::ImportGraphic( SvStream& rSt, SfxItemSet& rSet, cons
if ( dynamic_cast<const SdrGrafObj* >(pRet) != nullptr )
{
if( aLinkFileName.getLength() )
+ {
static_cast<SdrGrafObj*>(pRet)->SetGraphicLink( aLinkFileName, ""/*TODO?*/, aLinkFilterName );
+ Graphic aGraphic(static_cast<SdrGrafObj*>(pRet)->GetGraphic());
+ aGraphic.setOriginURL(aLinkFileName);
+ }
if ( bLinkGrf && !bGrfRead )
{
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index 2f02f783462c..216fe5316a13 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -38,6 +38,8 @@
#include <sax/fshelper.hxx>
#include <svx/msdffdef.hxx>
#include <vcl/checksum.hxx>
+#include <tools/gen.hxx>
+#include <vcl/mapmod.hxx>
#ifndef OOX_DRAWINGML_EXPORT_ROTATE_CLOCKWISIFY
// Our rotation is counter-clockwise and is in 100ths of a degree.
@@ -198,7 +200,14 @@ public:
void WritePattFill( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
void WritePattFill(const css::uno::Reference<css::beans::XPropertySet>& rXPropSet,
const css::drawing::Hatch& rHatch);
+
+ void WriteGraphicCropProperties(css::uno::Reference<css::beans::XPropertySet> const & rxPropertySet,
+ Size const & rOriginalSize, MapMode const & rMapMode);
+
void WriteSrcRect( const css::uno::Reference< css::beans::XPropertySet >&, const OUString& );
+ void WriteSrcRectXGraphic(css::uno::Reference<css::beans::XPropertySet> const & rxPropertySet,
+ css::uno::Reference<css::graphic::XGraphic> const & rxGraphic);
+
void WriteOutline( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
void WriteStretch( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, const OUString& rURL );
diff --git a/include/xmloff/xmlimp.hxx b/include/xmloff/xmlimp.hxx
index 50c4e0f10612..691d3e704b54 100644
--- a/include/xmloff/xmlimp.hxx
+++ b/include/xmloff/xmlimp.hxx
@@ -400,7 +400,8 @@ public:
mxNumberFormatsSupplier = _xNumberFormatSupplier;
}
- css::uno::Reference<css::graphic::XGraphic> loadGraphicByURL(const OUString& rURL);
+ css::uno::Reference<css::graphic::XGraphic> loadGraphicByURL(OUString const & rURL);
+ css::uno::Reference<css::graphic::XGraphic> loadGraphicFromBase64(css::uno::Reference<css::io::XOutputStream> const & rxOutputStream);
// Convert a local package URL into either a graphic manager or a
// internal package URL. The later one happens only if bLoadURL is true
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index d56077c5240a..0503a088faf7 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -1325,18 +1325,16 @@ void DrawingML::WritePattFill(const Reference<XPropertySet>& rXPropSet, const cs
mpFS->endElementNS( XML_a , XML_pattFill );
}
-void DrawingML::WriteSrcRect( const Reference< XPropertySet >& rXPropSet, const OUString& rURL )
+void DrawingML::WriteGraphicCropProperties(uno::Reference<beans::XPropertySet> const & rXPropSet, Size const & rOriginalSize, MapMode const & rMapMode)
{
- GraphicObject aGraphicObject = GraphicObject::CreateGraphicObjectFromURL(rURL);
- Size aOriginalSize = aGraphicObject.GetPrefSize();
- const MapMode& rMapMode = aGraphicObject.GetPrefMapMode();
+ if (GetProperty(rXPropSet, "GraphicCrop"))
+ {
+ Size aOriginalSize(rOriginalSize);
- // GraphicCrop is in mm100, so in case the original size is in pixels, convert it over.
- if (rMapMode.GetMapUnit() == MapUnit::MapPixel)
- aOriginalSize = Application::GetDefaultDevice()->PixelToLogic(aOriginalSize, MapMode(MapUnit::Map100thMM));
+ // GraphicCrop is in mm100, so in case the original size is in pixels, convert it over.
+ if (rMapMode.GetMapUnit() == MapUnit::MapPixel)
+ aOriginalSize = Application::GetDefaultDevice()->PixelToLogic(aOriginalSize, MapMode(MapUnit::Map100thMM));
- if ( GetProperty( rXPropSet, "GraphicCrop" ) )
- {
css::text::GraphicCrop aGraphicCropStruct;
mAny >>= aGraphicCropStruct;
@@ -1352,6 +1350,23 @@ void DrawingML::WriteSrcRect( const Reference< XPropertySet >& rXPropSet, const
}
}
+void DrawingML::WriteSrcRect(const uno::Reference<beans::XPropertySet>& rxPropertySet, const OUString& rURL)
+{
+ GraphicObject aGraphicObject = GraphicObject::CreateGraphicObjectFromURL(rURL);
+ Size aOriginalSize = aGraphicObject.GetPrefSize();
+ const MapMode& rMapMode = aGraphicObject.GetPrefMapMode();
+ WriteGraphicCropProperties(rxPropertySet, aOriginalSize, rMapMode);
+}
+
+void DrawingML::WriteSrcRectXGraphic(uno::Reference<beans::XPropertySet> const & rxPropertySet,
+ uno::Reference<graphic::XGraphic> const & rxGraphic)
+{
+ Graphic aGraphic(rxGraphic);
+ Size aOriginalSize = aGraphic.GetPrefSize();
+ const MapMode& rMapMode = aGraphic.GetPrefMapMode();
+ WriteGraphicCropProperties(rxPropertySet, aOriginalSize, rMapMode);
+}
+
void DrawingML::WriteStretch( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, const OUString& rURL )
{
mpFS->startElementNS( XML_a, XML_stretch, FSEND );
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 8199221686f3..e922a3bce934 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -1098,13 +1098,20 @@ void ShapeExport::WriteGraphicObjectShapePart( const Reference< XShape >& xShape
SAL_INFO("oox.shape", "graphicObject without text");
OUString sGraphicURL;
+ uno::Reference<graphic::XGraphic> xGraphic;
OUString sMediaURL;
+
Reference< XPropertySet > xShapeProps( xShape, UNO_QUERY );
bool bHasGraphicURL = xShapeProps.is() && xShapeProps->getPropertySetInfo()->hasPropertyByName("GraphicURL") && (xShapeProps->getPropertyValue("GraphicURL") >>= sGraphicURL);
+
+ if (xShapeProps.is() && xShapeProps->getPropertySetInfo()->hasPropertyByName("Graphic"))
+ xShapeProps->getPropertyValue("Graphic") >>= xGraphic;
+
+ bool bHasAnyGraphic = bHasGraphicURL || xGraphic.is();
bool bHasMediaURL = xShapeProps.is() && xShapeProps->getPropertySetInfo()->hasPropertyByName("MediaURL") && (xShapeProps->getPropertyValue("MediaURL") >>= sMediaURL);
- if (!pGraphic && !bHasGraphicURL && !bHasMediaURL)
+ if (!pGraphic && !bHasAnyGraphic && !bHasMediaURL)
{
SAL_INFO("oox.shape", "no graphic or media URL found");
return;
@@ -1158,8 +1165,14 @@ void ShapeExport::WriteGraphicObjectShapePart( const Reference< XShape >& xShape
pFS->startElementNS( mnXmlNamespace, XML_blipFill, FSEND );
- if (pGraphic || bHasGraphicURL)
+ if (xGraphic.is())
+ {
+ WriteXGraphicBlip(xShapeProps, xGraphic, false);
+ }
+ else if (pGraphic || bHasGraphicURL)
+ {
WriteBlip(xShapeProps, sGraphicURL, false, pGraphic);
+ }
else if (bHasMediaURL)
{
Reference<graphic::XGraphic> rGraphic;
@@ -1172,6 +1185,8 @@ void ShapeExport::WriteGraphicObjectShapePart( const Reference< XShape >& xShape
if (bHasGraphicURL)
WriteSrcRect(xShapeProps, sGraphicURL);
+ else if (xGraphic.is())
+ WriteSrcRectXGraphic(xShapeProps, xGraphic);
// now we stretch always when we get pGraphic (when changing that
// behavior, test n#780830 for regression, where the OLE sheet might get tiled
diff --git a/sd/CppunitTest_sd_import_tests.mk b/sd/CppunitTest_sd_import_tests.mk
index 27c7f9181b71..12ad80637323 100644
--- a/sd/CppunitTest_sd_import_tests.mk
+++ b/sd/CppunitTest_sd_import_tests.mk
@@ -99,6 +99,7 @@ $(eval $(call gb_CppunitTest_use_components,sd_import_tests,\
svl/source/fsstor/fsstorage \
svtools/util/svt \
svx/util/svxcore \
+ svgio/svgio \
toolkit/util/tk \
ucb/source/core/ucb1 \
ucb/source/ucp/expand/ucpexpand1 \
diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx
index 257a59fbd05f..2ed7337438fd 100644
--- a/sd/qa/unit/import-tests.cxx
+++ b/sd/qa/unit/import-tests.cxx
@@ -2323,10 +2323,12 @@ void SdImportTest::testTdf114488()
// This doc has two images - one WMF and the other PNG (fallback image).
// When loading this doc, the WMF image should be preferred over the PNG image.
sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/odg/tdf114488.fodg"), FODG);
- uno::Reference< beans::XPropertySet > xShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
- OUString sGraphicUrl;
- xShape->getPropertyValue("GraphicURL") >>= sGraphicUrl;
- OUString sMimeType(comphelper::GraphicMimeTypeHelper::GetMimeTypeForImageUrl(sGraphicUrl));
+ uno::Reference<beans::XPropertySet> xShape(getShapeFromPage(0, 0, xDocShRef), uno::UNO_QUERY_THROW);
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShape->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT(xGraphic.is());
+ Graphic aGraphic(xGraphic);
+ OUString sMimeType(comphelper::GraphicMimeTypeHelper::GetMimeTypeForXGraphic(xGraphic));
CPPUNIT_ASSERT_EQUAL(OUString("image/x-wmf"), sMimeType);
}
diff --git a/sd/source/filter/eppt/epptso.cxx b/sd/source/filter/eppt/epptso.cxx
index 24eba89c4b38..89080a1a8db4 100644
--- a/sd/source/filter/eppt/epptso.cxx
+++ b/sd/source/filter/eppt/epptso.cxx
@@ -2219,7 +2219,7 @@ void PPTWriter::ImplWritePage( const PHLayout& rLayout, EscherSolverContainer& a
ImplCreateShape( ESCHER_ShpInst_Rectangle,
ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
aSolverContainer );
- if ( aPropOpt.CreateGraphicProperties( mXPropSet, "GraphicURL", true, true, false ) )
+ if ( aPropOpt.CreateGraphicProperties( mXPropSet, "Graphic", true, true, false ) )
{
aPropOpt.AddOpt( ESCHER_Prop_WrapText, ESCHER_WrapNone );
aPropOpt.AddOpt( ESCHER_Prop_AnchorText, ESCHER_AnchorMiddle );
@@ -2236,7 +2236,7 @@ void PPTWriter::ImplWritePage( const PHLayout& rLayout, EscherSolverContainer& a
ShapeFlag::HaveAnchor | ShapeFlag::HaveShapeProperty,
aSolverContainer );
- if ( aPropOpt.CreateGraphicProperties( mXPropSet, "GraphicURL", false, true ) )
+ if ( aPropOpt.CreateGraphicProperties( mXPropSet, "Graphic", false, true ) )
{
aPropOpt.AddOpt( ESCHER_Prop_LockAgainstGrouping, 0x800080 );
}
diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx
index 29dffa90fd3b..ceac4a34628b 100644
--- a/svx/source/svdraw/svdograf.cxx
+++ b/svx/source/svdraw/svdograf.cxx
@@ -676,10 +676,9 @@ void SdrGrafObj::ReleaseGraphicLink()
bool SdrGrafObj::IsLinkedGraphic() const
{
- return !aFileName.isEmpty();
+ return !mpGraphicObject->GetGraphic().getOriginURL().isEmpty();
}
-
void SdrGrafObj::TakeObjInfo(SdrObjTransformInfoRec& rInfo) const
{
bool bNoPresGrf = ( mpGraphicObject->GetType() != GraphicType::NONE ) && !bEmptyPresObj;
diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx
index 296517528a91..7bd0c1bb2633 100644
--- a/sw/qa/extras/globalfilter/globalfilter.cxx
+++ b/sw/qa/extras/globalfilter/globalfilter.cxx
@@ -289,24 +289,29 @@ void Test::testImageWithSpecialID()
/// Gives the first embedded or linked image in a document.
uno::Reference<drawing::XShape> lcl_getShape(const uno::Reference<lang::XComponent>& xComponent, bool bEmbedded)
{
- uno::Reference<drawing::XShape> xRet;
+ uno::Reference<drawing::XShape> xShape;
uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(xComponent, uno::UNO_QUERY);
uno::Reference<drawing::XDrawPage> xDrawPage = xDrawPageSupplier->getDrawPage();
for (sal_Int32 i = 0; i < xDrawPage->getCount(); ++i)
{
- uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(i), uno::UNO_QUERY);
- OUString sURL;
- xShape->getPropertyValue("GraphicURL") >>= sURL;
- // Linked image: working starts with file://, broken is e.g. 'vnd.sun.star.GraphicObject:3000000000000000000000000000000000000000'.
- if ((sURL.startsWith("file://") || sURL.endsWith("0000000000000000")) != bEmbedded)
+ uno::Reference<beans::XPropertySet> xShapeProperties(xDrawPage->getByIndex(i), uno::UNO_QUERY);
+ uno::Reference<graphic::XGraphic> xGraphic;
+ xShapeProperties->getPropertyValue("Graphic") >>= xGraphic;
+ if (xGraphic.is())
{
- xRet.set(xShape, uno::UNO_QUERY);
- break;
+ Graphic aGraphic(xGraphic);
+
+ if ((bEmbedded && aGraphic.getOriginURL().isEmpty()) ||
+ (!bEmbedded && !aGraphic.getOriginURL().isEmpty()))
+ {
+ xShape.set(xShapeProperties, uno::UNO_QUERY);
+ return xShape;
+ }
}
}
- return xRet;
+ return xShape;
}
void Test::testGraphicShape()
@@ -353,18 +358,14 @@ void Test::testGraphicShape()
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(2), xDraws->getCount());
uno::Reference<drawing::XShape> xImage = lcl_getShape(mxComponent, true);
- uno::Reference< beans::XPropertySet > XPropSet( xImage, uno::UNO_QUERY_THROW );
+ CPPUNIT_ASSERT_MESSAGE("Couldn't load the shape/image", xImage.is());
+ uno::Reference< beans::XPropertySet > XPropSet( xImage, uno::UNO_QUERY );
// First image is embedded
- // Check URL
- {
- OUString sURL;
- XPropSet->getPropertyValue("GraphicURL") >>= sURL;
- CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), sURL != "vnd.sun.star.GraphicObject:00000000000000000000000000000000");
- }
// Check size
{
uno::Reference<graphic::XGraphic> xGraphic;
XPropSet->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is());
uno::Reference<awt::XBitmap> xBitmap(xGraphic, uno::UNO_QUERY);
CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is());
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(610), xBitmap->getSize().Width );
@@ -377,17 +378,20 @@ void Test::testGraphicShape()
// Second image is a linked one
xImage = lcl_getShape(mxComponent, false);
- XPropSet.set( xImage, uno::UNO_QUERY_THROW );
- // Check URL
- {
- OUString sURL;
- XPropSet->getPropertyValue("GraphicURL") >>= sURL;
- CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), sURL.endsWith("linked_graphic.jpg"));
- }
+ XPropSet.set( xImage, uno::UNO_QUERY );
+ const OString sFailedImageLoad = OString("Couldn't load the shape/image for ") + aFilterNames[nFilter];
+ CPPUNIT_ASSERT_MESSAGE(sFailedImageLoad.getStr(), xImage.is());
+
// Check size
{
uno::Reference<graphic::XGraphic> xGraphic;
XPropSet->getPropertyValue("Graphic") >>= xGraphic;
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is());
+
+ Graphic aGraphic(xGraphic);
+ OUString sURL = aGraphic.getOriginURL();
+ CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), sURL.endsWith("linked_graphic.jpg"));
+
uno::Reference<awt::XBitmap> xBitmap(xGraphic, uno::UNO_QUERY);
CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xBitmap.is());
CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), static_cast<sal_Int32>(620), xBitmap->getSize().Width );
diff --git a/sw/source/filter/ww8/rtfsdrexport.cxx b/sw/source/filter/ww8/rtfsdrexport.cxx
index b65b50be104e..b62dd2b7c16b 100644
--- a/sw/source/filter/ww8/rtfsdrexport.cxx
+++ b/sw/source/filter/ww8/rtfsdrexport.cxx
@@ -499,21 +499,42 @@ void RtfSdrExport::impl_writeGraphic()
uno::Reference<drawing::XShape> xShape
= GetXShapeForSdrObject(const_cast<SdrObject*>(m_pSdrObject));
uno::Reference<beans::XPropertySet> xPropertySet(xShape, uno::UNO_QUERY);
- OUString sGraphicURL;
+
+ uno::Reference<graphic::XGraphic> xGraphic;
+
+ Graphic aGraphic;
+
try
{
- xPropertySet->getPropertyValue("GraphicURL") >>= sGraphicURL;
+ xPropertySet->getPropertyValue("Graphic") >>= xGraphic;
}
catch (beans::UnknownPropertyException& rException)
{
- // ATM groupshapes are not supported, just make sure we don't crash on them.
SAL_WARN("sw.rtf", "failed. Message: " << rException);
- return;
}
- OString aURLBS(OUStringToOString(sGraphicURL, RTL_TEXTENCODING_UTF8));
- Graphic aGraphic
- = GraphicObject(aURLBS.copy(RTL_CONSTASCII_LENGTH("vnd.sun.star.GraphicObject:")))
- .GetTransformedGraphic();
+
+ if (xGraphic.is())
+ {
+ aGraphic = Graphic(xGraphic);
+ }
+ else
+ {
+ OUString sGraphicURL;
+ try
+ {
+ xPropertySet->getPropertyValue("GraphicURL") >>= sGraphicURL;
+ }
+ catch (beans::UnknownPropertyException& rException)
+ {
+ // ATM groupshapes are not supported, just make sure we don't crash on them.
+ SAL_WARN("sw.rtf", "failed. Message: " << rException);
+ return;
+ }
+
+ OString aURLBS(OUStringToOString(sGraphicURL, RTL_TEXTENCODING_UTF8));
+ OString aUrl = aURLBS.copy(RTL_CONSTASCII_LENGTH("vnd.sun.star.GraphicObject:"));
+ aGraphic = GraphicObject(aUrl).GetTransformedGraphic();
+ }
// Export it to a stream.
SvMemoryStream aStream;
diff --git a/xmloff/inc/xmlmultiimagehelper.hxx b/xmloff/inc/xmlmultiimagehelper.hxx
index ee2df0f53c74..2b29835c2f26 100644
--- a/xmloff/inc/xmlmultiimagehelper.hxx
+++ b/xmloff/inc/xmlmultiimagehelper.hxx
@@ -34,6 +34,7 @@ protected:
/// helper to get the created xShape instance, override this
virtual OUString getGraphicURLFromImportContext(const SvXMLImportContext& rContext) const = 0;
virtual void removeGraphicFromImportContext(const SvXMLImportContext& rContext) = 0;
+ virtual css::uno::Reference<css::graphic::XGraphic> getGraphicFromImportContext(const SvXMLImportContext& rContext) const;
public:
MultiImageImportHelper();
diff --git a/xmloff/source/core/xmlexp.cxx b/xmloff/source/core/xmlexp.cxx
index a3015b8903ef..7f5df92e5875 100644
--- a/xmloff/source/core/xmlexp.cxx
+++ b/xmloff/source/core/xmlexp.cxx
@@ -27,6 +27,7 @@
#include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
#include <osl/mutex.hxx>
#include <tools/urlobj.hxx>
+#include <vcl/graph.hxx>
#include <comphelper/genericpropertyset.hxx>
#include <com/sun/star/container/XNameAccess.hpp>
#include <com/sun/star/io/XInputStream.hpp>
@@ -1884,19 +1885,27 @@ OUString SvXMLExport::AddEmbeddedGraphicObject( const OUString& rGraphicObjectUR
OUString SvXMLExport::AddEmbeddedXGraphic(uno::Reference<graphic::XGraphic> const & rxGraphic, OUString const & rRequestedName)
{
- OUString sInternalURL;
+ OUString sURL;
- uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler(mxGraphicResolver, uno::UNO_QUERY);
+ Graphic aGraphic(rxGraphic);
+ OUString aOriginURL = aGraphic.getOriginURL();
- if (mxGraphicResolver.is() && xGraphicStorageHandler.is())
+ if (!aOriginURL.isEmpty())
{
- if (!(getExportFlags() & SvXMLExportFlags::EMBEDDED))
+ sURL = GetRelativeReference(aOriginURL);
+ }
+ else
+ {
+ uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler(mxGraphicResolver, uno::UNO_QUERY);
+ if (mxGraphicResolver.is() && xGraphicStorageHandler.is())
{
- sInternalURL = xGraphicStorageHandler->saveGraphicByName(rxGraphic, rRequestedName);
+ if (!(getExportFlags() & SvXMLExportFlags::EMBEDDED))
+ {
+ sURL = xGraphicStorageHandler->saveGraphicByName(rxGraphic, rRequestedName);
+ }
}
}
-
- return sInternalURL;
+ return sURL;
}
Reference< XInputStream > SvXMLExport::GetEmbeddedGraphicObjectStream( const OUString& rGraphicObjectURL )
diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx
index 5203cdc4d751..c77193ba38cb 100644
--- a/xmloff/source/core/xmlimp.cxx
+++ b/xmloff/source/core/xmlimp.cxx
@@ -23,6 +23,7 @@
#include <tools/diagnose_ex.h>
#include <com/sun/star/beans/XPropertySetInfo.hpp>
#include <tools/urlobj.hxx>
+#include <vcl/graph.hxx>
#include <xmloff/unointerfacetouniqueidentifiermapper.hxx>
#include <xmloff/nmspmap.hxx>
#include <xmloff/xmluconv.hxx>
@@ -45,6 +46,7 @@
#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/graphic/GraphicProvider.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>
@@ -57,6 +59,7 @@
#include <comphelper/processfactory.hxx>
#include <comphelper/documentconstants.hxx>
#include <comphelper/storagehelper.hxx>
+#include <comphelper/propertysequence.hxx>
#include <unotools/fontcvt.hxx>
#include <o3tl/make_unique.hxx>
#include <xmloff/fasttokenhandler.hxx>
@@ -1353,14 +1356,47 @@ bool SvXMLImport::IsPackageURL( const OUString& rURL ) const
return true;
}
-css::uno::Reference<css::graphic::XGraphic> SvXMLImport::loadGraphicByURL(const OUString& rURL)
+uno::Reference<graphic::XGraphic> SvXMLImport::loadGraphicByURL(OUString const & rURL)
{
- css::uno::Reference<css::graphic::XGraphic> xGraphic;
+ uno::Reference<graphic::XGraphic> xGraphic;
uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler(mxGraphicResolver, uno::UNO_QUERY);
- if (IsPackageURL(rURL) && xGraphicStorageHandler.is())
+ if (xGraphicStorageHandler.is())
{
- xGraphic = xGraphicStorageHandler->loadGraphic(rURL);
+ if (IsPackageURL(rURL))
+ {
+ xGraphic = xGraphicStorageHandler->loadGraphic(rURL);
+ }
+ else
+ {
+ uno::Reference<graphic::XGraphicProvider> xProvider(graphic::GraphicProvider::create(GetComponentContext()));
+ OUString const & rAbsoluteURL = GetAbsoluteReference(rURL);
+ uno::Sequence<beans::PropertyValue> aLoadProperties(comphelper::InitPropertySequence(
+ {
+ { "URL", uno::makeAny(rAbsoluteURL) }
+ }));
+
+ xGraphic = xProvider->queryGraphic(aLoadProperties);
+ if (xGraphic.is())
+ {
+ Graphic aGraphic(xGraphic);
+ aGraphic.setOriginURL(rAbsoluteURL);
+ printf ("URL %s\n", rAbsoluteURL.toUtf8().getStr());
+ }
+ }
+ }
+
+ return xGraphic;
+}
+
+uno::Reference<graphic::XGraphic> SvXMLImport::loadGraphicFromBase64(uno::Reference<io::XOutputStream> const & rxOutputStream)
+{
+ uno::Reference<graphic::XGraphic> xGraphic;
+ uno::Reference<document::XGraphicStorageHandler> xGraphicStorageHandler(mxGraphicResolver, uno::UNO_QUERY);
+
+ if (xGraphicStorageHandler.is())
+ {
+ xGraphic = xGraphicStorageHandler->loadGraphicFromOutputStream(rxOutputStream);
}
return xGraphic;
diff --git a/xmloff/source/core/xmlmultiimagehelper.cxx b/xmloff/source/core/xmlmultiimagehelper.cxx
index 3d7725a3b24f..83cee5bbae2a 100644
--- a/xmloff/source/core/xmlmultiimagehelper.cxx
+++ b/xmloff/source/core/xmlmultiimagehelper.cxx
@@ -26,7 +26,7 @@ using namespace ::com::sun::star;
namespace
{
- sal_uInt32 getQualityIndex(const OUString& rString)
+ OUString getMimeTypeForURL(const OUString& rString)
{
OUString sMimeType;
if (rString.startsWith("vnd.sun.star.GraphicObject"))
@@ -42,45 +42,48 @@ namespace
else
{
SAL_WARN("xmloff", "Unknown image source: " << rString);
- return 0;
}
+ return sMimeType;
+ }
+ sal_uInt32 getQualityIndex(const OUString& rMimeType)
+ {
// pixel formats first
- if(sMimeType == "image/bmp")
+ if (rMimeType == "image/bmp")
{
return 10;
}
- if(sMimeType == "image/gif")
+ if (rMimeType == "image/gif")
{
return 20;
}
- if(sMimeType == "image/jpeg")
+ if (rMimeType == "image/jpeg")
{
return 30;
}
- if(sMimeType == "image/png")
+ if (rMimeType == "image/png")
{
return 40;
}
// vector formats, prefer always
- if(sMimeType == "image/x-svm")
+ if (rMimeType == "image/x-svm")
{
return 1000;
}
- if(sMimeType == "image/x-wmf")
+ if (rMimeType == "image/x-wmf")
{
return 1010;
}
- if(sMimeType == "image/x-emf")
+ if (rMimeType == "image/x-emf")
{
return 1020;
}
- if(sMimeType == "application/pdf")
+ if (rMimeType == "application/pdf")
{
return 1030;
}
- if(sMimeType == "image/svg+xml")
+ if (rMimeType == "image/svg+xml")
{
return 1040;
}
@@ -111,10 +114,26 @@ SvXMLImportContextRef MultiImageImportHelper::solveMultipleImages()
for(std::vector<SvXMLImportContextRef>::size_type a = 0; a < maImplContextVector.size(); a++)
{
- const OUString aStreamURL(getGraphicURLFromImportContext(*maImplContextVector[a].get()));
- const sal_uInt32 nNewQuality(getQualityIndex(aStreamURL));
+ const SvXMLImportContext& rContext = *maImplContextVector[a].get();
+
+ sal_uInt32 nNewQuality = 0;
+
+ uno::Reference<graphic::XGraphic> xGraphic(getGraphicFromImportContext(rContext));
+ if (xGraphic.is())
+ {
+ OUString sMimeType = comphelper::GraphicMimeTypeHelper::GetMimeTypeForXGraphic(xGraphic);
+ nNewQuality = getQualityIndex(sMimeType);
+ }
+ else
+ {
+ const OUString aStreamURL(getGraphicURLFromImportContext(rContext));
+ if (!aStreamURL.isEmpty())
+ {
+ nNewQuality = getQualityIndex(getMimeTypeForURL(aStreamURL));
+ }
+ }
- if(nNewQuality > nBestQuality)
+ if (nNewQuality > nBestQuality)
{
nBestQuality = nNewQuality;
nIndexOfPreferred = a;
@@ -156,4 +175,9 @@ void MultiImageImportHelper::addContent(const SvXMLImportContext& rSvXMLImportCo
maImplContextVector.emplace_back(const_cast< SvXMLImportContext* >(&rSvXMLImportContext));
}
+uno::Reference<graphic::XGraphic> MultiImageImportHelper::getGraphicFromImportContext(const SvXMLImportContext& /*rContext*/) const
+{
+ return uno::Reference<graphic::XGraphic>();
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/draw/shapeexport.cxx b/xmloff/source/draw/shapeexport.cxx
index 81293655dea7..b1b5ea0e1537 100644
--- a/xmloff/source/draw/shapeexport.cxx
+++ b/xmloff/source/draw/shapeexport.cxx
@@ -2307,6 +2307,33 @@ void XMLShapeExport::ImpExportPolygonShape(
}
+namespace
+{
+
+OUString getNameFromStreamURL(OUString const & rURL)
+{
+ const OUString sPackageURL("vnd.sun.star.Package:");
+
+ OUString sResult;
+
+ if (rURL.match(sPackageURL))
+ {
+ OUString sRequestedName = rURL.copy(sPackageURL.getLength());
+ sal_Int32 nLastIndex = sRequestedName.lastIndexOf('/') + 1;
+ if ((nLastIndex > 0) && (nLastIndex < sRequestedName.getLength()))
+ sRequestedName = sRequestedName.copy(nLastIndex);
+ nLastIndex = sRequestedName.lastIndexOf('.');
+ if (nLastIndex >= 0)
+ sRequestedName = sRequestedName.copy(0, nLastIndex);
+ if (!sRequestedName.isEmpty())
+ sResult = sRequestedName;
+ }
+
+ return sResult;
+}
+
+} // end anonymous namespace
+
void XMLShapeExport::ImpExportGraphicObjectShape(
const uno::Reference< drawing::XShape >& xShape,
XmlShapeType eShapeType, XMLShapeExportFlags nFeatures, awt::Point* pRefPoint)
@@ -2320,8 +2347,6 @@ void XMLShapeExport::ImpExportGraphicObjectShape(
// Transformation
ImpExportNewTrans(xPropSet, nFeatures, pRefPoint);
- OUString sImageURL;
-
if(eShapeType == XmlShapeTypePresGraphicObjectShape)
bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, GetXMLToken(XML_PRESENTATION_GRAPHIC) );
@@ -2331,53 +2356,56 @@ void XMLShapeExport::ImpExportGraphicObjectShape(
const bool bSaveBackwardsCompatible = bool( mrExport.getExportFlags() & SvXMLExportFlags::SAVEBACKWARDCOMPATIBLE );
+ OUString sImageURL;
+ uno::Reference<graphic::XGraphic> xGraphic;
+
if( !bIsEmptyPresObj || bSaveBackwardsCompatible )
{
if( !bIsEmptyPresObj )
{
OUString aStreamURL;
-
xPropSet->getPropertyValue("GraphicStreamURL") >>= aStreamURL;
+
+ OUString sRequestedName = getNameFromStreamURL(aStreamURL);
+
xPropSet->getPropertyValue("GraphicURL") >>= sImageURL;
- OUString aResolveURL( sImageURL );
- const OUString sPackageURL( "vnd.sun.star.Package:" );
+ uno::Any aGraphicAny = xPropSet->getPropertyValue("Graphic");
+ if (aGraphicAny.has<uno::Reference<graphic::XGraphic>>())
+ xGraphic = aGraphicAny.get<uno::Reference<graphic::XGraphic>>();
+
+ OUString aStoredURL;
- // trying to preserve the filename for embedded images which already have its stream inside the package
- bool bIsEmbeddedImageWithExistingStreamInPackage = false;
- if ( aStreamURL.match( sPackageURL ) )
+ if (xGraphic.is())
{
- bIsEmbeddedImageWithExistingStreamInPackage = true;
-
- OUString sRequestedName = aStreamURL.copy( sPackageURL.getLength() );
- sal_Int32 nLastIndex = sRequestedName.lastIndexOf( '/' ) + 1;
- if ( ( nLastIndex > 0 ) && ( nLastIndex < sRequestedName.getLength() ) )
- sRequestedName = sRequestedName.copy( nLastIndex );
- nLastIndex = sRequestedName.lastIndexOf( '.' );
- if ( nLastIndex >= 0 )
- sRequestedName = sRequestedName.copy( 0, nLastIndex );
- if ( !sRequestedName.isEmpty() )
- {
+ aStoredURL = mrExport.AddEmbeddedXGraphic(xGraphic, sRequestedName);
+ }
+ else
+ {
+ OUString aResolveURL(sImageURL);
+ if (!sRequestedName.isEmpty())
aResolveURL += "?requestedName=" + sRequestedName;
- }
+
+ aStoredURL = mrExport.AddEmbeddedGraphicObject(aResolveURL);
}
- const OUString aStr = mrExport.AddEmbeddedGraphicObject( aResolveURL );
- mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, aStr );
+ mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, aStoredURL);
- if( !aStr.isEmpty() )
+ if (!aStoredURL.isEmpty())
{
+ const OUString sPackageURL("vnd.sun.star.Package:");
+
// apply possible changed stream URL to embedded image object
- if ( bIsEmbeddedImageWithExistingStreamInPackage )
+ if (!sRequestedName.isEmpty())
{
OUString newStreamURL = sPackageURL;
- if ( aStr[0] == '#' )
+ if (aStoredURL[0] == '#')
{
- newStreamURL += aStr.copy( 1, aStr.getLength() - 1 );
+ newStreamURL += aStoredURL.copy(1, aStoredURL.getLength() - 1);
}
else
{
- newStreamURL += aStr;
+ newStreamURL += aStoredURL;
}
if (newStreamURL != aStreamURL)
diff --git a/xmloff/source/draw/ximpshap.cxx b/xmloff/source/draw/ximpshap.cxx
index 4ccdb68d5ff1..187262720251 100644
--- a/xmloff/source/draw/ximpshap.cxx
+++ b/xmloff/source/draw/ximpshap.cxx
@@ -2402,15 +2402,10 @@ void SdXMLGraphicObjectShapeContext::StartElement( const css::uno::Reference< cs
{
if( !maURL.isEmpty() )
{
- uno::Any aAny;
- aAny <<= GetImport().ResolveGraphicObjectURL( maURL, GetImport().isGraphicLoadOnDemandSupported() );
- try
- {
- xPropset->setPropertyValue("GraphicURL", aAny );
- xPropset->setPropertyValue("GraphicStreamURL", aAny );
- }
- catch (const lang::IllegalArgumentException&)
+ uno::Reference<graphic::XGraphic> xGraphic = GetImport().loadGraphicByURL(maURL);
+ if (xGraphic.is())
{
+ xPropset->setPropertyValue("Graphic", uno::makeAny(xGraphic));
}
}
}
@@ -2439,23 +2434,15 @@ void SdXMLGraphicObjectShapeContext::StartElement( const css::uno::Reference< cs
void SdXMLGraphicObjectShapeContext::EndElement()
{
- if( mxBase64Stream.is() )
+ if (mxBase64Stream.is())
{
- OUString sURL( GetImport().ResolveGraphicObjectURLFromBase64( mxBase64Stream ) );
- if( !sURL.isEmpty() )
+ uno::Reference<graphic::XGraphic> xGraphic(GetImport().loadGraphicFromBase64(mxBase64Stream));
+ if (xGraphic.is())
{
- try
- {
- uno::Reference< beans::XPropertySet > xProps(mxShape, uno::UNO_QUERY);
- if(xProps.is())
- {
- const uno::Any aAny( uno::makeAny( sURL ) );
- xProps->setPropertyValue("GraphicURL", aAny );
- xProps->setPropertyValue("GraphicStreamURL", aAny );
- }
- }
- catch (const lang::IllegalArgumentException&)
+ uno::Reference<beans::XPropertySet> xProperties(mxShape, uno::UNO_QUERY);
+ if (xProperties.is())
{
+ xProperties->setPropertyValue("Graphic", uno::makeAny(xGraphic));
}
}
}
@@ -3365,6 +3352,41 @@ void SdXMLFrameShapeContext::removeGraphicFromImportContext(const SvXMLImportCon
}
}
+namespace
+{
+uno::Reference<beans::XPropertySet> getGraphicPropertySetFromImportContext(const SvXMLImportContext& rContext)
+{
+ uno::Reference<beans::XPropertySet> aPropertySet;
+ const SdXMLGraphicObjectShapeContext* pSdXMLGraphicObjectShapeContext = dynamic_cast<const SdXMLGraphicObjectShapeContext*>(&rContext);
+
+ if (pSdXMLGraphicObjectShapeContext)
+ aPropertySet.set(pSdXMLGraphicObjectShapeContext->getShape(), uno::UNO_QUERY);
+
+ return aPropertySet;
+}
+
+} // end anonymous namespace
+
+uno::Reference<graphic::XGraphic> SdXMLFrameShapeContext::getGraphicFromImportContext(const SvXMLImportContext& rContext) const
+{
+ uno::Reference<graphic::XGraphic> xGraphic;
+ try
+ {
+ const uno::Reference<beans::XPropertySet> xPropertySet = getGraphicPropertySetFromImportContext(rContext);
+
+ if (xPropertySet.is())
+ {
+ xPropertySet->getPropertyValue("Graphic") >>= xGraphic;
+ }
+ }
+ catch( uno::Exception& )
+ {
+ DBG_UNHANDLED_EXCEPTION_WHEN("Error in cleanup of multiple graphic object import.");
+ }
+
+ return xGraphic;
+}
+
OUString SdXMLFrameShapeContext::getGraphicURLFromImportContext(const SvXMLImportContext& rContext) const
{
OUString aRetval;
diff --git a/xmloff/source/draw/ximpshap.hxx b/xmloff/source/draw/ximpshap.hxx
index 950d8645aae8..c6376719c637 100644
--- a/xmloff/source/draw/ximpshap.hxx
+++ b/xmloff/source/draw/ximpshap.hxx
@@ -550,6 +550,8 @@ protected:
virtual OUString getGraphicURLFromImportContext(const SvXMLImportContext& rContext) const override;
virtual void removeGraphicFromImportContext(const SvXMLImportContext& rContext) override;
+ css::uno::Reference<css::graphic::XGraphic> getGraphicFromImportContext(const SvXMLImportContext& rContext) const override;
+
public:
SdXMLFrameShapeContext( SvXMLImport& rImport, sal_uInt16 nPrfx,