summaryrefslogtreecommitdiff
path: root/svgio/source
diff options
context:
space:
mode:
authorXisco Fauli <xiscofauli@libreoffice.org>2023-06-20 16:47:58 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2023-06-20 18:29:43 +0200
commit3e0e67a152e9631574e28dacb6e06a96f03ebca2 (patch)
tree1dfecd25d7aa8819cf54d634ca8e093b8fadfb20 /svgio/source
parent7c226d2624c2320f22f5c14895d419d4df82a91d (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/source')
-rw-r--r--svgio/source/svgreader/svganode.cxx2
-rw-r--r--svgio/source/svgreader/svgcirclenode.cxx2
-rw-r--r--svgio/source/svgreader/svgellipsenode.cxx2
-rw-r--r--svgio/source/svgreader/svggnode.cxx31
-rw-r--r--svgio/source/svgreader/svgimagenode.cxx2
-rw-r--r--svgio/source/svgreader/svglinenode.cxx2
-rw-r--r--svgio/source/svgreader/svgpathnode.cxx2
-rw-r--r--svgio/source/svgreader/svgpolynode.cxx2
-rw-r--r--svgio/source/svgreader/svgrectnode.cxx2
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx22
-rw-r--r--svgio/source/svgreader/svgtextnode.cxx2
11 files changed, 38 insertions, 33 deletions
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);
}
}