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 2012/01/17 12:48:51 UTC

svn commit: r1232392 - in /incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon: b3dpolygontools.cxx b3dpolypolygontools.cxx

Author: alg
Date: Tue Jan 17 11:48:51 2012
New Revision: 1232392

URL: http://svn.apache.org/viewvc?rev=1232392&view=rev
Log:
#118805# Secured applyLineDashing for zero length edges, secured createUnitSphereFillPolyPolygon for too big values of hor/ver segments

Modified:
    incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolygontools.cxx
    incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolypolygontools.cxx

Modified: incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolygontools.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolygontools.cxx?rev=1232392&r1=1232391&r2=1232392&view=diff
==============================================================================
--- incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolygontools.cxx (original)
+++ incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolygontools.cxx Tue Jan 17 11:48:51 2012
@@ -407,68 +407,71 @@ namespace basegfx
                 sal_uInt32 nDotDashIndex(0);
                 bool bIsLine(true);
                 double fDotDashMovingLength(rDotDashArray[0]);
-				B3DPolygon aSnippet;
+                B3DPolygon aSnippet;
 
-				// iterate over all edges
+                // iterate over all edges
                 for(sal_uInt32 a(0); a < nEdgeCount; a++)
                 {
                     // update current edge
-					double fLastDotDashMovingLength(0.0);
+                    double fLastDotDashMovingLength(0.0);
                     const sal_uInt32 nNextIndex((a + 1) % nPointCount);
-					const B3DPoint aNextPoint(rCandidate.getB3DPoint(nNextIndex));
-					const double fEdgeLength(B3DVector(aNextPoint - aCurrentPoint).getLength());
+                    const B3DPoint aNextPoint(rCandidate.getB3DPoint(nNextIndex));
+                    const double fEdgeLength(B3DVector(aNextPoint - aCurrentPoint).getLength());
 
-					while(fTools::less(fDotDashMovingLength, fEdgeLength))
-					{
-						// new split is inside edge, create and append snippet [fLastDotDashMovingLength, fDotDashMovingLength]
-						const bool bHandleLine(bIsLine && pLineTarget);
-						const bool bHandleGap(!bIsLine && pGapTarget);
+                    if(!fTools::equalZero(fEdgeLength))
+                    {
+                        while(fTools::less(fDotDashMovingLength, fEdgeLength))
+                        {
+                            // new split is inside edge, create and append snippet [fLastDotDashMovingLength, fDotDashMovingLength]
+                            const bool bHandleLine(bIsLine && pLineTarget);
+                            const bool bHandleGap(!bIsLine && pGapTarget);
+                            
+                            if(bHandleLine || bHandleGap)
+                            {
+                                if(!aSnippet.count())
+                                {
+                                    aSnippet.append(interpolate(aCurrentPoint, aNextPoint, fLastDotDashMovingLength / fEdgeLength));
+                                }
+
+                                aSnippet.append(interpolate(aCurrentPoint, aNextPoint, fDotDashMovingLength / fEdgeLength));
+
+                                if(bHandleLine)
+                                {
+                                    pLineTarget->append(aSnippet);
+                                }
+                                else
+                                {
+                                    pGapTarget->append(aSnippet);
+                                }
+
+                                aSnippet.clear();
+                            }
+
+                            // prepare next DotDashArray step and flip line/gap flag
+                            fLastDotDashMovingLength = fDotDashMovingLength;
+                            fDotDashMovingLength += rDotDashArray[(++nDotDashIndex) % nDotDashCount];
+                            bIsLine = !bIsLine;
+                        }
 
+                        // append snippet [fLastDotDashMovingLength, fEdgeLength]
+                        const bool bHandleLine(bIsLine && pLineTarget);
+                        const bool bHandleGap(!bIsLine && pGapTarget);
+                                       
                         if(bHandleLine || bHandleGap)
                         {
-							if(!aSnippet.count())
-							{
-								aSnippet.append(interpolate(aCurrentPoint, aNextPoint, fLastDotDashMovingLength / fEdgeLength));
-							}
+                            if(!aSnippet.count())
+                            {
+                                aSnippet.append(interpolate(aCurrentPoint, aNextPoint, fLastDotDashMovingLength / fEdgeLength));
+                            }
 
-							aSnippet.append(interpolate(aCurrentPoint, aNextPoint, fDotDashMovingLength / fEdgeLength));
-
-							if(bHandleLine)
-							{
-								pLineTarget->append(aSnippet);
-							}
-							else
-							{
-								pGapTarget->append(aSnippet);
-							}
-
-							aSnippet.clear();
-						}
-						
-						// prepare next DotDashArray step and flip line/gap flag
-						fLastDotDashMovingLength = fDotDashMovingLength;
-                        fDotDashMovingLength += rDotDashArray[(++nDotDashIndex) % nDotDashCount];
-                        bIsLine = !bIsLine;
-					}
+                            aSnippet.append(aNextPoint);
+                        }
 
-					// append snippet [fLastDotDashMovingLength, fEdgeLength]
-					const bool bHandleLine(bIsLine && pLineTarget);
-					const bool bHandleGap(!bIsLine && pGapTarget);
-                    
-					if(bHandleLine || bHandleGap)
-                    {
-						if(!aSnippet.count())
-						{
-							aSnippet.append(interpolate(aCurrentPoint, aNextPoint, fLastDotDashMovingLength / fEdgeLength));
-						}
+                        // prepare move to next edge
+                        fDotDashMovingLength -= fEdgeLength;
+                    }
 
-						aSnippet.append(aNextPoint);
-					}
-					
-					// prepare move to next edge
-					fDotDashMovingLength -= fEdgeLength;
-					
-					// prepare next edge step (end point gets new start point)
+                    // prepare next edge step (end point gets new start point)
                     aCurrentPoint = aNextPoint;
                 }
 

Modified: incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolypolygontools.cxx
URL: http://svn.apache.org/viewvc/incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolypolygontools.cxx?rev=1232392&r1=1232391&r2=1232392&view=diff
==============================================================================
--- incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolypolygontools.cxx (original)
+++ incubator/ooo/branches/alg/linecap/main/basegfx/source/polygon/b3dpolypolygontools.cxx Tue Jan 17 11:48:51 2012
@@ -34,6 +34,11 @@
 #include <osl/mutex.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
+// predefines
+#define nMinSegments sal_uInt32(1)
+#define nMaxSegments sal_uInt32(512)
+
+//////////////////////////////////////////////////////////////////////////////
 
 namespace basegfx
 {
@@ -268,20 +273,16 @@ namespace basegfx
 				nHorSeg = fround(fabs(fHorStop - fHorStart) / (F_2PI / 24.0));
 			}
 
-			if(!nHorSeg)
-			{
-				nHorSeg = 1L;
-			}
+            // min/max limitations
+            nHorSeg = ::std::min(nMaxSegments, ::std::max(nMinSegments, nHorSeg));
 
 			if(!nVerSeg)
 			{
 				nVerSeg = fround(fabs(fVerStop - fVerStart) / (F_2PI / 24.0));
 			}
 
-			if(!nVerSeg)
-			{
-				nVerSeg = 1L;
-			}
+            // min/max limitations
+            nVerSeg = ::std::min(nMaxSegments, ::std::max(nMinSegments, nVerSeg));
 
 			// create constants
 			const double fVerDiffPerStep((fVerStop - fVerStart) / (double)nVerSeg);
@@ -371,20 +372,16 @@ namespace basegfx
 				nHorSeg = fround(fabs(fHorStop - fHorStart) / (F_2PI / 24.0));
 			}
 
-			if(!nHorSeg)
-			{
-				nHorSeg = 1L;
-			}
+            // min/max limitations
+            nHorSeg = ::std::min(nMaxSegments, ::std::max(nMinSegments, nHorSeg));
 
 			if(!nVerSeg)
 			{
 				nVerSeg = fround(fabs(fVerStop - fVerStart) / (F_2PI / 24.0));
 			}
 
-			if(!nVerSeg)
-			{
-				nVerSeg = 1L;
-			}
+            // min/max limitations
+            nVerSeg = ::std::min(nMaxSegments, ::std::max(nMinSegments, nVerSeg));
 
 			// vertical loop
 			for(sal_uInt32 a(0L); a < nVerSeg; a++)