Kaydet (Commit) 7c4fb287 authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Caolán McNamara

Resolves: #i124852# Corrected mask and clip polygons for userSpaceOnUse

(cherry picked from commit 247d5bc4)

Change-Id: I328a55e940db64d3dad04902bf81ede56a0dfe73
üst 8ea27021
...@@ -47,8 +47,10 @@ namespace svgio ...@@ -47,8 +47,10 @@ namespace svgio
virtual void parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) SAL_OVERRIDE; 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; virtual void decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const SAL_OVERRIDE;
/// apply contained clipPath to given geometry /// apply contained clipPath to given geometry #i124852# transform may be needed
void apply(drawinglayer::primitive2d::Primitive2DSequence& rTarget) const; void apply(
drawinglayer::primitive2d::Primitive2DSequence& rTarget,
const basegfx::B2DHomMatrix* pTransform) const;
/// clipPathUnits content /// clipPathUnits content
SvgUnits getClipPathUnits() const { return maClipPathUnits; } SvgUnits getClipPathUnits() const { return maClipPathUnits; }
......
...@@ -52,8 +52,10 @@ namespace svgio ...@@ -52,8 +52,10 @@ namespace svgio
virtual void parseAttribute(const OUString& rTokenName, SVGToken aSVGToken, const OUString& aContent) SAL_OVERRIDE; 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; virtual void decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool bReferenced) const SAL_OVERRIDE;
/// apply contained clipPath to given geometry /// apply contained clipPath to given geometry #i124852# transform may be needed
void apply(drawinglayer::primitive2d::Primitive2DSequence& rTarget) const; void apply(
drawinglayer::primitive2d::Primitive2DSequence& rTarget,
const basegfx::B2DHomMatrix* pTransform) const;
/// x content, set if found in current context /// x content, set if found in current context
const SvgNumber& getX() const { return maX; } const SvgNumber& getX() const { return maX; }
......
...@@ -125,7 +125,9 @@ namespace svgio ...@@ -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()) if(rContent.hasElements() && Display_none != getDisplay())
{ {
...@@ -172,6 +174,14 @@ namespace svgio ...@@ -172,6 +174,14 @@ namespace svgio
aContentRange.getRange(), aContentRange.getRange(),
aContentRange.getMinimum())); aContentRange.getMinimum()));
} }
else // userSpaceOnUse
{
// #i124852#
if(pTransform)
{
aClipPolyPolygon.transform(*pTransform);
}
}
// #i124313# try to avoid creating an embedding to a MaskPrimitive2D if // #i124313# try to avoid creating an embedding to a MaskPrimitive2D if
// possible; MaskPrimitive2D processing is potentially expensive // possible; MaskPrimitive2D processing is potentially expensive
......
...@@ -190,7 +190,9 @@ namespace svgio ...@@ -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()) if(rTarget.hasElements() && Display_none != getDisplay())
{ {
...@@ -252,6 +254,19 @@ namespace svgio ...@@ -252,6 +254,19 @@ namespace svgio
aMaskTarget = drawinglayer::primitive2d::Primitive2DSequence(&xTransform, 1); 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 // embed content to a ModifiedColorPrimitive2D since the definitions
// how content is used as alpha is special for Svg // how content is used as alpha is special for Svg
......
...@@ -1117,7 +1117,8 @@ namespace svgio ...@@ -1117,7 +1117,8 @@ namespace svgio
if(mpClip) if(mpClip)
{ {
mpClip->apply(aSource); // #i124852# transform may be needed when userSpaceOnUse
mpClip->apply(aSource, pTransform);
} }
} }
...@@ -1130,7 +1131,8 @@ namespace svgio ...@@ -1130,7 +1131,8 @@ namespace svgio
if(mpMask) if(mpMask)
{ {
mpMask->apply(aSource); // #i124852# transform may be needed when userSpaceOnUse
mpMask->apply(aSource, pTransform);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment