Kaydet (Commit) d37abad9 authored tarafından Thorsten Behrens's avatar Thorsten Behrens

Fix fdo#45779 - accessing empty polygon.

Guard access to first polygon point.
üst c3011998
...@@ -187,70 +187,73 @@ namespace unotools ...@@ -187,70 +187,73 @@ namespace unotools
std::vector<awt::Point> aPoints; aPoints.reserve(nLoopCount); std::vector<awt::Point> aPoints; aPoints.reserve(nLoopCount);
std::vector<drawing::PolygonFlags> aFlags; aFlags.reserve(nLoopCount); std::vector<drawing::PolygonFlags> aFlags; aFlags.reserve(nLoopCount);
// prepare insert index and current point if( nCount )
basegfx::B2DCubicBezier aBezier;
aBezier.setStartPoint(rPoly.getB2DPoint(0));
for(sal_uInt32 b(0L); b<nLoopCount; b++)
{ {
// add current point (always) and remember StartPointIndex for evtl. later corrections // prepare insert index and current point
const awt::Point aStartPoint(fround(aBezier.getStartPoint().getX()), basegfx::B2DCubicBezier aBezier;
fround(aBezier.getStartPoint().getY())); aBezier.setStartPoint(rPoly.getB2DPoint(0));
const sal_uInt32 nStartPointIndex(aPoints.size());
aPoints.push_back(aStartPoint);
aFlags.push_back(drawing::PolygonFlags_NORMAL);
// prepare next segment
const sal_uInt32 nNextIndex((b + 1) % nCount);
aBezier.setEndPoint(rPoly.getB2DPoint(nNextIndex));
aBezier.setControlPointA(rPoly.getNextControlPoint(b));
aBezier.setControlPointB(rPoly.getPrevControlPoint(nNextIndex));
if(aBezier.isBezier())
{
// if one is used, add always two control points due to the old schema
aPoints.push_back( awt::Point(fround(aBezier.getControlPointA().getX()),
fround(aBezier.getControlPointA().getY())) );
aFlags.push_back(drawing::PolygonFlags_CONTROL);
aPoints.push_back( awt::Point(fround(aBezier.getControlPointB().getX()),
fround(aBezier.getControlPointB().getY())) );
aFlags.push_back(drawing::PolygonFlags_CONTROL);
}
// test continuity with previous control point to set flag value for(sal_uInt32 b(0L); b<nLoopCount; b++)
if(aBezier.getControlPointA() != aBezier.getStartPoint() && (bClosed || b))
{ {
const basegfx::B2VectorContinuity eCont(rPoly.getContinuityInPoint(b)); // add current point (always) and remember StartPointIndex for evtl. later corrections
const awt::Point aStartPoint(fround(aBezier.getStartPoint().getX()),
if(basegfx::CONTINUITY_C1 == eCont) fround(aBezier.getStartPoint().getY()));
const sal_uInt32 nStartPointIndex(aPoints.size());
aPoints.push_back(aStartPoint);
aFlags.push_back(drawing::PolygonFlags_NORMAL);
// prepare next segment
const sal_uInt32 nNextIndex((b + 1) % nCount);
aBezier.setEndPoint(rPoly.getB2DPoint(nNextIndex));
aBezier.setControlPointA(rPoly.getNextControlPoint(b));
aBezier.setControlPointB(rPoly.getPrevControlPoint(nNextIndex));
if(aBezier.isBezier())
{ {
aFlags[nStartPointIndex] = drawing::PolygonFlags_SMOOTH; // if one is used, add always two control points due to the old schema
aPoints.push_back( awt::Point(fround(aBezier.getControlPointA().getX()),
fround(aBezier.getControlPointA().getY())) );
aFlags.push_back(drawing::PolygonFlags_CONTROL);
aPoints.push_back( awt::Point(fround(aBezier.getControlPointB().getX()),
fround(aBezier.getControlPointB().getY())) );
aFlags.push_back(drawing::PolygonFlags_CONTROL);
} }
else if(basegfx::CONTINUITY_C2 == eCont)
// test continuity with previous control point to set flag value
if(aBezier.getControlPointA() != aBezier.getStartPoint() && (bClosed || b))
{ {
aFlags[nStartPointIndex] = drawing::PolygonFlags_SYMMETRIC; const basegfx::B2VectorContinuity eCont(rPoly.getContinuityInPoint(b));
if(basegfx::CONTINUITY_C1 == eCont)
{
aFlags[nStartPointIndex] = drawing::PolygonFlags_SMOOTH;
}
else if(basegfx::CONTINUITY_C2 == eCont)
{
aFlags[nStartPointIndex] = drawing::PolygonFlags_SYMMETRIC;
}
} }
}
// prepare next polygon step // prepare next polygon step
aBezier.setStartPoint(aBezier.getEndPoint()); aBezier.setStartPoint(aBezier.getEndPoint());
} }
if(bClosed) if(bClosed)
{ {
// add first point again as closing point due to old definition // add first point again as closing point due to old definition
aPoints.push_back( aPoints[0] ); aPoints.push_back( aPoints[0] );
aFlags.push_back(drawing::PolygonFlags_NORMAL); aFlags.push_back(drawing::PolygonFlags_NORMAL);
} }
else else
{ {
// add last point as closing point // add last point as closing point
const basegfx::B2DPoint aClosingPoint(rPoly.getB2DPoint(nCount - 1L)); const basegfx::B2DPoint aClosingPoint(rPoly.getB2DPoint(nCount - 1L));
const awt::Point aEnd(fround(aClosingPoint.getX()), const awt::Point aEnd(fround(aClosingPoint.getX()),
fround(aClosingPoint.getY())); fround(aClosingPoint.getY()));
aPoints.push_back(aEnd); aPoints.push_back(aEnd);
aFlags.push_back(drawing::PolygonFlags_NORMAL); aFlags.push_back(drawing::PolygonFlags_NORMAL);
}
} }
*pOuterSequence++ = comphelper::containerToSequence(aPoints); *pOuterSequence++ = comphelper::containerToSequence(aPoints);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment