summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2023-09-25 09:03:54 +0200
committerAndras Timar <andras.timar@collabora.com>2023-12-10 12:37:35 +0100
commit1e7cd7da0b216557f836e3cb031bca47c2364b1e (patch)
tree48455e5397e45b20f3d6b12973d8a7279d41c0d7
parent1372b6e33d0ce3e831ca553c5148655e97615d84 (diff)
tdf#126084 import svg image from ooxml document that use svgBlip elem.
In an OOXML document the svg image is defined in an svgBlip, which is an OOXML extension. This change checks for the svgBlip element and imports that instead the normal "blip" element that is still provided as a fallback (PNG image). Add roundtrip SVG image test for ODF and OOXML, Impress and Writer. testGraphicBlipXLSX test failed after this change, because some component was missing. Changed to enable use_rdb for all chart2 export tests, so issues like this won't happen anymore. Change-Id: Idf0e754775254d7dcfd0321dfca2ed6d00c42c09 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/157238 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com> (cherry picked from commit 1db193c6c744289139b1df2af0b8defcf974b238) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160384 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--chart2/export_setup.mk60
-rw-r--r--oox/inc/drawingml/misccontexts.hxx4
-rw-r--r--oox/source/core/xmlfilterbase.cxx1
-rw-r--r--oox/source/drawingml/misccontexts.cxx41
-rw-r--r--sd/qa/unit/data/odp/SvgImageTest.odpbin0 -> 15922 bytes
-rw-r--r--sd/qa/unit/export-tests.cxx44
-rw-r--r--sw/qa/extras/globalfilter/data/SvgImageTest.odtbin0 -> 13608 bytes
-rw-r--r--sw/qa/extras/globalfilter/globalfilter.cxx51
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
new file mode 100644
index 000000000000..38b92df80896
--- /dev/null
+++ b/sd/qa/unit/data/odp/SvgImageTest.odp
Binary files differ
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
new file mode 100644
index 000000000000..3b37fe7998ef
--- /dev/null
+++ b/sw/qa/extras/globalfilter/data/SvgImageTest.odt
Binary files differ
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();