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 2014/03/28 11:42:39 UTC

svn commit: r1582684 - /openoffice/trunk/main/svgio/source/svgreader/svgclippathnode.cxx

Author: alg
Date: Fri Mar 28 10:42:39 2014
New Revision: 1582684

URL: http://svn.apache.org/r1582684
Log:
i124313 At SVG import, try to optimize used CLipRegions

Modified:
    openoffice/trunk/main/svgio/source/svgreader/svgclippathnode.cxx

Modified: openoffice/trunk/main/svgio/source/svgreader/svgclippathnode.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/svgio/source/svgreader/svgclippathnode.cxx?rev=1582684&r1=1582683&r2=1582684&view=diff
==============================================================================
--- openoffice/trunk/main/svgio/source/svgreader/svgclippathnode.cxx (original)
+++ openoffice/trunk/main/svgio/source/svgreader/svgclippathnode.cxx Fri Mar 28 10:42:39 2014
@@ -29,6 +29,7 @@
 #include <drawinglayer/geometry/viewinformation2d.hxx>
 #include <drawinglayer/processor2d/contourextractor2d.hxx>
 #include <basegfx/polygon/b2dpolypolygoncutter.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
 
@@ -179,16 +180,75 @@ namespace svgio
                                 aContentRange.getMinimum()));
                     }
 
-                    // redefine target. Use MaskPrimitive2D with created clip
-                    // geometry. Using the automatically set mbIsClipPathContent at 
-                    // SvgStyleAttributes the clip definition is without fill, stroke, 
-                    // and strokeWidth and forced to black
-                    const drawinglayer::primitive2d::Primitive2DReference xEmbedTransparence(
-                        new drawinglayer::primitive2d::MaskPrimitive2D(
-                            aClipPolyPolygon,
-                            rContent));
+                    // #124313# try to avoid creating an embedding to a MaskPrimitive2D if
+                    // possible; MaskPrimitive2D processing is potentially expensive
+                    bool bCreateEmbedding(true);
+                    bool bAddContent(true);
 
-                    rContent = drawinglayer::primitive2d::Primitive2DSequence(&xEmbedTransparence, 1);
+                    if(basegfx::tools::isRectangle(aClipPolyPolygon))
+                    {
+                        // ClipRegion is a rectangle, thus it is not expensive to tell
+                        // if the content is completely inside or outside of it; get ranges
+                        const basegfx::B2DRange aClipRange(aClipPolyPolygon.getB2DRange());
+                        const basegfx::B2DRange aContentRange(
+                            drawinglayer::primitive2d::getB2DRangeFromPrimitive2DSequence(
+                                rContent,
+                                aViewInformation2D));
+
+                        if(aClipRange.isInside(aContentRange))
+                        {
+                            // completely contained, no need to clip at all, so no need for embedding
+                            bCreateEmbedding = false;
+                        }
+                        else if(aClipRange.overlaps(aContentRange))
+                        {
+                            // overlap; embedding needed. ClipRegion can be minimized by using
+                            // the intersection of the ClipRange and the ContentRange. Minimizing
+                            // the ClipRegion potentially enhances further processing since
+                            // usually clip operations are expensive.
+                            basegfx::B2DRange aCommonRange(aContentRange);
+
+                            aCommonRange.intersect(aClipRange);
+                            aClipPolyPolygon = basegfx::B2DPolyPolygon(basegfx::tools::createPolygonFromRect(aCommonRange));
+                        }
+                        else
+                        {
+                            // not inside and no overlap -> completely outside
+                            // no need for embedding, no need for content at all
+                            bCreateEmbedding = false;
+                            bAddContent = false;
+                        }
+                    }
+                    else
+                    {
+                        // ClipRegion is not a simple rectangle, it would be possible but expensive to
+                        // tell if the content needs clipping or not. It is also dependent of
+                        // the content's decomposition. To do this, a processor would be needed that
+                        // is capable if processing the given sequence of primitives and decide
+                        // if all is inside or all is outside. Such a ClipProcessor could be written,
+                        // but for now just create the embedding
+                    }
+
+                    if(bCreateEmbedding)
+                    {
+                        // redefine target. Use MaskPrimitive2D with created clip
+                        // geometry. Using the automatically set mbIsClipPathContent at 
+                        // SvgStyleAttributes the clip definition is without fill, stroke, 
+                        // and strokeWidth and forced to black
+                        const drawinglayer::primitive2d::Primitive2DReference xEmbedTransparence(
+                            new drawinglayer::primitive2d::MaskPrimitive2D(
+                                aClipPolyPolygon,
+                                rContent));
+
+                        rContent = drawinglayer::primitive2d::Primitive2DSequence(&xEmbedTransparence, 1);
+                    }
+                    else
+                    {
+                        if(!bAddContent)
+                        {
+                            rContent.realloc(0);
+                        }
+                    }
                 }
                 else
                 {