summaryrefslogtreecommitdiff
path: root/svgio
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2014-07-03 15:49:09 +0000
committerCaolán McNamara <caolanm@redhat.com>2014-07-04 16:14:21 +0100
commit7c4fb287bb1e69725560cd4688e1d1d99d4498e0 (patch)
treed967120912ecae13d33c889cc4d2ba30737439fd /svgio
parent8ea270213ba95544011fc3a79cc33f0511f6c62e (diff)
Resolves: #i124852# Corrected mask and clip polygons for userSpaceOnUse
(cherry picked from commit 247d5bc4d13c8ab299f8ca72768946f59815dca4) Change-Id: I328a55e940db64d3dad04902bf81ede56a0dfe73
Diffstat (limited to 'svgio')
-rw-r--r--svgio/inc/svgio/svgreader/svgclippathnode.hxx6
-rw-r--r--svgio/inc/svgio/svgreader/svgmasknode.hxx6
-rw-r--r--svgio/source/svgreader/svgclippathnode.cxx12
-rw-r--r--svgio/source/svgreader/svgmasknode.cxx17
-rw-r--r--svgio/source/svgreader/svgstyleattributes.cxx6
5 files changed, 39 insertions, 8 deletions
diff --git a/svgio/inc/svgio/svgreader/svgclippathnode.hxx b/svgio/inc/svgio/svgreader/svgclippathnode.hxx
index d7fbf9b3e72d..36586d8df95f 100644
--- a/svgio/inc/svgio/svgreader/svgclippathnode.hxx
+++ b/svgio/inc/svgio/svgreader/svgclippathnode.hxx
@@ -47,8 +47,10 @@ namespace svgio
virtual void parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) SAL_OVERRIDE;
virtual void decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const SAL_OVERRIDE;
- /// apply contained clipPath to given geometry
- void apply(drawinglayer::primitive2d::Primitive2DSequence& rTarget) const;
+ /// apply contained clipPath to given geometry #i124852# transform may be needed
+ void apply(
+ drawinglayer::primitive2d::Primitive2DSequence& rTarget,
+ const basegfx::B2DHomMatrix* pTransform) const;
/// clipPathUnits content
SvgUnits getClipPathUnits() const { return maClipPathUnits; }
diff --git a/svgio/inc/svgio/svgreader/svgmasknode.hxx b/svgio/inc/svgio/svgreader/svgmasknode.hxx
index e0f66b16a635..897401fd9290 100644
--- a/svgio/inc/svgio/svgreader/svgmasknode.hxx
+++ b/svgio/inc/svgio/svgreader/svgmasknode.hxx
@@ -52,8 +52,10 @@ namespace svgio
virtual void parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) SAL_OVERRIDE;
virtual void decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const SAL_OVERRIDE;
- /// apply contained clipPath to given geometry
- void apply(drawinglayer::primitive2d::Primitive2DSequence& rTarget) const;
+ /// apply contained clipPath to given geometry #i124852# transform may be needed
+ void apply(
+ drawinglayer::primitive2d::Primitive2DSequence& rTarget,
+ const basegfx::B2DHomMatrix* pTransform) const;
/// x content, set if found in current context
const SvgNumber& getX() const { return maX; }
diff --git a/svgio/source/svgreader/svgclippathnode.cxx b/svgio/source/svgreader/svgclippathnode.cxx
index c8b7e1809204..0a7f0f4a7369 100644
--- a/svgio/source/svgreader/svgclippathnode.cxx
+++ b/svgio/source/svgreader/svgclippathnode.cxx
@@ -125,7 +125,9 @@ namespace svgio
}
}
- void SvgClipPathNode::apply(drawinglayer::primitive2d::Primitive2DSequence& rContent) const
+ void SvgClipPathNode::apply(
+ drawinglayer::primitive2d::Primitive2DSequence& rContent,
+ const basegfx::B2DHomMatrix* pTransform) const
{
if(rContent.hasElements() && Display_none != getDisplay())
{
@@ -172,6 +174,14 @@ namespace svgio
aContentRange.getRange(),
aContentRange.getMinimum()));
}
+ else // userSpaceOnUse
+ {
+ // #i124852#
+ if(pTransform)
+ {
+ aClipPolyPolygon.transform(*pTransform);
+ }
+ }
// #i124313# try to avoid creating an embedding to a MaskPrimitive2D if
// possible; MaskPrimitive2D processing is potentially expensive
diff --git a/svgio/source/svgreader/svgmasknode.cxx b/svgio/source/svgreader/svgmasknode.cxx
index 7d3a72bc17a5..e80f2e82c97c 100644
--- a/svgio/source/svgreader/svgmasknode.cxx
+++ b/svgio/source/svgreader/svgmasknode.cxx
@@ -190,7 +190,9 @@ namespace svgio
}
}
- void SvgMaskNode::apply(drawinglayer::primitive2d::Primitive2DSequence& rTarget) const
+ void SvgMaskNode::apply(
+ drawinglayer::primitive2d::Primitive2DSequence& rTarget,
+ const basegfx::B2DHomMatrix* pTransform) const
{
if(rTarget.hasElements() && Display_none != getDisplay())
{
@@ -252,6 +254,19 @@ namespace svgio
aMaskTarget = drawinglayer::primitive2d::Primitive2DSequence(&xTransform, 1);
}
+ else // userSpaceOnUse
+ {
+ // #i124852#
+ if(pTransform)
+ {
+ const drawinglayer::primitive2d::Primitive2DReference xTransform(
+ new drawinglayer::primitive2d::TransformPrimitive2D(
+ *pTransform,
+ aMaskTarget));
+
+ aMaskTarget = drawinglayer::primitive2d::Primitive2DSequence(&xTransform, 1);
+ }
+ }
// embed content to a ModifiedColorPrimitive2D since the definitions
// how content is used as alpha is special for Svg
diff --git a/svgio/source/svgreader/svgstyleattributes.cxx b/svgio/source/svgreader/svgstyleattributes.cxx
index 5f3edd1be61b..1051e46f4423 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1117,7 +1117,8 @@ namespace svgio
if(mpClip)
{
- mpClip->apply(aSource);
+ // #i124852# transform may be needed when userSpaceOnUse
+ mpClip->apply(aSource, pTransform);
}
}
@@ -1130,7 +1131,8 @@ namespace svgio
if(mpMask)
{
- mpMask->apply(aSource);
+ // #i124852# transform may be needed when userSpaceOnUse
+ mpMask->apply(aSource, pTransform);
}
}