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/23 12:22:50 UTC
svn commit: r1234749 - in
/incubator/ooo/trunk/main/drawinglayer/source/primitive3d:
sdrextrudelathetools3d.cxx sdrextrudeprimitive3d.cxx sdrlatheprimitive3d.cxx
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);