Author: alg
Date: Mon Jan 23 11:22:50 2012
New Revision: 1234749

URL: http://svn.apache.org/viewvc?rev=1234749&view=rev
Log:
#118822# secured 3D geometry creation (slices) by subdividing the 2D source 
polyPolygon early

Modified:
    
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudelathetools3d.cxx
    
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx
    
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx

Modified: 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudelathetools3d.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudelathetools3d.cxx?rev=1234749&r1=1234748&r2=1234749&view=diff
==============================================================================
--- 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudelathetools3d.cxx
 (original)
+++ 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudelathetools3d.cxx
 Mon Jan 23 11:22:50 2012
@@ -116,14 +116,14 @@ namespace
                bool bCreateTextureCoordinates)
        {
                OSL_ENSURE(rPolA.count() == rPolB.count(), 
"impAddInBetweenFill: unequally sized polygons (!)");
-               const sal_uInt32 nPolygonCount(rPolA.count());
+               const sal_uInt32 nPolygonCount(::std::min(rPolA.count(), 
rPolB.count()));
 
                for(sal_uInt32 a(0L); a < nPolygonCount; a++)
                {
                        const basegfx::B3DPolygon aSubA(rPolA.getB3DPolygon(a));
                        const basegfx::B3DPolygon aSubB(rPolB.getB3DPolygon(a));
                        OSL_ENSURE(aSubA.count() == aSubB.count(), 
"impAddInBetweenFill: unequally sized polygons (!)");
-                       const sal_uInt32 nPointCount(aSubA.count());
+                       const sal_uInt32 nPointCount(::std::min(aSubA.count(), 
aSubB.count()));
 
                        if(nPointCount)
                        {
@@ -213,13 +213,14 @@ namespace
                bool bSmoothHorizontalNormals)
        {
                OSL_ENSURE(rPolA.count() == rPolB.count(), 
"sdrExtrudePrimitive3D: unequally sized polygons (!)");
+               const sal_uInt32 nPolygonCount(::std::min(rPolA.count(), 
rPolB.count()));
 
-               for(sal_uInt32 a(0L); a < rPolA.count(); a++)
+               for(sal_uInt32 a(0L); a < nPolygonCount; a++)
                {
                        basegfx::B3DPolygon aSubA(rPolA.getB3DPolygon(a));
                        basegfx::B3DPolygon aSubB(rPolB.getB3DPolygon(a));
                        OSL_ENSURE(aSubA.count() == aSubB.count(), 
"sdrExtrudePrimitive3D: unequally sized polygons (!)");
-                       const sal_uInt32 nPointCount(aSubA.count());
+                       const sal_uInt32 nPointCount(::std::min(aSubA.count(), 
aSubB.count()));
 
                        if(nPointCount)
                        {
@@ -296,13 +297,14 @@ namespace
        {
                const double fWeightB(1.0 - fWeightA);
                OSL_ENSURE(rPolA.count() == rPolB.count(), 
"sdrExtrudePrimitive3D: unequally sized polygons (!)");
+               const sal_uInt32 nPolygonCount(::std::min(rPolA.count(), 
rPolB.count()));
 
-               for(sal_uInt32 a(0L); a < rPolA.count(); a++)
+               for(sal_uInt32 a(0L); a < nPolygonCount; a++)
                {
                        basegfx::B3DPolygon aSubA(rPolA.getB3DPolygon(a));
                        const basegfx::B3DPolygon aSubB(rPolB.getB3DPolygon(a));
                        OSL_ENSURE(aSubA.count() == aSubB.count(), 
"sdrExtrudePrimitive3D: unequally sized polygons (!)");
-                       const sal_uInt32 nPointCount(aSubA.count());
+                       const sal_uInt32 nPointCount(::std::min(aSubA.count(), 
aSubB.count()));
 
                        for(sal_uInt32 b(0L); b < nPointCount; b++)
                        {
@@ -539,12 +541,19 @@ namespace drawinglayer
                                                
                                                for(sal_uInt32 d(0); d < 
nNumSlices; d++)
                                                {
-                            OSL_ENSURE(nSlideSubPolygonCount == 
rSliceVector[d].getB3DPolyPolygon().count(), 
-                                "Slice PolyPolygon with different Polygon 
count (!)");
-                            OSL_ENSURE(nSubPolygonPointCount == 
rSliceVector[d].getB3DPolyPolygon().getB3DPolygon(b).count(), 
-                                "Slice Polygon with different point count 
(!)");
-                                                       
aNew.append(rSliceVector[d].getB3DPolyPolygon().getB3DPolygon(b).getB3DPoint(c));
-                                               }
+                            const bool bSamePolygonCount(nSlideSubPolygonCount 
== rSliceVector[d].getB3DPolyPolygon().count());
+                            const bool bSamePointCount(nSubPolygonPointCount 
== rSliceVector[d].getB3DPolyPolygon().getB3DPolygon(b).count());
+
+                            if(bSamePolygonCount && bSamePointCount)
+                            {
+                                
aNew.append(rSliceVector[d].getB3DPolyPolygon().getB3DPolygon(b).getB3DPoint(c));
+                            }
+                            else
+                            {
+                                OSL_ENSURE(bSamePolygonCount, "Slice 
PolyPolygon with different Polygon count (!)");
+                                OSL_ENSURE(bSamePointCount, "Slice Polygon 
with different point count (!)");
+                            }
+                        }
 
                                                aNew.setClosed(bCloseHorLines);
                                                aRetval.append(aNew);

Modified: 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx?rev=1234749&r1=1234748&r2=1234749&view=diff
==============================================================================
--- 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx
 (original)
+++ 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrextrudeprimitive3d.cxx
 Mon Jan 23 11:22:50 2012
@@ -369,7 +369,8 @@ namespace drawinglayer
                {
                        // prepare the polygon. No double points, correct 
orientations and a correct
                        // outmost polygon are needed
-                       maCorrectedPolyPolygon = getPolyPolygon();
+            // Also important: subdivide here to ensure equal point count for 
all slices (!)
+                       maCorrectedPolyPolygon = 
basegfx::tools::adaptiveSubdivideByAngle(getPolyPolygon());
                        maCorrectedPolyPolygon.removeDoublePoints();
                        maCorrectedPolyPolygon = 
basegfx::tools::correctOrientations(maCorrectedPolyPolygon);
                        maCorrectedPolyPolygon = 
basegfx::tools::correctOutmostPolygon(maCorrectedPolyPolygon);

Modified: 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx
URL: 
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx?rev=1234749&r1=1234748&r2=1234749&view=diff
==============================================================================
--- 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx
 (original)
+++ 
incubator/ooo/trunk/main/drawinglayer/source/primitive3d/sdrlatheprimitive3d.cxx
 Mon Jan 23 11:22:50 2012
@@ -213,6 +213,7 @@ namespace drawinglayer
                {
                        // prepare the polygon. No double points, correct 
orientations and a correct
                        // outmost polygon are needed
+            // Also important: subdivide here to ensure equal point count for 
all slices (!)
                        maCorrectedPolyPolygon = 
basegfx::tools::adaptiveSubdivideByAngle(getPolyPolygon());
                        maCorrectedPolyPolygon.removeDoublePoints();
                        maCorrectedPolyPolygon = 
basegfx::tools::correctOrientations(maCorrectedPolyPolygon);


Reply via email to