You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by al...@apache.org on 2011/12/15 12:51:43 UTC

svn commit: r1214717 - in /incubator/ooo/branches/alg/svgreplacement/main/svgio: inc/svgio/svgreader/ source/svgreader/

Author: alg
Date: Thu Dec 15 11:51:43 2011
New Revision: 1214717

URL: http://svn.apache.org/viewvc?rev=1214717&view=rev
Log:
svg: Added support for Svg property 'opacity' for groups and grouping elements

Modified:
    incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
    incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx
    incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgclippathnode.cxx
    incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggnode.cxx
    incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx
    incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx
    incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextnode.cxx
    incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx
    incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgstyleattributes.hxx Thu Dec 15 11:51:43 2011
@@ -171,6 +171,7 @@ namespace svgio
             TextDecoration              maTextDecoration;
             TextAnchor                  maTextAnchor;
             SvgPaint                    maColor;
+            SvgNumber                   maOpacity;
 
             /// link to content. If set, the node can be fetched on demand
             rtl::OUString               maClipPathXLink;
@@ -372,6 +373,10 @@ namespace svgio
             const basegfx::BColor* getColor() const;
             void setColor(const SvgPaint& rColor) { maColor = rColor; }
 
+            /// Opacity content
+            const SvgNumber getOpacity() const { return maOpacity; }
+            void setOpacity(const SvgNumber& rOpacity = SvgNumber()) { maOpacity = rOpacity; }
+
             // ClipPathXLink content
             const rtl::OUString getClipPathXLink() const { return maClipPathXLink; }
             void setClipPathXLink(const rtl::OUString& rNew) { maClipPathXLink = rNew; }

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/inc/svgio/svgreader/svgtoken.hxx Thu Dec 15 11:51:43 2011
@@ -105,6 +105,7 @@ namespace svgio
             SVGTokenPatternUnits,
             SVGTokenPatternContentUnits,
             SVGTokenPatternTransform,
+            SVGTokenOpacity,
 
             // AspectRatio and params
             SVGTokenPreserveAspectRatio,

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgclippathnode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgclippathnode.cxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgclippathnode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgclippathnode.cxx Thu Dec 15 11:51:43 2011
@@ -116,7 +116,7 @@ namespace svgio
                     rTarget.push_back(
                         new drawinglayer::primitive2d::TransformPrimitive2D(
                             *getTransform(),
-                            Primitive2DVectorToPrimitive2DSequence(aNewTarget)));
+                            drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewTarget)));
                     aNewTarget.clear();
                 }
                 else

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggnode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggnode.cxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggnode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svggnode.cxx Thu Dec 15 11:51:43 2011
@@ -24,6 +24,7 @@
 
 #include <svgio/svgreader/svggnode.hxx>
 #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
+#include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -86,26 +87,49 @@ namespace svgio
 
         void SvgGNode::decomposeSvgNode(drawinglayer::primitive2d::Primitive2DVector& rTarget, bool bReferenced) const
         {
-            drawinglayer::primitive2d::Primitive2DVector aNewTarget;
+            const SvgStyleAttributes* pStyle = getSvgStyleAttributes();
 
-            // decompose childs
-            SvgNode::decomposeSvgNode(aNewTarget, bReferenced);
-
-            if(!aNewTarget.empty())
+            if(pStyle)
             {
-                if(getTransform())
-                {
-                    // create embedding group element with transformation
-                    rTarget.push_back(
-                        new drawinglayer::primitive2d::TransformPrimitive2D(
-                            *getTransform(),
-                            Primitive2DVectorToPrimitive2DSequence(aNewTarget)));
-                    aNewTarget.clear();
-                }
-                else
+                const double fOpacity(pStyle->getOpacity().getNumber());
+
+                if(fOpacity > 0.0)
                 {
-                    // append to current target
-                    rTarget.insert(rTarget.end(), aNewTarget.begin(), aNewTarget.end());
+                    drawinglayer::primitive2d::Primitive2DVector aNewTarget;
+
+                    // decompose childs
+                    SvgNode::decomposeSvgNode(aNewTarget, bReferenced);
+
+                    if(!aNewTarget.empty())
+                    {
+                        // put content to primitive sequence
+                        drawinglayer::primitive2d::Primitive2DSequence aContent(drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewTarget));
+
+                        if(basegfx::fTools::less(fOpacity, 1.0))
+                        {
+                            // embed in UnifiedTransparencePrimitive2D
+                            const drawinglayer::primitive2d::Primitive2DReference xRef(
+                                new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D(
+                                    aContent,
+                                    1.0 - fOpacity));
+
+                            aContent = drawinglayer::primitive2d::Primitive2DSequence(&xRef, 1);
+                        }
+
+                        if(getTransform())
+                        {
+                            // create embedding group element with transformation
+                            const drawinglayer::primitive2d::Primitive2DReference xRef(
+                                new drawinglayer::primitive2d::TransformPrimitive2D(
+                                    *getTransform(),
+                                    aContent));
+
+                            aContent = drawinglayer::primitive2d::Primitive2DSequence(&xRef, 1);
+                        }
+
+                        // append to current target
+                        rTarget.push_back(new drawinglayer::primitive2d::GroupPrimitive2D(aContent));
+                    }
                 }
             }
         }

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgimagenode.cxx Thu Dec 15 11:51:43 2011
@@ -267,7 +267,7 @@ namespace svgio
 
                             if(aLinkedTarget.size())
                             {
-                                aEmbedded = Primitive2DVectorToPrimitive2DSequence(aLinkedTarget);
+                                aEmbedded = drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aLinkedTarget);
 
                                 if(aEmbedded.hasElements())
                                 {
@@ -309,7 +309,7 @@ namespace svgio
                         {
                             // create mapping
                             const SvgAspectRatio& rRatio = getSvgAspectRatio();
-                            const drawinglayer::primitive2d::Primitive2DSequence aSequence(Primitive2DVectorToPrimitive2DSequence(aNewTarget));
+                            const drawinglayer::primitive2d::Primitive2DSequence aSequence(drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewTarget));
 
                             if(rRatio.isSet())
                             {

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgstyleattributes.cxx Thu Dec 15 11:51:43 2011
@@ -496,7 +496,7 @@ namespace svgio
 
                 if(aNewTarget.size())
                 {
-                    const drawinglayer::primitive2d::Primitive2DSequence aSequence(Primitive2DVectorToPrimitive2DSequence(aNewTarget));
+                    const drawinglayer::primitive2d::Primitive2DSequence aSequence(drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewTarget));
 
                     rTarget.push_back(
                         new drawinglayer::primitive2d::TransformPrimitive2D(
@@ -644,7 +644,7 @@ namespace svgio
                             // embed in UnifiedTransparencePrimitive2D
                             rTarget.push_back(
                                 new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D(
-                                    Primitive2DVectorToPrimitive2DSequence(aNewFill),
+                                    drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewFill),
                                     1.0 - fFillOpacity));
                         }
                         else
@@ -764,7 +764,7 @@ namespace svgio
                                 // embed in UnifiedTransparencePrimitive2D
                                 rTarget.push_back(
                                     new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D(
-                                        Primitive2DVectorToPrimitive2DSequence(aNewStroke),
+                                        drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewStroke),
                                         1.0 - fStrokeOpacity));
                             }
                             else
@@ -1025,7 +1025,14 @@ namespace svgio
                 return;
             }
 
-            drawinglayer::primitive2d::Primitive2DVector aNewPrimitives;
+            const double fOpacity(getOpacity().getNumber());
+
+            if(basegfx::fTools::equalZero(fOpacity))
+            {
+                return;
+            }
+
+            drawinglayer::primitive2d::Primitive2DVector aNewTarget;
 
             if(!bIsLine)
             {
@@ -1040,10 +1047,10 @@ namespace svgio
                     aPath = basegfx::tools::createNonzeroConform(aPath);
                 }
 
-                add_fill(aPath, aNewPrimitives, aGeoRange);
+                add_fill(aPath, aNewTarget, aGeoRange);
             }
 
-            add_stroke(rPath, aNewPrimitives, aGeoRange);
+            add_stroke(rPath, aNewTarget, aGeoRange);
 
             // Svg supports markers for path, polygon, polyline and line
             if(SVGTokenPath == mrOwner.getType() ||         // path
@@ -1051,21 +1058,38 @@ namespace svgio
                 SVGTokenLine == mrOwner.getType())          // line
             {
                 // try to add markers
-                add_markers(rPath, aNewPrimitives);
+                add_markers(rPath, aNewTarget);
             }
 
-            if(pTransform && !aNewPrimitives.empty())
-            {
-                // embed in transformation
-                rTarget.push_back(
-                    new drawinglayer::primitive2d::TransformPrimitive2D(
-                        *pTransform,
-                        Primitive2DVectorToPrimitive2DSequence(aNewPrimitives)));
-            }
-            else
+            if(aNewTarget.size())
             {
-                // just append
-                rTarget.insert(rTarget.end(), aNewPrimitives.begin(), aNewPrimitives.end());
+                // put content to primitive sequence
+                drawinglayer::primitive2d::Primitive2DSequence aContent(drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewTarget));
+
+                if(basegfx::fTools::less(fOpacity, 1.0))
+                {
+                    // embed in UnifiedTransparencePrimitive2D
+                    const drawinglayer::primitive2d::Primitive2DReference xRef(
+                        new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D(
+                            aContent,
+                            1.0 - fOpacity));
+
+                    aContent = drawinglayer::primitive2d::Primitive2DSequence(&xRef, 1);
+                }
+
+                if(pTransform)
+                {
+                    // create embedding group element with transformation
+                    const drawinglayer::primitive2d::Primitive2DReference xRef(
+                        new drawinglayer::primitive2d::TransformPrimitive2D(
+                            *pTransform,
+                            aContent));
+
+                    aContent = drawinglayer::primitive2d::Primitive2DSequence(&xRef, 1);
+                }
+
+                // append to current target
+                rTarget.push_back(new drawinglayer::primitive2d::GroupPrimitive2D(aContent));
             }
         }
 
@@ -1098,6 +1122,7 @@ namespace svgio
             maTextDecoration(TextDecoration_notset),
             maTextAnchor(TextAnchor_notset),
             maColor(),
+            maOpacity(1.0),
             maClipPathXLink(),
             maMaskXLink(),
             maMarkerStartXLink(),
@@ -1664,6 +1689,16 @@ namespace svgio
                     }
                     break;
                 }
+                case SVGTokenOpacity:
+                {
+                    SvgNumber aNum;
+
+                    if(readSingleNumber(aContent, aNum))
+                    {
+                        setOpacity(SvgNumber(basegfx::clamp(aNum.getNumber(), 0.0, 1.0), aNum.getUnit(), aNum.isSet()));
+                    }
+                    break;
+                }
                 case SVGTokenClipPathProperty:
                 {
                     readLocalUrl(aContent, maClipPathXLink);

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextnode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextnode.cxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextnode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtextnode.cxx Thu Dec 15 11:51:43 2011
@@ -29,6 +29,7 @@
 #include <svgio/svgreader/svgtextpathnode.hxx>
 #include <svgio/svgreader/svgtspannode.hxx>
 #include <drawinglayer/primitive2d/transformprimitive2d.hxx>
+#include <drawinglayer/primitive2d/unifiedtransparenceprimitive2d.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -143,7 +144,7 @@ namespace svgio
 
                         if(!aNewTarget.empty())
                         {
-                            const drawinglayer::primitive2d::Primitive2DSequence aPathContent(Primitive2DVectorToPrimitive2DSequence(aNewTarget));
+                            const drawinglayer::primitive2d::Primitive2DSequence aPathContent(drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewTarget));
                             aNewTarget.clear();
 
                             // dismantle TextPrimitives and map them on curve/path
@@ -231,41 +232,59 @@ namespace svgio
 
             if(pStyle && !getChildren().empty())
             {
-                SvgTextPosition aSvgTextPosition(0, *this, getSvgTextPositions());
-                drawinglayer::primitive2d::Primitive2DVector aNewTarget;
-                const SvgNodeVector& rChildren = getChildren();
-                const sal_uInt32 nCount(rChildren.size());
+                const double fOpacity(pStyle->getOpacity().getNumber());
 
-                for(sal_uInt32 a(0); a < nCount; a++)
+                if(fOpacity > 0.0)
                 {
-                    const SvgNode& rCandidate = *rChildren[a];
+                    SvgTextPosition aSvgTextPosition(0, *this, getSvgTextPositions());
+                    drawinglayer::primitive2d::Primitive2DVector aNewTarget;
+                    const SvgNodeVector& rChildren = getChildren();
+                    const sal_uInt32 nCount(rChildren.size());
+
+                    for(sal_uInt32 a(0); a < nCount; a++)
+                    {
+                        const SvgNode& rCandidate = *rChildren[a];
     
-                    DecomposeChild(rCandidate, aNewTarget, aSvgTextPosition);
-                }
+                        DecomposeChild(rCandidate, aNewTarget, aSvgTextPosition);
+                    }
                 
-                if(!aNewTarget.empty())
-                {
-                    drawinglayer::primitive2d::Primitive2DVector aNewTarget2;
-
-                    addTextPrimitives(*this, aNewTarget2, aNewTarget);
-                    aNewTarget = aNewTarget2;
-                }
-
-                if(!aNewTarget.empty())
-                {
-                    if(getTransform())
+                    if(!aNewTarget.empty())
                     {
-                        // create embedding group element with transformation
-                        rTarget.push_back(
-                            new drawinglayer::primitive2d::TransformPrimitive2D(
-                                *getTransform(),
-                                Primitive2DVectorToPrimitive2DSequence(aNewTarget)));
-                        aNewTarget.clear();
+                        drawinglayer::primitive2d::Primitive2DVector aNewTarget2;
+
+                        addTextPrimitives(*this, aNewTarget2, aNewTarget);
+                        aNewTarget = aNewTarget2;
                     }
-                    else
+
+                    if(!aNewTarget.empty())
                     {
+                         // put content to primitive sequence
+                        drawinglayer::primitive2d::Primitive2DSequence aContent(drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewTarget));
+
+                        if(basegfx::fTools::less(fOpacity, 1.0))
+                        {
+                            // embed in UnifiedTransparencePrimitive2D
+                            const drawinglayer::primitive2d::Primitive2DReference xRef(
+                                new drawinglayer::primitive2d::UnifiedTransparencePrimitive2D(
+                                    aContent,
+                                    1.0 - fOpacity));
+
+                            aContent = drawinglayer::primitive2d::Primitive2DSequence(&xRef, 1);
+                        }
+
+                        if(getTransform())
+                        {
+                            // create embedding group element with transformation
+                            const drawinglayer::primitive2d::Primitive2DReference xRef(
+                                new drawinglayer::primitive2d::TransformPrimitive2D(
+                                    *getTransform(),
+                                    aContent));
+
+                            aContent = drawinglayer::primitive2d::Primitive2DSequence(&xRef, 1);
+                        }
+
                         // append to current target
-                        rTarget.insert(rTarget.end(), aNewTarget.begin(), aNewTarget.end());
+                        rTarget.push_back(new drawinglayer::primitive2d::GroupPrimitive2D(aContent));
                     }
                 }
             }

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgtoken.cxx Thu Dec 15 11:51:43 2011
@@ -96,6 +96,7 @@ namespace svgio
         static rtl::OUString aSVGStrPatternUnits(rtl::OUString::createFromAscii("patternUnits")); 
         static rtl::OUString aSVGStrPatternContentUnits(rtl::OUString::createFromAscii("patternContentUnits")); 
         static rtl::OUString aSVGStrPatternTransform(rtl::OUString::createFromAscii("patternTransform")); 
+        static rtl::OUString aSVGStrOpacity(rtl::OUString::createFromAscii("opacity")); 
 
         static rtl::OUString aSVGStrPreserveAspectRatio(rtl::OUString::createFromAscii("preserveAspectRatio")); 
         static rtl::OUString aSVGStrDefer(rtl::OUString::createFromAscii("defer")); 
@@ -234,6 +235,7 @@ namespace svgio
                 aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrPatternUnits, SVGTokenPatternUnits));
                 aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrPatternContentUnits, SVGTokenPatternContentUnits));
                 aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrPatternTransform, SVGTokenPatternTransform));
+                aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrOpacity, SVGTokenOpacity));
 
                 aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrPreserveAspectRatio, SVGTokenPreserveAspectRatio));
                 aSVGTokenMapperList.insert(SVGTokenValueType(aSVGStrDefer, SVGTokenDefer));

Modified: incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx?rev=1214717&r1=1214716&r2=1214717&view=diff
==============================================================================
--- incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx (original)
+++ incubator/ooo/branches/alg/svgreplacement/main/svgio/source/svgreader/svgusenode.cxx Thu Dec 15 11:51:43 2011
@@ -178,7 +178,7 @@ namespace svgio
                         rTarget.push_back(
                             new drawinglayer::primitive2d::TransformPrimitive2D(
                                 aTransform,
-                                Primitive2DVectorToPrimitive2DSequence(aNewTarget)));
+                                drawinglayer::primitive2d::Primitive2DVectorToPrimitive2DSequence(aNewTarget)));
                     }
                     else
                     {