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
                 {


Reply via email to