diff --git a/chart2/export_setup.mk b/chart2/export_setup.mk index b2bcf751111e..723df9897c4a 100644 --- a/chart2/export_setup.mk +++ b/chart2/export_setup.mk @@ -71,65 +71,7 @@ $(eval $(call gb_CppunitTest_use_sdk_api,chart2_export$(1))) $(eval $(call gb_CppunitTest_use_ure,chart2_export$(1))) $(eval $(call gb_CppunitTest_use_vcl,chart2_export$(1))) - -$(eval $(call gb_CppunitTest_use_components,chart2_export$(1),\ - basic/util/sb \ - animations/source/animcore/animcore \ - chart2/source/controller/chartcontroller \ - chart2/source/chartcore \ - comphelper/util/comphelp \ - configmgr/source/configmgr \ - dbaccess/util/dba \ - embeddedobj/util/embobj \ - emfio/emfio \ - eventattacher/source/evtatt \ - filter/source/config/cache/filterconfig1 \ - filter/source/odfflatxml/odfflatxml \ - filter/source/storagefilterdetect/storagefd \ - filter/source/xmlfilteradaptor/xmlfa \ - filter/source/xmlfilterdetect/xmlfd \ - forms/util/frm \ - framework/util/fwk \ - i18npool/util/i18npool \ - linguistic/source/lng \ - oox/util/oox \ - package/source/xstor/xstor \ - package/util/package2 \ - sax/source/expatwrap/expwrap \ - sc/util/sc \ - sc/util/scd \ - sc/util/scfilt \ - sw/util/sw \ - sw/util/swd \ - sw/util/msword \ - sd/util/sd \ - sd/util/sdd \ - $(call gb_Helper_optional,SCRIPTING, \ - sc/util/vbaobj) \ - scaddins/source/analysis/analysis \ - scaddins/source/datefunc/date \ - scripting/source/basprov/basprov \ - scripting/util/scriptframe \ - sfx2/util/sfx \ - sot/util/sot \ - svl/source/fsstor/fsstorage \ - svl/util/svl \ - svtools/util/svt \ - svx/util/svx \ - svx/util/svxcore \ - toolkit/util/tk \ - vcl/vcl.common \ - ucb/source/core/ucb1 \ - ucb/source/ucp/file/ucpfile1 \ - ucb/source/ucp/tdoc/ucptdoc1 \ - unotools/util/utl \ - unoxml/source/rdf/unordf \ - unoxml/source/service/unoxml \ - uui/util/uui \ - writerfilter/util/writerfilter \ - xmloff/util/xo \ - xmlscript/util/xmlscript \ -)) +$(eval $(call gb_CppunitTest_use_rdb,chart2_export$(1),services)) $(eval $(call gb_CppunitTest_use_uiconfigs,chart2_export$(1), \ modules/swriter \ diff --git a/oox/inc/drawingml/misccontexts.hxx b/oox/inc/drawingml/misccontexts.hxx index c79816282ae7..1b7f05444ac7 100644 --- a/oox/inc/drawingml/misccontexts.hxx +++ b/oox/inc/drawingml/misccontexts.hxx @@ -102,7 +102,8 @@ class BlipExtensionContext final : public ::oox::core::ContextHandler2 public: explicit BlipExtensionContext( ::oox::core::ContextHandler2Helper const & rParent, - BlipFillProperties& rBlipProps ); + BlipFillProperties& rBlipProps, + model::BlipFill* pBlipFill); virtual ~BlipExtensionContext() override; virtual ::oox::core::ContextHandlerRef @@ -112,6 +113,7 @@ public: private: BlipFillProperties& mrBlipProps; + model::BlipFill* mpBlipFill; }; diff --git a/oox/source/core/xmlfilterbase.cxx b/oox/source/core/xmlfilterbase.cxx index d197440133da..93b5816812a1 100644 --- a/oox/source/core/xmlfilterbase.cxx +++ b/oox/source/core/xmlfilterbase.cxx @@ -149,6 +149,7 @@ const Sequence< beans::Pair< OUString, sal_Int32 > >& NamespaceIds() {"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2", NMSP_xr2}, {"http://schemas.microsoft.com/office/drawing/2017/decorative", NMSP_adec}, + {"http://schemas.microsoft.com/office/drawing/2016/SVG/main", NMSP_asvg}, }; return SINGLETON; }; diff --git a/oox/source/drawingml/misccontexts.cxx b/oox/source/drawingml/misccontexts.cxx index 2eef9ab6133a..244d17d9fc62 100644 --- a/oox/source/drawingml/misccontexts.cxx +++ b/oox/source/drawingml/misccontexts.cxx @@ -369,7 +369,7 @@ ContextHandlerRef BlipContext::onCreateContext( return new DuotoneContext( *this, mrBlipProps ); case A_TOKEN( extLst ): - return new BlipExtensionContext( *this, mrBlipProps ); + return new BlipExtensionContext(*this, mrBlipProps, mpBlipFill); case A_TOKEN( lum ): { @@ -598,9 +598,10 @@ SimpleFillPropertiesContext::~SimpleFillPropertiesContext() mrColor = getBestSolidColor(); } -BlipExtensionContext::BlipExtensionContext( ContextHandler2Helper const & rParent, BlipFillProperties& rBlipProps ) : - ContextHandler2( rParent ), - mrBlipProps( rBlipProps ) +BlipExtensionContext::BlipExtensionContext(ContextHandler2Helper const & rParent, BlipFillProperties& rBlipProps, model::BlipFill* pBlipFill) + : ContextHandler2(rParent) + , mrBlipProps(rBlipProps) + , mpBlipFill(pBlipFill) { } @@ -608,16 +609,32 @@ BlipExtensionContext::~BlipExtensionContext() { } -ContextHandlerRef BlipExtensionContext::onCreateContext( - sal_Int32 nElement, const AttributeList& ) +ContextHandlerRef BlipExtensionContext::onCreateContext(sal_Int32 nElement, const AttributeList& rAttribs) { switch( nElement ) { - case A_TOKEN( ext ): - return new BlipExtensionContext( *this, mrBlipProps ); + case A_TOKEN(ext): + return new BlipExtensionContext(*this, mrBlipProps, mpBlipFill); - case OOX_TOKEN( a14, imgProps ): - return new ArtisticEffectContext( *this, mrBlipProps.maEffect ); + case OOX_TOKEN(a14, imgProps): + return new ArtisticEffectContext(*this, mrBlipProps.maEffect); + + case OOX_TOKEN(asvg, svgBlip): + { + if (rAttribs.hasAttribute(R_TOKEN(embed))) + { + // internal picture URL + OUString aFragmentPath = getFragmentPathFromRelId(rAttribs.getStringDefaulted(R_TOKEN(embed))); + if (!aFragmentPath.isEmpty()) + { + auto xGraphic = getFilter().getGraphicHelper().importEmbeddedGraphic(aFragmentPath); + mrBlipProps.mxFillGraphic = xGraphic; + if (mpBlipFill) + mpBlipFill->mxGraphic = xGraphic; + } + } + } + break; } return nullptr; } diff --git a/sd/qa/unit/data/odp/SvgImageTest.odp b/sd/qa/unit/data/odp/SvgImageTest.odp new file mode 100644 index 000000000000..38b92df80896 Binary files /dev/null and b/sd/qa/unit/data/odp/SvgImageTest.odp differ diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx index c39d110c3022..92b36ecacce7 100644 --- a/sd/qa/unit/export-tests.cxx +++ b/sd/qa/unit/export-tests.cxx @@ -1927,6 +1927,37 @@ CPPUNIT_TEST_FIXTURE(SdExportTest, testTdf153179) CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getPage(0)->getCount()); } +CPPUNIT_TEST_FIXTURE(SdExportTest, testSvgImageSupport) +{ + for (OUString const& rFormat : { u"impress8"_ustr, u"Impress Office Open XML"_ustr }) + { + // Load the original file + createSdImpressDoc("odp/SvgImageTest.odp"); + const OString sFailedMessage = "Failed on filter: " + rFormat.toUtf8(); + saveAndReload(rFormat); + + // Check whether graphic was exported well + uno::Reference xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(1), + xDrawPagesSupplier->getDrawPages()->getCount()); + uno::Reference xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xDrawPage.is()); + uno::Reference xImage(xDrawPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference xPropertySet(xImage, uno::UNO_QUERY_THROW); + + uno::Reference xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + Graphic aGraphic(xGraphic); + auto pVectorGraphic = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pVectorGraphic); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), VectorGraphicDataType::Svg, + pVectorGraphic->getType()); + } +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/qa/extras/globalfilter/data/SvgImageTest.odt b/sw/qa/extras/globalfilter/data/SvgImageTest.odt new file mode 100644 index 000000000000..3b37fe7998ef Binary files /dev/null and b/sw/qa/extras/globalfilter/data/SvgImageTest.odt differ diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx index c12e300ebfaa..3eda6b6354e8 100644 --- a/sw/qa/extras/globalfilter/globalfilter.cxx +++ b/sw/qa/extras/globalfilter/globalfilter.cxx @@ -68,6 +68,7 @@ public: void testDropDownFormField(); void testDateFormField(); void testDateFormFieldCharacterFormatting(); + void testSvgImageSupport(); CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST(testEmbeddedGraphicRoundtrip); @@ -91,6 +92,7 @@ public: CPPUNIT_TEST(testDropDownFormField); CPPUNIT_TEST(testDateFormField); CPPUNIT_TEST(testDateFormFieldCharacterFormatting); + CPPUNIT_TEST(testSvgImageSupport); CPPUNIT_TEST_SUITE_END(); }; @@ -2214,6 +2216,41 @@ void Test::testDateFormFieldCharacterFormatting() } } +void Test::testSvgImageSupport() +{ + OUString aFilterNames[] = { + "writer8", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + // Check whether the export code swaps in the image which was swapped out before by auto mechanism + + createSwDoc("SvgImageTest.odt"); + + // Export the document and import again for a check + saveAndReload(rFilterName); + + // Check whether graphic exported well after it was swapped out + const OString sFailedMessage = "Failed on filter: "_ostr + rFilterName.toUtf8(); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), 1, getShapes()); + + // First image + uno::Reference xImage(getShape(1), uno::UNO_QUERY); + uno::Reference xPropertySet(xImage, uno::UNO_QUERY_THROW); + + uno::Reference xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + Graphic aGraphic(xGraphic); + auto pVectorGraphic = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pVectorGraphic); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), VectorGraphicDataType::Svg, pVectorGraphic->getType()); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT();