diff options
-rw-r--r-- | svgio/inc/svgnode.hxx | 3 | ||||
-rw-r--r-- | svgio/qa/cppunit/SvgImportTest.cxx | 46 | ||||
-rw-r--r-- | svgio/qa/cppunit/data/tdf155814.svg | 25 | ||||
-rw-r--r-- | svgio/source/svgreader/svgstyleattributes.cxx | 42 | ||||
-rw-r--r-- | svgio/source/svgreader/svgusenode.cxx | 18 |
5 files changed, 93 insertions, 41 deletions
diff --git a/svgio/inc/svgnode.hxx b/svgio/inc/svgnode.hxx index 4bdbd3046d75..f2eb0fcb1b6e 100644 --- a/svgio/inc/svgnode.hxx +++ b/svgio/inc/svgnode.hxx @@ -180,6 +180,9 @@ namespace svgio::svgreader /// alternative parent void setAlternativeParent(const SvgNode* pAlternativeParent = nullptr) { mpAlternativeParent = pAlternativeParent; } + + /// Check if there is a local css style + bool hasLocalCssStyle() { return static_cast<bool>(mpLocalCssStyle); } }; class Visitor diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx index cb7fc790c375..87c99ba72509 100644 --- a/svgio/qa/cppunit/SvgImportTest.cxx +++ b/svgio/qa/cppunit/SvgImportTest.cxx @@ -163,10 +163,10 @@ CPPUNIT_TEST_FIXTURE(Test, testFeColorMatrix) CPPUNIT_ASSERT (pDocument); - //assertXPath(pDocument, "/primitive2D/transform/mask/transform[1]/modifiedColor", "modifier", "matrix"); - assertXPath(pDocument, "/primitive2D/transform/mask/transform[2]/modifiedColor", "modifier", "saturate"); - //assertXPath(pDocument, "/primitive2D/transform/mask/transform[3]/modifiedColor", "modifier", "hueRotate"); - assertXPath(pDocument, "/primitive2D/transform/mask/transform[4]/modifiedColor", "modifier", "luminance_to_alpha"); + //assertXPath(pDocument, "/primitive2D/transform/mask/modifiedColor", "modifier", "matrix"); + assertXPath(pDocument, "/primitive2D/transform/mask/modifiedColor[1]", "modifier", "saturate"); + //assertXPath(pDocument, "/primitive2D/transform/mask/modifiedColor", "modifier", "hueRotate"); + assertXPath(pDocument, "/primitive2D/transform/mask/modifiedColor[2]", "modifier", "luminance_to_alpha"); } CPPUNIT_TEST_FIXTURE(Test, testFilterFeGaussianBlur) @@ -717,10 +717,24 @@ CPPUNIT_TEST_FIXTURE(Test, testClipPathAndParentStyle) CPPUNIT_ASSERT (pDocument); - assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor", "color", "#ff0000"); - assertXPath(pDocument, "/primitive2D/transform/polypolygonstroke/line", "color", "#000000"); - assertXPath(pDocument, "/primitive2D/transform/polypolygonstroke/line", "width", "5"); + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygoncolor", "color", "#ff0000"); + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygonstroke/line", "color", "#000000"); + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygonstroke/line", "width", "5"); + +} + +CPPUNIT_TEST_FIXTURE(Test, testTdf155814) +{ + Primitive2DSequence aSequence = parseSvg(u"/svgio/qa/cppunit/data/tdf155814.svg"); + CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength())); + + drawinglayer::Primitive2dXmlDump dumper; + xmlDocUniquePtr pDocument = dumper.dumpAndParse(Primitive2DContainer(aSequence)); + CPPUNIT_ASSERT (pDocument); + + assertXPath(pDocument, "/primitive2D/transform/mask/mask/transform/unifiedtransparence", "transparence", "50"); + assertXPath(pDocument, "/primitive2D/transform/mask/mask/transform/unifiedtransparence/polypolygoncolor", "color", "#0000ff"); } CPPUNIT_TEST_FIXTURE(Test, testClipPathAndStyle) @@ -735,9 +749,9 @@ CPPUNIT_TEST_FIXTURE(Test, testClipPathAndStyle) CPPUNIT_ASSERT (pDocument); - assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor", "color", "#ccccff"); - assertXPath(pDocument, "/primitive2D/transform/polypolygonstroke/line", "color", "#0000cc"); - assertXPath(pDocument, "/primitive2D/transform/polypolygonstroke/line", "width", "2"); + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygoncolor", "color", "#ccccff"); + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygonstroke/line", "color", "#0000cc"); + assertXPath(pDocument, "/primitive2D/transform/transform/polypolygonstroke/line", "width", "2"); } @@ -915,10 +929,10 @@ CPPUNIT_TEST_FIXTURE(Test, testMaskText) CPPUNIT_ASSERT (pDocument); assertXPath(pDocument, "/primitive2D/transform/transform/polypolygoncolor", "color", "#000000"); - assertXPath(pDocument, "/primitive2D/transform/transform/textsimpleportion", "fontcolor", "#ffffff"); - assertXPath(pDocument, "/primitive2D/transform/transform/textsimpleportion", "text", "Black White"); - assertXPath(pDocument, "/primitive2D/transform/transform/textsimpleportion", "height", "26"); - assertXPath(pDocument, "/primitive2D/transform/transform/textsimpleportion", "familyname", "Times New Roman"); + assertXPath(pDocument, "/primitive2D/transform/transform/transform/textsimpleportion", "fontcolor", "#ffffff"); + assertXPath(pDocument, "/primitive2D/transform/transform/transform/textsimpleportion", "text", "Black White"); + assertXPath(pDocument, "/primitive2D/transform/transform/transform/textsimpleportion", "height", "26"); + assertXPath(pDocument, "/primitive2D/transform/transform/transform/textsimpleportion", "familyname", "Times New Roman"); } CPPUNIT_TEST_FIXTURE(Test, testTdf99994) @@ -1096,12 +1110,12 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf155733) CPPUNIT_ASSERT (pDocument); - assertXPath(pDocument, "/primitive2D/transform/transform[1]/softedge", "radius", "5"); + assertXPath(pDocument, "/primitive2D/transform/softedge", "radius", "5"); // Without the fix in place, the softedge would have been applied to the second element // - Expected: 1 // - Actual : 0 - assertXPath(pDocument, "/primitive2D/transform/transform[2]/unifiedtransparence", "transparence", "50"); + assertXPath(pDocument, "/primitive2D/transform/transform/unifiedtransparence", "transparence", "50"); } CPPUNIT_TEST_FIXTURE(Test, testTdf97663) diff --git a/svgio/qa/cppunit/data/tdf155814.svg b/svgio/qa/cppunit/data/tdf155814.svg new file mode 100644 index 000000000000..5ac2e8297379 --- /dev/null +++ b/svgio/qa/cppunit/data/tdf155814.svg @@ -0,0 +1,25 @@ +<svg + width="100%" + height="100%" + viewBox="0 0 150 500" + preserveAspectRatio="xMidYMid meet" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- ref --> + <defs> + <g id="circles"> + <circle cx="30" cy="30" r="20" fill="blue" fill-opacity="0.5" /> + </g> + </defs> + <clipPath id="myClip"> + <!-- + Everything outside the circle will be + clipped and therefore invisible. + --> + <circle r="35" /> + </clipPath> + + <use xlink:href="#circles" transform="translate(0 50)" clip-path="url(#myClip)" /> + <use xlink:href="#circles" transform="translate(0 100)" /> +</svg> + diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx index d9a0bf3cef86..189a1879799a 100644 --- a/svgio/source/svgreader/svgstyleattributes.cxx +++ b/svgio/source/svgreader/svgstyleattributes.cxx @@ -2866,7 +2866,9 @@ namespace svgio::svgreader return maClipPathXLink; } - if(getCssStyleParent()) + // This is called from add_postProcess so only check the parent style + // if it has a local css style, because it's the first in the stack + if(mrOwner.hasLocalCssStyle()) { const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); @@ -2904,14 +2906,19 @@ namespace svgio::svgreader return maFilterXLink; } - const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); - - if (pSvgStyleAttributes && maResolvingParent[32] < nStyleDepthLimit) + // This is called from add_postProcess so only check the parent style + // if it has a local css style, because it's the first in the stack + if(mrOwner.hasLocalCssStyle()) { - ++maResolvingParent[32]; - auto ret = pSvgStyleAttributes->getFilterXLink(); - --maResolvingParent[32]; - return ret; + const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); + + if (pSvgStyleAttributes && maResolvingParent[32] < nStyleDepthLimit) + { + ++maResolvingParent[32]; + auto ret = pSvgStyleAttributes->getFilterXLink(); + --maResolvingParent[32]; + return ret; + } } return OUString(); @@ -2939,14 +2946,19 @@ namespace svgio::svgreader return maMaskXLink; } - const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); - - if (pSvgStyleAttributes && maResolvingParent[25] < nStyleDepthLimit) + // This is called from add_postProcess so only check the parent style + // if it has a local css style, because it's the first in the stack + if(mrOwner.hasLocalCssStyle()) { - ++maResolvingParent[25]; - auto ret = pSvgStyleAttributes->getMaskXLink(); - --maResolvingParent[25]; - return ret; + const SvgStyleAttributes* pSvgStyleAttributes = getParentStyle(); + + if (pSvgStyleAttributes && maResolvingParent[25] < nStyleDepthLimit) + { + ++maResolvingParent[25]; + auto ret = pSvgStyleAttributes->getMaskXLink(); + --maResolvingParent[25]; + return ret; + } } return OUString(); diff --git a/svgio/source/svgreader/svgusenode.cxx b/svgio/source/svgreader/svgusenode.cxx index 66f9d1a551a0..185dc4f919a0 100644 --- a/svgio/source/svgreader/svgusenode.cxx +++ b/svgio/source/svgreader/svgusenode.cxx @@ -163,18 +163,16 @@ namespace svgio::svgreader aTransform = *getTransform() * aTransform; } - if(!aTransform.isIdentity()) - { - const drawinglayer::primitive2d::Primitive2DReference xRef( - new drawinglayer::primitive2d::TransformPrimitive2D( - aTransform, - std::move(aNewTarget))); + const SvgStyleAttributes* pStyle = getSvgStyleAttributes(); - rTarget.push_back(xRef); - } - else + if(pStyle) { - rTarget.append(aNewTarget); + const double fOpacity(pStyle->getOpacity().getNumber()); + + if(fOpacity > 0.0 && Display::None != getDisplay()) + { + pStyle->add_postProcess(rTarget, std::move(aNewTarget), aTransform, false); + } } } |