svgio/qa/cppunit/SvgImportTest.cxx | 19 ++++++++++++++++++ svgio/qa/cppunit/data/tdf97717.svg | 11 ++++++++++ svgio/source/svgreader/svggnode.cxx | 38 ++++++++++++++++-------------------- 3 files changed, 47 insertions(+), 21 deletions(-)
New commits: commit d47b37eea9779e3c354e6c19a7211a306965b7ef Author: Xisco Fauli <xiscofa...@libreoffice.org> AuthorDate: Mon Jun 19 13:18:42 2023 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Mon Jun 19 15:32:49 2023 +0200 tdf#97717: do not call add_postProcess from g element Otherwise, it will be called twice, from g and from its children Change-Id: I88535a7caab6a7711f917b3f383cd79b3b9fbd2d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153260 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx index ba267f5443a5..c9ec752d882a 100644 --- a/svgio/qa/cppunit/SvgImportTest.cxx +++ b/svgio/qa/cppunit/SvgImportTest.cxx @@ -302,6 +302,25 @@ CPPUNIT_TEST_FIXTURE(Test, testFontsizeRelative) assertXPath(pDocument, "/primitive2D/transform/textsimpleportion[2]", "familyname", "serif"); } +CPPUNIT_TEST_FIXTURE(Test, testTdf97717) +{ + //Check when font-size uses relative units (em,ex) and it's based on its parent's font-size + Primitive2DSequence aSequence = parseSvg(u"/svgio/qa/cppunit/data/tdf97717.svg"); + CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(aSequence.getLength())); + + drawinglayer::Primitive2dXmlDump dumper; + xmlDocUniquePtr pDocument = dumper.dumpAndParse(aSequence); + + CPPUNIT_ASSERT (pDocument); + + assertXPath(pDocument, "/primitive2D/transform/unifiedtransparence[1]", "transparence", "50"); + // Without the fix in place, this test would have failed here since the patch + // would have contained two unifiedtransparence + assertXPath(pDocument, "/primitive2D/transform/unifiedtransparence[1]/polypolygoncolor", "color", "#ccccff"); + assertXPath(pDocument, "/primitive2D/transform/unifiedtransparence[2]", "transparence", "50"); + assertXPath(pDocument, "/primitive2D/transform/unifiedtransparence[2]/polypolygoncolor", "color", "#ccccff"); +} + CPPUNIT_TEST_FIXTURE(Test, testMarkerOrient) { Primitive2DSequence aSequence = parseSvg(u"/svgio/qa/cppunit/data/MarkerOrient.svg"); diff --git a/svgio/qa/cppunit/data/tdf97717.svg b/svgio/qa/cppunit/data/tdf97717.svg new file mode 100644 index 000000000000..c354e4416827 --- /dev/null +++ b/svgio/qa/cppunit/data/tdf97717.svg @@ -0,0 +1,11 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="-0 0 300 300"> + + <g opacity="0.5"> + <rect x="0" y="0" height="50" width="50" + style="fill: #ccccff"> + </rect> + </g> + <rect x="60" y="0" height="50" width="50" + style="fill: #ccccff" opacity="0.5"> + </rect> +</svg> diff --git a/svgio/source/svgreader/svggnode.cxx b/svgio/source/svgreader/svggnode.cxx index aca500af60ab..f49e737daafa 100644 --- a/svgio/source/svgreader/svggnode.cxx +++ b/svgio/source/svgreader/svggnode.cxx @@ -19,6 +19,7 @@ #include <svggnode.hxx> #include <osl/diagnose.h> +#include <drawinglayer/primitive2d/transformprimitive2d.hxx> namespace svgio::svgreader { @@ -85,31 +86,26 @@ namespace svgio::svgreader void SvgGNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DContainer& rTarget, bool bReferenced) const { - if(SVGToken::Defs == getType()) - { - // #i125258# no decompose needed for defs element, call parent for SVGTokenDefs - SvgNode::decomposeSvgNode(rTarget, bReferenced); - } - else - { - // #i125258# for SVGTokenG decompose children - const SvgStyleAttributes* pStyle = getSvgStyleAttributes(); + SvgNode::decomposeSvgNode(rTarget, bReferenced); - if(pStyle) + // if g element has transform, apply it + if(SVGToken::G == getType()) + { + if(getTransform()) { - const double fOpacity(pStyle->getOpacity().getNumber()); - - if(fOpacity > 0.0 && Display::None != getDisplay()) - { - drawinglayer::primitive2d::Primitive2DContainer aContent; + drawinglayer::primitive2d::Primitive2DContainer aSource(std::move(rTarget)); + // create embedding group element with transformation + const drawinglayer::primitive2d::Primitive2DReference xRef( + new drawinglayer::primitive2d::TransformPrimitive2D( + *getTransform(), + std::move(aSource))); - // decompose children - SvgNode::decomposeSvgNode(aContent, bReferenced); + aSource = drawinglayer::primitive2d::Primitive2DContainer { xRef }; - if(!aContent.empty()) - { - pStyle->add_postProcess(rTarget, std::move(aContent), getTransform()); - } + if(!aSource.empty()) + { + // append to current target + rTarget.append(aSource); } } }