diff options
author | Xisco Fauli <xiscofauli@libreoffice.org> | 2023-06-20 16:47:58 +0200 |
---|---|---|
committer | Xisco Fauli <xiscofauli@libreoffice.org> | 2023-06-20 18:29:43 +0200 |
commit | 3e0e67a152e9631574e28dacb6e06a96f03ebca2 (patch) | |
tree | 1dfecd25d7aa8819cf54d634ca8e093b8fadfb20 /svgio | |
parent | 7c226d2624c2320f22f5c14895d419d4df82a91d (diff) |
tdf#155932: tdf#97717: only apply opacity when primitive
Partially revert d47b37eea9779e3c354e6c19a7211a306965b7ef
"tdf#97717: do not call add_postProcess from g element"
since we still need to call add_postProcess from g to
apply the clip-path
Change-Id: Ibdc5afadc0db239d0b0e14810943009a4c0a16a9
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153353
Tested-by: Jenkins
Reviewed-by: Xisco Fauli <xiscofauli@libreoffice.org>
Diffstat (limited to 'svgio')
-rw-r--r-- | svgio/inc/svgstyleattributes.hxx | 3 | ||||
-rw-r--r-- | svgio/qa/cppunit/SvgImportTest.cxx | 14 | ||||
-rw-r--r-- | svgio/qa/cppunit/data/tdf155932.svg | 22 | ||||
-rw-r--r-- | svgio/source/svgreader/svganode.cxx | 2 | ||||
-rw-r--r-- | svgio/source/svgreader/svgcirclenode.cxx | 2 | ||||
-rw-r--r-- | svgio/source/svgreader/svgellipsenode.cxx | 2 | ||||
-rw-r--r-- | svgio/source/svgreader/svggnode.cxx | 31 | ||||
-rw-r--r-- | svgio/source/svgreader/svgimagenode.cxx | 2 | ||||
-rw-r--r-- | svgio/source/svgreader/svglinenode.cxx | 2 | ||||
-rw-r--r-- | svgio/source/svgreader/svgpathnode.cxx | 2 | ||||
-rw-r--r-- | svgio/source/svgreader/svgpolynode.cxx | 2 | ||||
-rw-r--r-- | svgio/source/svgreader/svgrectnode.cxx | 2 | ||||
-rw-r--r-- | svgio/source/svgreader/svgstyleattributes.cxx | 22 | ||||
-rw-r--r-- | svgio/source/svgreader/svgtextnode.cxx | 2 |
14 files changed, 76 insertions, 34 deletions
diff --git a/svgio/inc/svgstyleattributes.hxx b/svgio/inc/svgstyleattributes.hxx index 52876ea0576d..b54e3cd627e4 100644 --- a/svgio/inc/svgstyleattributes.hxx +++ b/svgio/inc/svgstyleattributes.hxx @@ -293,7 +293,8 @@ namespace svgio::svgreader void add_postProcess( drawinglayer::primitive2d::Primitive2DContainer& rTarget, drawinglayer::primitive2d::Primitive2DContainer&& rSource, - const std::optional<basegfx::B2DHomMatrix>& pTransform) const; + const std::optional<basegfx::B2DHomMatrix>& pTransform, + bool bIsPrimitive) const; /// helper to set mpCssStyleParent temporarily for CSS style hierarchies void setCssStyleParent(const SvgStyleAttributes* pNew) { mpCssStyleParent = pNew; } diff --git a/svgio/qa/cppunit/SvgImportTest.cxx b/svgio/qa/cppunit/SvgImportTest.cxx index 43dde4da9997..cb7fc790c375 100644 --- a/svgio/qa/cppunit/SvgImportTest.cxx +++ b/svgio/qa/cppunit/SvgImportTest.cxx @@ -320,6 +320,20 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf145896) assertXPath(pDocument, "/primitive2D/transform/polypolygoncolor[3]", "color", "#0000ff"); } +CPPUNIT_TEST_FIXTURE(Test, testTdf155932) +{ + Primitive2DSequence aSequence = parseSvg(u"/svgio/qa/cppunit/data/tdf155932.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/mask/mask/unifiedtransparence", "transparence", "50"); + assertXPath(pDocument, "/primitive2D/transform/mask/mask/unifiedtransparence[1]/polypolygoncolor", "color", "#0000ff"); +} + CPPUNIT_TEST_FIXTURE(Test, testTdf97717) { Primitive2DSequence aSequence = parseSvg(u"/svgio/qa/cppunit/data/tdf97717.svg"); diff --git a/svgio/qa/cppunit/data/tdf155932.svg b/svgio/qa/cppunit/data/tdf155932.svg new file mode 100644 index 000000000000..b533eda3cd35 --- /dev/null +++ b/svgio/qa/cppunit/data/tdf155932.svg @@ -0,0 +1,22 @@ +<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"> + <circle r="35" /> + </clipPath> + + <g clip-path="url(#myClip)"> + <circle cx="30" cy="30" r="20" fill="blue" fill-opacity="0.5" /> + </g> +</svg> + diff --git a/svgio/source/svgreader/svganode.cxx b/svgio/source/svgreader/svganode.cxx index 5d992a3d28ef..927b13d06eb8 100644 --- a/svgio/source/svgreader/svganode.cxx +++ b/svgio/source/svgreader/svganode.cxx @@ -94,7 +94,7 @@ namespace svgio::svgreader if(!aContent.empty()) { - pStyle->add_postProcess(rTarget, std::move(aContent), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aContent), getTransform(), true); } } } diff --git a/svgio/source/svgreader/svgcirclenode.cxx b/svgio/source/svgreader/svgcirclenode.cxx index 0ec940f9f737..0cf15e5e7ca9 100644 --- a/svgio/source/svgreader/svgcirclenode.cxx +++ b/svgio/source/svgreader/svgcirclenode.cxx @@ -135,7 +135,7 @@ namespace svgio::svgreader if(!aNewTarget.empty()) { - pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform(), true); } } } // end of namespace svgio::svgreader diff --git a/svgio/source/svgreader/svgellipsenode.cxx b/svgio/source/svgreader/svgellipsenode.cxx index b6208dd3b4db..9b5fa1b061e1 100644 --- a/svgio/source/svgreader/svgellipsenode.cxx +++ b/svgio/source/svgreader/svgellipsenode.cxx @@ -150,7 +150,7 @@ namespace svgio::svgreader if(!aNewTarget.empty()) { - pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform(), true); } } } // end of namespace svgio::svgreader diff --git a/svgio/source/svgreader/svggnode.cxx b/svgio/source/svgreader/svggnode.cxx index f49e737daafa..d668f9c5b08d 100644 --- a/svgio/source/svgreader/svggnode.cxx +++ b/svgio/source/svgreader/svggnode.cxx @@ -19,7 +19,6 @@ #include <svggnode.hxx> #include <osl/diagnose.h> -#include <drawinglayer/primitive2d/transformprimitive2d.hxx> namespace svgio::svgreader { @@ -86,26 +85,26 @@ namespace svgio::svgreader void SvgGNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DContainer& rTarget, bool bReferenced) const { - SvgNode::decomposeSvgNode(rTarget, bReferenced); - - // if g element has transform, apply it - if(SVGToken::G == getType()) + if(SVGToken::Defs == getType()) { - if(getTransform()) + // #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(); + + if(pStyle) { - 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))); + drawinglayer::primitive2d::Primitive2DContainer aContent; - aSource = drawinglayer::primitive2d::Primitive2DContainer { xRef }; + // decompose children + SvgNode::decomposeSvgNode(aContent, bReferenced); - if(!aSource.empty()) + if(!aContent.empty()) { - // append to current target - rTarget.append(aSource); + pStyle->add_postProcess(rTarget, std::move(aContent), getTransform(), false); } } } diff --git a/svgio/source/svgreader/svgimagenode.cxx b/svgio/source/svgreader/svgimagenode.cxx index 19c8c9404541..45e5467d64f2 100644 --- a/svgio/source/svgreader/svgimagenode.cxx +++ b/svgio/source/svgreader/svgimagenode.cxx @@ -340,7 +340,7 @@ namespace svgio::svgreader } // embed and add to rTarget, take local extra-transform into account - pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform(), true); } } // end of namespace svgio::svgreader diff --git a/svgio/source/svgreader/svglinenode.cxx b/svgio/source/svgreader/svglinenode.cxx index b49f9c7a46b6..2fc5e64fc9f9 100644 --- a/svgio/source/svgreader/svglinenode.cxx +++ b/svgio/source/svgreader/svglinenode.cxx @@ -145,7 +145,7 @@ namespace svgio::svgreader if(!aNewTarget.empty()) { - pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform(), true); } } } // end of namespace svgio::svgreader diff --git a/svgio/source/svgreader/svgpathnode.cxx b/svgio/source/svgreader/svgpathnode.cxx index b3b498bd067e..82b603734985 100644 --- a/svgio/source/svgreader/svgpathnode.cxx +++ b/svgio/source/svgreader/svgpathnode.cxx @@ -108,7 +108,7 @@ namespace svgio::svgreader if(!aNewTarget.empty()) { - pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform(), true); } } } diff --git a/svgio/source/svgreader/svgpolynode.cxx b/svgio/source/svgreader/svgpolynode.cxx index 886634563e2e..84beea4b55f4 100644 --- a/svgio/source/svgreader/svgpolynode.cxx +++ b/svgio/source/svgreader/svgpolynode.cxx @@ -106,7 +106,7 @@ namespace svgio::svgreader if(!aNewTarget.empty()) { - pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform(), true); } } } diff --git a/svgio/source/svgreader/svgrectnode.cxx b/svgio/source/svgreader/svgrectnode.cxx index d744343de200..3e81927ab2b2 100644 --- a/svgio/source/svgreader/svgrectnode.cxx +++ b/svgio/source/svgreader/svgrectnode.cxx @@ -207,7 +207,7 @@ namespace svgio::svgreader if(!aNewTarget.empty()) { - pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform(), true); } } } // end of namespace svgio::svgreader diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx index 5f3a3f4aea8a..d9a0bf3cef86 100644 --- a/svgio/source/svgreader/svgstyleattributes.cxx +++ b/svgio/source/svgreader/svgstyleattributes.cxx @@ -1161,7 +1161,8 @@ namespace svgio::svgreader void SvgStyleAttributes::add_postProcess( drawinglayer::primitive2d::Primitive2DContainer& rTarget, drawinglayer::primitive2d::Primitive2DContainer&& rSource, - const std::optional<basegfx::B2DHomMatrix>& pTransform) const + const std::optional<basegfx::B2DHomMatrix>& pTransform, + bool bIsPrimitive) const { if(rSource.empty()) return; @@ -1175,15 +1176,20 @@ namespace svgio::svgreader drawinglayer::primitive2d::Primitive2DContainer aSource(std::move(rSource)); - if(basegfx::fTools::less(fOpacity, 1.0)) + // tdf#97717: only apply opacity when it's a primitive, otherwise, it might be + // applied more than once, since getOpacity() checks the parents + if (bIsPrimitive) { - // embed in UnifiedTransparencePrimitive2D - const drawinglayer::primitive2d::Primitive2DReference xRef( - new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D( - std::move(aSource), - 1.0 - fOpacity)); + if(basegfx::fTools::less(fOpacity, 1.0)) + { + // embed in UnifiedTransparencePrimitive2D + const drawinglayer::primitive2d::Primitive2DReference xRef( + new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D( + std::move(aSource), + 1.0 - fOpacity)); - aSource = drawinglayer::primitive2d::Primitive2DContainer { xRef }; + aSource = drawinglayer::primitive2d::Primitive2DContainer { xRef }; + } } if(pTransform) diff --git a/svgio/source/svgreader/svgtextnode.cxx b/svgio/source/svgreader/svgtextnode.cxx index f8c0694b8826..55ba6b60b13e 100644 --- a/svgio/source/svgreader/svgtextnode.cxx +++ b/svgio/source/svgreader/svgtextnode.cxx @@ -251,7 +251,7 @@ namespace svgio::svgreader if(!aNewTarget.empty()) { - pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform()); + pStyle->add_postProcess(rTarget, std::move(aNewTarget), getTransform(), true); } } |