Merge pull request #2291 from arkeon7/Branch_Clipper_correction

Correction on clipper crash on some IFC files when points are empty
pull/2293/head
Kim Kulling 2019-01-02 19:57:49 +01:00 committed by GitHub
commit 455c4ceea4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 8 additions and 2 deletions

View File

@ -371,6 +371,9 @@ inline bool PointsEqual( const IntPoint &pt1, const IntPoint &pt2)
bool Orientation(OutRec *outRec, bool UseFullInt64Range) bool Orientation(OutRec *outRec, bool UseFullInt64Range)
{ {
if (!outRec->pts)
return 0.0;
//first make sure bottomPt is correctly assigned ... //first make sure bottomPt is correctly assigned ...
OutPt *opBottom = outRec->pts, *op = outRec->pts->next; OutPt *opBottom = outRec->pts, *op = outRec->pts->next;
while (op != outRec->pts) while (op != outRec->pts)
@ -434,6 +437,9 @@ double Area(const Polygon &poly)
double Area(const OutRec &outRec, bool UseFullInt64Range) double Area(const OutRec &outRec, bool UseFullInt64Range)
{ {
if (!outRec.pts)
return 0.0;
OutPt *op = outRec.pts; OutPt *op = outRec.pts;
if (UseFullInt64Range) { if (UseFullInt64Range) {
Int128 a(0); Int128 a(0);
@ -3085,9 +3091,9 @@ void Clipper::JoinCommonEdges(bool fixHoleLinkages)
FixupOutPolygon(*outRec1); FixupOutPolygon(*outRec1);
FixupOutPolygon(*outRec2); FixupOutPolygon(*outRec2);
if (Orientation(outRec1, m_UseFullRange) != (Area(*outRec1, m_UseFullRange) > 0)) if (outRec1->pts && (Orientation(outRec1, m_UseFullRange) != (Area(*outRec1, m_UseFullRange) > 0)))
DisposeBottomPt(*outRec1); DisposeBottomPt(*outRec1);
if (Orientation(outRec2, m_UseFullRange) != (Area(*outRec2, m_UseFullRange) > 0)) if (outRec2->pts && (Orientation(outRec2, m_UseFullRange) != (Area(*outRec2, m_UseFullRange) > 0)))
DisposeBottomPt(*outRec2); DisposeBottomPt(*outRec2);
} else } else