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>
diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx
index 97ee9aa..c25ae86 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 0000000..5eaa792
--- /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 6b676cd..6ad1b1d 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