svgio/inc/svgio/svgreader/svgclippathnode.hxx |    6 ++++--
 svgio/inc/svgio/svgreader/svgmasknode.hxx     |    6 ++++--
 svgio/source/svgreader/svgclippathnode.cxx    |   12 +++++++++++-
 svgio/source/svgreader/svgmasknode.cxx        |   17 ++++++++++++++++-
 svgio/source/svgreader/svgstyleattributes.cxx |    6 ++++--
 5 files changed, 39 insertions(+), 8 deletions(-)

New commits:
commit 247d5bc4d13c8ab299f8ca72768946f59815dca4
Author: Armin Le Grand <a...@apache.org>
Date:   Thu Jul 3 15:49:09 2014 +0000

    i124852 Corrected mask and clip polygons for userSpaceOnUse

diff --git a/svgio/inc/svgio/svgreader/svgclippathnode.hxx 
b/svgio/inc/svgio/svgreader/svgclippathnode.hxx
index e2fc7cb..5cf4e71 100644
--- a/svgio/inc/svgio/svgreader/svgclippathnode.hxx
+++ b/svgio/inc/svgio/svgreader/svgclippathnode.hxx
@@ -52,8 +52,10 @@ namespace svgio
             virtual void parseAttribute(const rtl::OUString& rTokenName, 
SVGToken aSVGToken, const rtl::OUString& aContent);
             virtual void 
decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool 
bReferenced) const;
 
-            /// 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 6c3089d..4c5fa5f 100644
--- a/svgio/inc/svgio/svgreader/svgmasknode.hxx
+++ b/svgio/inc/svgio/svgreader/svgmasknode.hxx
@@ -57,8 +57,10 @@ namespace svgio
             virtual void parseAttribute(const rtl::OUString& rTokenName, 
SVGToken aSVGToken, const rtl::OUString& aContent);
             virtual void 
decomposeSvgNode(drawinglayer::primitive2d::Primitive2DSequence& rTarget, bool 
bReferenced) const;
 
-            /// 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 4e795ff..3e4ecd80 100644
--- a/svgio/source/svgreader/svgclippathnode.cxx
+++ b/svgio/source/svgreader/svgclippathnode.cxx
@@ -132,7 +132,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())
             {
@@ -179,6 +181,14 @@ namespace svgio
                                 aContentRange.getRange(),
                                 aContentRange.getMinimum()));
                     }
+                    else // userSpaceOnUse
+                    {
+                        // #i124852#
+                        if(pTransform)
+                        {
+                            aClipPolyPolygon.transform(*pTransform);
+                        }
+                    }
 
                     // #124313# 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 26e28f5..37459af 100644
--- a/svgio/source/svgreader/svgmasknode.cxx
+++ b/svgio/source/svgreader/svgmasknode.cxx
@@ -197,7 +197,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())
             {
@@ -259,6 +261,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 0e5ecd1..f691fc6 100644
--- a/svgio/source/svgreader/svgstyleattributes.cxx
+++ b/svgio/source/svgreader/svgstyleattributes.cxx
@@ -1130,7 +1130,8 @@ namespace svgio
 
                     if(mpClip)
                     {
-                        mpClip->apply(aSource);
+                        // #i124852# transform may be needed when 
userSpaceOnUse
+                        mpClip->apply(aSource, pTransform);
                     }
                 }
 
@@ -1143,7 +1144,8 @@ namespace svgio
 
                         if(mpMask)
                         {
-                            mpMask->apply(aSource);
+                            // #i124852# transform may be needed when 
userSpaceOnUse
+                            mpMask->apply(aSource, pTransform);
                         }
                     }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to