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