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/08/06 12:42:29 UTC

svn commit: r1616154 - /openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx

Author: alg
Date: Wed Aug  6 10:42:28 2014
New Revision: 1616154

URL: http://svn.apache.org/r1616154
Log:
i125349 refined to exclude possible recursive calls

Modified:
    openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx

Modified: openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx?rev=1616154&r1=1616153&r2=1616154&view=diff
==============================================================================
--- openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx (original)
+++ openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx Wed Aug  6 10:42:28 2014
@@ -417,71 +417,6 @@ namespace basegfx
 			
 			if(rCandidate.count() && rClip.count())
 			{
-                // #125349# detect if both given PolyPolygons are indeed ranges
-                bool bBothRectangle(false);
-
-                if(basegfx::tools::isRectangle(rCandidate))
-                {
-                    if(basegfx::tools::isRectangle(rClip))
-                    {
-                        // both are ranges
-                        bBothRectangle = true;
-                    }
-                    else
-                    {
-                        // rCandidate is rectangle -> clip rClip on rRectangle, use the much
-                        // cheaper and numerically more stable clipping against a range
-                        // This simplification (exchanging content and clip) is valid
-                        // since we do a logical AND operation
-                        return clipPolyPolygonOnRange(rClip, rCandidate.getB2DRange(), bInside, bStroke);
-                    }
-                }
-                else if(basegfx::tools::isRectangle(rClip))
-                {
-                    if(basegfx::tools::isRectangle(rCandidate))
-                    {
-                        // both are ranges
-                        bBothRectangle = true;
-                    }
-                    else
-                    {
-                        // rClip is rectangle -> clip rCandidate on rRectangle, use the much
-                        // cheaper and numerically more stable clipping against a range
-                        return clipPolyPolygonOnRange(rCandidate, rClip.getB2DRange(), bInside, bStroke);
-                    }
-                }
-
-                if(bBothRectangle)
-                {
-                    // both are rectangle
-                    if(rCandidate.getB2DRange().equal(rClip.getB2DRange()))
-                    {
-                        // if both are equal -> no change
-                        return rCandidate;
-                    }
-                    else
-                    {
-                        // not equal -> create new intersection from both ranges,
-                        // but much cheaper based on the ranges
-                        basegfx::B2DRange aIntersectionRange(rCandidate.getB2DRange());
-
-                        aIntersectionRange.intersect(rClip.getB2DRange());
-
-                        if(aIntersectionRange.isEmpty())
-                        {
-                            // no common IntersectionRange -> the clip will be empty
-                            return B2DPolyPolygon();
-                        }
-                        else
-                        {
-                            // use common aIntersectionRange as result, convert
-                            // to expected PolyPolygon form
-                            return basegfx::B2DPolyPolygon(
-                                basegfx::tools::createPolygonFromRect(aIntersectionRange));
-                        }
-                    }
-                }
-
                 // one or both are no rectangle - go the hard way and clip PolyPolygon
                 // against PolyPolygon...
 				if(bStroke)
@@ -550,10 +485,81 @@ namespace basegfx
 					    }
 					}
 				}
-				else
-				{
-					// area clipping
-					B2DPolyPolygon aMergePolyPolygonA(rClip);
+                else
+                {
+                    // check for simplification with ranges if !bStroke (handling as stroke is more simple),
+                    // but also only when bInside, else the simplification may lead to recursive calls (see
+                    // calls to clipPolyPolygonOnPolyPolygon in clipPolyPolygonOnRange and clipPolygonOnRange)
+                    if(bInside)
+                    {
+                        // #125349# detect if both given PolyPolygons are indeed ranges
+                        bool bBothRectangle(false);
+
+                        if(basegfx::tools::isRectangle(rCandidate))
+                        {
+                            if(basegfx::tools::isRectangle(rClip))
+                            {
+                                // both are ranges
+                                bBothRectangle = true;
+                            }
+                            else
+                            {
+                                // rCandidate is rectangle -> clip rClip on rRectangle, use the much
+                                // cheaper and numerically more stable clipping against a range
+                                // This simplification (exchanging content and clip) is valid
+                                // since we do a logical AND operation
+                                return clipPolyPolygonOnRange(rClip, rCandidate.getB2DRange(), bInside, bStroke);
+                            }
+                        }
+                        else if(basegfx::tools::isRectangle(rClip))
+                        {
+                            if(basegfx::tools::isRectangle(rCandidate))
+                            {
+                                // both are ranges
+                                bBothRectangle = true;
+                            }
+                            else
+                            {
+                                // rClip is rectangle -> clip rCandidate on rRectangle, use the much
+                                // cheaper and numerically more stable clipping against a range
+                                return clipPolyPolygonOnRange(rCandidate, rClip.getB2DRange(), bInside, bStroke);
+                            }
+                        }
+
+                        if(bBothRectangle)
+                        {
+                            // both are rectangle
+                            if(rCandidate.getB2DRange().equal(rClip.getB2DRange()))
+                            {
+                                // if both are equal -> no change
+                                return rCandidate;
+                            }
+                            else
+                            {
+                                // not equal -> create new intersection from both ranges,
+                                // but much cheaper based on the ranges
+                                basegfx::B2DRange aIntersectionRange(rCandidate.getB2DRange());
+
+                                aIntersectionRange.intersect(rClip.getB2DRange());
+
+                                if(aIntersectionRange.isEmpty())
+                                {
+                                    // no common IntersectionRange -> the clip will be empty
+                                    return B2DPolyPolygon();
+                                }
+                                else
+                                {
+                                    // use common aIntersectionRange as result, convert
+                                    // to expected PolyPolygon form
+                                    return basegfx::B2DPolyPolygon(
+                                        basegfx::tools::createPolygonFromRect(aIntersectionRange));
+                                }
+                            }
+                        }
+                    }
+
+                    // area clipping
+                    B2DPolyPolygon aMergePolyPolygonA(rClip);
 
                     // First solve all polygon-self and polygon-polygon intersections. 
                     // Also get rid of some not-needed polygons (neutral, no area -> when