openoffice-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From a..@apache.org
Subject svn commit: r1615952 - in /openoffice/trunk/main: basegfx/source/polygon/b2dpolygonclipper.cxx drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
Date Tue, 05 Aug 2014 16:11:22 GMT
Author: alg
Date: Tue Aug  5 16:11:21 2014
New Revision: 1615952

URL: http://svn.apache.org/r1615952
Log:
i125349 moved clip enhancements to base clipping functionality

Modified:
    openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx
    openoffice/trunk/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.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=1615952&r1=1615951&r2=1615952&view=diff
==============================================================================
--- openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx (original)
+++ openoffice/trunk/main/basegfx/source/polygon/b2dpolygonclipper.cxx Tue Aug  5 16:11:21
2014
@@ -417,6 +417,73 @@ 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)
 				{
 					// line clipping, create line snippets by first adding all cut points and

Modified: openoffice/trunk/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx?rev=1615952&r1=1615951&r2=1615952&view=diff
==============================================================================
--- openoffice/trunk/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx (original)
+++ openoffice/trunk/main/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx Tue Aug
 5 16:11:21 2014
@@ -1741,55 +1741,20 @@ namespace drawinglayer
 							// prepare new mask polygon and rescue current one
 					        aMask.transform(maCurrentTransformation);
                             const basegfx::B2DPolyPolygon aLastClipPolyPolygon(maClipPolyPolygon);
-
+					        
                             if(maClipPolyPolygon.count())
                             {
-                                // due to the cost of PolyPolygon clipping and numerical
reasons try first if the current
-                                // and the new ClipRegion are ranges. If yes, processing
can be simplified
-                                if(basegfx::tools::isRectangle(aMask) 
-                                    && basegfx::tools::isRectangle(maClipPolyPolygon))
-                                {
-                                    // both ClipPolygons are rectangles
-                                    if(aMask.getB2DRange().equal(maClipPolyPolygon.getB2DRange()))
-                                    {
-                                        // equal -> no change in ClipRegion needed, leave
-                                        // maClipPolyPolygon unchanged
-                                    }
-                                    else
-                                    {
-                                        // not equal -> create new ClipRegion from the
two ranges
-                                        basegfx::B2DRange aClipRange(aMask.getB2DRange());
-
-                                        aClipRange.intersect(maClipPolyPolygon.getB2DRange());
-
-                                        if(aClipRange.isEmpty())
-                                        {
-                                            // no common ClipRegion -> set empty ClipRegion,
no content to show
-                                            maClipPolyPolygon.clear();
-                                        }
-                                        else
-                                        {
-                                            // use common ClipRegion as new ClipRegion
-                                            maClipPolyPolygon = basegfx::B2DPolyPolygon(
-                                                basegfx::tools::createPolygonFromRect(aClipRange));
-                                        }
-                                    }
-                                }
-                                else
-                                {
-                                    // The current ClipRegion or the new one is not a rectangle;
-                                    // there is already a clip polygon set; build clipped
union of 
-                                    // current mask polygon and new one
-                                    maClipPolyPolygon = basegfx::tools::clipPolyPolygonOnPolyPolygon(
-                                        aMask, 
-                                        maClipPolyPolygon, 
-                                        true, // #i106516# we want the inside of aMask, not
the outside
-                                        false);
-                                }
+								// there is already a clip polygon set; build clipped union of 
+								// current mask polygon and new one
+								maClipPolyPolygon = basegfx::tools::clipPolyPolygonOnPolyPolygon(
+                                    aMask, 
+                                    maClipPolyPolygon, 
+                                    true, // #i106516# we want the inside of aMask, not the
outside
+                                    false);
                             }
                             else
                             {
-                                // use new mask directly as ClipRegion
+                                // use mask directly
                                 maClipPolyPolygon = aMask;
                             }
 
@@ -1798,13 +1763,8 @@ namespace drawinglayer
                                 // set VCL clip region; subdivide before conversion to tools
polygon. Subdivision necessary (!)
                                 // Removed subdivision and fixed in Region::ImplPolyPolyRegionToBandRegionFunc()
in VCL where
                                 // the ClipRegion is built from the Polygon. A AdaptiveSubdivide
on the source polygon was missing there
-                                const bool bNewClipRegion(maClipPolyPolygon != aLastClipPolyPolygon);
-
-                                if(bNewClipRegion)
-                                {
-                                    mpOutputDevice->Push(PUSH_CLIPREGION);
-                                    mpOutputDevice->SetClipRegion(Region(maClipPolyPolygon));
-                                }
+                                mpOutputDevice->Push(PUSH_CLIPREGION);
+                                mpOutputDevice->SetClipRegion(Region(maClipPolyPolygon));
 
                                 // recursively paint content
                                 // #121267# Only need to process sub-content when clip polygon
is *not* empty.
@@ -1812,10 +1772,7 @@ namespace drawinglayer
                                 process(rMaskCandidate.getChildren());
 
                                 // restore VCL clip region
-                                if(bNewClipRegion)
-                                {
-                                    mpOutputDevice->Pop();
-                                }
+                                mpOutputDevice->Pop();
                             }
 
                             // restore to rescued clip polygon



Mime
View raw message