diff options
-rw-r--r-- | chart2/export_setup.mk | 60 | ||||
-rw-r--r-- | oox/inc/drawingml/misccontexts.hxx | 4 | ||||
-rw-r--r-- | oox/source/core/xmlfilterbase.cxx | 1 | ||||
-rw-r--r-- | oox/source/drawingml/misccontexts.cxx | 41 | ||||
-rw-r--r-- | sd/qa/unit/data/odp/SvgImageTest.odp | bin | 0 -> 15922 bytes | |||
-rw-r--r-- | sd/qa/unit/export-tests.cxx | 44 | ||||
-rw-r--r-- | sw/qa/extras/globalfilter/data/SvgImageTest.odt | bin | 0 -> 13608 bytes | |||
-rw-r--r-- | sw/qa/extras/globalfilter/globalfilter.cxx | 51 |
8 files changed, 130 insertions, 71 deletions
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 c2911a756047..9ed0cc4e6151 100644 --- a/oox/source/core/xmlfilterbase.cxx +++ b/oox/source/core/xmlfilterbase.cxx @@ -148,6 +148,7 @@ const Sequence< beans::Pair< OUString, sal_Int32 > >& NamespaceIds() NMSP_c15}, {"http://schemas.microsoft.com/office/spreadsheetml/2015/revision2", NMSP_xr2}, + {"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 25058d392600..e5b52c2de30d 100644 --- a/oox/source/drawingml/misccontexts.cxx +++ b/oox/source/drawingml/misccontexts.cxx @@ -366,7 +366,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 ): { @@ -595,9 +595,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) { } @@ -605,16 +606,36 @@ 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); + + // Import the SVG Blip + case OOX_TOKEN(asvg, svgBlip): + { + if (rAttribs.hasAttribute(R_TOKEN(embed))) + { + OUString aFragmentPath = getFragmentPathFromRelId(rAttribs.getStringDefaulted(R_TOKEN(embed))); + if (!aFragmentPath.isEmpty()) + { + // Read the graphic from the fragment path + auto xGraphic = getFilter().getGraphicHelper().importEmbeddedGraphic(aFragmentPath); - case OOX_TOKEN( a14, imgProps ): - return new ArtisticEffectContext( *this, mrBlipProps.maEffect ); + // Overwrite the fill graphic with the one contining SVG + mrBlipProps.mxFillGraphic = xGraphic; + if (mpBlipFill) + mpBlipFill->mxGraphic = xGraphic; + } + } + // TODO - link + } + break; } return nullptr; } diff --git a/sd/qa/unit/data/odp/SvgImageTest.odp b/sd/qa/unit/data/odp/SvgImageTest.odp Binary files differnew file mode 100644 index 000000000000..38b92df80896 --- /dev/null +++ b/sd/qa/unit/data/odp/SvgImageTest.odp diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx index 029ee7267054..1c4bf622876a 100644 --- a/sd/qa/unit/export-tests.cxx +++ b/sd/qa/unit/export-tests.cxx @@ -103,6 +103,7 @@ public: void testCellProperties(); void testUserTableStyles(); void testTdf153179(); + void testSvgImageSupport(); CPPUNIT_TEST_SUITE(SdExportTest); @@ -156,6 +157,7 @@ public: CPPUNIT_TEST(testCellProperties); CPPUNIT_TEST(testUserTableStyles); CPPUNIT_TEST(testTdf153179); + CPPUNIT_TEST(testSvgImageSupport); CPPUNIT_TEST_SUITE_END(); virtual void registerNamespaces(xmlXPathContextPtr& pXmlXPathCtx) override @@ -1858,6 +1860,48 @@ void SdExportTest::testTdf153179() CPPUNIT_ASSERT_EQUAL(sal_Int32(1), getPage(0)->getCount()); } +void SdExportTest::testSvgImageSupport() +{ + for (std::u16string_view rFormat : { u"impress8", u"Impress Office Open XML" }) + { + // Load the original file + createSdImpressDoc("odp/SvgImageTest.odp"); + // Save into the target format + saveAndReload(OUString(rFormat)); + + const OString sFailedMessage = "Failed on filter: " + OUString(rFormat).toUtf8(); + + // Check whether SVG graphic was exported as expected + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, + uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), sal_Int32(1), + xDrawPagesSupplier->getDrawPages()->getCount()); + uno::Reference<drawing::XDrawPage> xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xDrawPage.is()); + + // Get the image + uno::Reference<drawing::XShape> xImage(xDrawPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xPropertySet(xImage, uno::UNO_QUERY_THROW); + + // Convert to a XGraphic + uno::Reference<graphic::XGraphic> xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + + // Access the Graphic + Graphic aGraphic(xGraphic); + + // Check if it contian a VectorGraphicData struct + auto pVectorGraphic = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pVectorGraphic); + + // Which should be of type SVG, which means we have a SVG file + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), VectorGraphicDataType::Svg, + pVectorGraphic->getType()); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdExportTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/sw/qa/extras/globalfilter/data/SvgImageTest.odt b/sw/qa/extras/globalfilter/data/SvgImageTest.odt Binary files differnew file mode 100644 index 000000000000..3b37fe7998ef --- /dev/null +++ b/sw/qa/extras/globalfilter/data/SvgImageTest.odt diff --git a/sw/qa/extras/globalfilter/globalfilter.cxx b/sw/qa/extras/globalfilter/globalfilter.cxx index 43b6afdad443..2683bc227ded 100644 --- a/sw/qa/extras/globalfilter/globalfilter.cxx +++ b/sw/qa/extras/globalfilter/globalfilter.cxx @@ -41,7 +41,10 @@ class Test : public SwModelTestBase { public: - Test() : SwModelTestBase("/sw/qa/extras/globalfilter/data/") {} + Test() : SwModelTestBase("/sw/qa/extras/globalfilter/data/") + { + skipValidation(); + } void testEmbeddedGraphicRoundtrip(); void testLinkedGraphicRT(); @@ -67,6 +70,7 @@ public: void testDropDownFormField(); void testDateFormField(); void testDateFormFieldCharacterFormatting(); + void testSvgImageSupport(); CPPUNIT_TEST_SUITE(Test); CPPUNIT_TEST(testEmbeddedGraphicRoundtrip); @@ -90,6 +94,7 @@ public: CPPUNIT_TEST(testDropDownFormField); CPPUNIT_TEST(testDateFormField); CPPUNIT_TEST(testDateFormFieldCharacterFormatting); + CPPUNIT_TEST(testSvgImageSupport); CPPUNIT_TEST_SUITE_END(); }; @@ -1767,6 +1772,50 @@ void Test::testDateFormFieldCharacterFormatting() } } +void Test::testSvgImageSupport() +{ + OUString aFilterNames[] = { + "writer8", + "Office Open XML Text", + }; + + for (OUString const & rFilterName : aFilterNames) + { + // Use case to import a document containing a SVG image, export in target format, import and check if the + // SVG image is present and as expected in the document + + // Import ODT file + createSwDoc("SvgImageTest.odt"); + + // Export the document in target format and import again + saveAndReload(rFilterName); + + // Prepare fail message (writing which import/export filter was used) + const OString sFailedMessage = "Failed on filter: " + rFilterName.toUtf8(); + + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), 1, getShapes()); + + // Get the image + uno::Reference<drawing::XShape> xImage(getShape(1), uno::UNO_QUERY); + uno::Reference<beans::XPropertySet> xPropertySet(xImage, uno::UNO_QUERY_THROW); + + // Convert to a XGraphic + uno::Reference<graphic::XGraphic> xGraphic; + xPropertySet->getPropertyValue("Graphic") >>= xGraphic; + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), xGraphic.is()); + + // Access the Graphic + Graphic aGraphic(xGraphic); + + // Check if it contian a VectorGraphicData struct + auto pVectorGraphic = aGraphic.getVectorGraphicData(); + CPPUNIT_ASSERT_MESSAGE(sFailedMessage.getStr(), pVectorGraphic); + + // Which should be of type SVG, which means we have a SVG file + CPPUNIT_ASSERT_EQUAL_MESSAGE(sFailedMessage.getStr(), VectorGraphicDataType::Svg, pVectorGraphic->getType()); + } +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); |