33#include < algorithm>
44#include < cassert>
55#include < cmath>
6+ #include < cstddef>
67#include < limits>
78#include < memory>
9+ #include < utility>
810#include < vector>
911
1012namespace mapbox {
@@ -64,7 +66,7 @@ class Earcut {
6466 Node* cureLocalIntersections (Node* start);
6567 void splitEarcut (Node* start);
6668 template <typename Polygon> Node* eliminateHoles (const Polygon& points, Node* outerNode);
67- void eliminateHole (Node* hole, Node* outerNode);
69+ Node* eliminateHole (Node* hole, Node* outerNode);
6870 Node* findHoleBridge (Node* hole, Node* outerNode);
6971 bool sectorContainsSector (const Node* m, const Node* p);
7072 void indexCurve (Node* start);
@@ -440,7 +442,7 @@ Earcut<N>::eliminateHoles(const Polygon& points, Node* outerNode) {
440442
441443 // process holes from left to right
442444 for (size_t i = 0 ; i < queue.size (); i++) {
443- eliminateHole (queue[i], outerNode);
445+ outerNode = eliminateHole (queue[i], outerNode);
444446 outerNode = filterPoints (outerNode, outerNode->next );
445447 }
446448
@@ -449,15 +451,21 @@ Earcut<N>::eliminateHoles(const Polygon& points, Node* outerNode) {
449451
450452// find a bridge between vertices that connects hole with an outer ring and and link it
451453template <typename N>
452- void Earcut<N>::eliminateHole(Node* hole, Node* outerNode) {
453- outerNode = findHoleBridge (hole, outerNode);
454- if (outerNode) {
455- Node* b = splitPolygon (outerNode, hole);
456-
457- // filter out colinear points around cuts
458- filterPoints (outerNode, outerNode->next );
459- filterPoints (b, b->next );
454+ typename Earcut<N>::Node*
455+ Earcut<N>::eliminateHole(Node* hole, Node* outerNode) {
456+ Node* bridge = findHoleBridge (hole, outerNode);
457+ if (!bridge) {
458+ return outerNode;
460459 }
460+
461+ Node* bridgeReverse = splitPolygon (bridge, hole);
462+
463+ // filter collinear points around the cuts
464+ Node* filteredBridge = filterPoints (bridge, bridge->next );
465+ filterPoints (bridgeReverse, bridgeReverse->next );
466+
467+ // Check if input node was removed by the filtering
468+ return outerNode == bridge ? filteredBridge : outerNode;
461469}
462470
463471// David Eberly's algorithm for finding a bridge between hole and outer polygon
0 commit comments