summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorXisco Fauli <xiscofauli@libreoffice.org>2022-07-18 13:21:35 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2022-07-18 21:59:57 +0200
commit47c428537154cd94b1d9a7547bde21ce711abd0d (patch)
tree347288edd76bc4753efb7e3dc25e30e3655ff10c /svgio
parent67c422585db43e30f0c9e4c9753fcd14f87a277f (diff)
related: tdf#97539: SVGIO: iterate over parent's clippaths
This commit reintroduces fb33451a27d8668bc14f5bcfd6ea742fc4c5b84c "tdf#97539: SVGIO: iterate over parent's clippaths" which I reverted it in 82c0a363abbceac6464b62c3571aa3225415c7db "tdf#97539; if parent is css style, look one level up" because I thought it was no longer necessary, but I was wrong. Also add a unittest Change-Id: Ib66ca0afd63e8e52be6677b6965179e092a61aa8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137195 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Diffstat (limited to 'svgio')
-rw-r--r--svgio/qa/cppunit/SvgImportTest.cxx16
-rw-r--r--svgio/qa/cppunit/data/ClipPathUsingClipPath.svg24
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx3
3 files changed, 42 insertions, 1 deletions
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx
index 97ee9aa35351..c25ae86cf7f3 100644
--- a/svgio/qa/cppunit/SvgImportTest.cxx
+++ b/svgio/qa/cppunit/SvgImportTest.cxx
@@ -64,6 +64,7 @@ class Test : public test::BootstrapFixture, public XmlTestTools
void testClipPathAndParentStyle();
void testClipPathAndStyle();
void testShapeWithClipPath();
+ void testClipPathUsingClipPath();
void testi125329();
void testMaskingPath07b();
void test123926();
@@ -108,6 +109,7 @@ public:
CPPUNIT_TEST(testClipPathAndParentStyle);
CPPUNIT_TEST(testClipPathAndStyle);
CPPUNIT_TEST(testShapeWithClipPath);
+ CPPUNIT_TEST(testClipPathUsingClipPath);
CPPUNIT_TEST(testi125329);
CPPUNIT_TEST(testMaskingPath07b);
CPPUNIT_TEST(test123926);
@@ -685,6 +687,20 @@ void Test::testShapeWithClipPath()
assertXPath(pDocument, "/primitive2D/transform/mask/polypolygoncolor/polypolygon/polygon", 1);
}
+void Test::testClipPathUsingClipPath()
+{
+ Primitive2DSequence aSequenceClipPathAndStyle = parseSvg(u"/svgio/qa/cppunit/data/ClipPathUsingClipPath.svg");
+ CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequenceClipPathAndStyle.getLength()));
+
+ drawinglayer::Primitive2dXmlDump dumper;
+ xmlDocUniquePtr pDocument = dumper.dumpAndParse(Primitive2DContainer(aSequenceClipPathAndStyle));
+
+ CPPUNIT_ASSERT (pDocument);
+
+ assertXPath(pDocument, "/primitive2D/transform/mask/polypolygon/polygon/point", 20);
+ assertXPath(pDocument, "/primitive2D/transform/mask/mask/polypolygon/polygon/point", 13);
+}
+
void Test::testi125329()
{
//Check style inherit from * css element
diff --git a/svgio/qa/cppunit/data/ClipPathUsingClipPath.svg b/svgio/qa/cppunit/data/ClipPathUsingClipPath.svg
new file mode 100644
index 000000000000..5eaa7928cb85
--- /dev/null
+++ b/svgio/qa/cppunit/data/ClipPathUsingClipPath.svg
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<defs>
+
+<clipPath id="clip1">
+ <polygon id="clip1Shape" points="100,10 40,180 190,60 10,60 160,180 100,10" stroke="blue" />
+</clipPath>
+
+<clipPath id="clip2">
+ <circle id="clip2Shape" cx="100" cy="100" r="65" />
+</clipPath>
+
+
+<clipPath id="clipIntersection" clip-path="url(#clip1)">
+ <use x="0" y="0" width="200" height="200" xlink:href="#clip2Shape" />
+</clipPath>
+
+</defs>
+
+<rect x="10" y="10" width="180" height="180" fill="red"
+ clip-path="url(#clipIntersection)" transform="translate(200)" />
+
+</svg>
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx
index 6b676cd952f7..6ad1b1d25cc2 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1196,10 +1196,11 @@ namespace svgio::svgreader
}
const SvgClipPathNode* pClip = accessClipPathXLink();
- if(pClip)
+ while(pClip)
{
// #i124852# transform may be needed when SvgUnits::userSpaceOnUse
pClip->apply(aSource, pTransform);
+ pClip = pClip->getSvgStyleAttributes()->accessClipPathXLink();
}
if(!aSource.empty()) // test again, applied clipPath may have lead to empty geometry