Move various static GrTriangulator functions into structs

Bug: skia:10419
Change-Id: I43fc724de1476cbfda95b9ddd3611ec2ec547a37
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/352900
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/src/gpu/GrTriangulator.cpp b/src/gpu/GrTriangulator.cpp
index 916457a..a1080dc 100644
--- a/src/gpu/GrTriangulator.cpp
+++ b/src/gpu/GrTriangulator.cpp
@@ -23,7 +23,7 @@
 
 #if TRIANGULATOR_LOGGING
 #define TESS_LOG printf
-#define DUMP_MESH(M) dump_mesh(M)
+#define DUMP_MESH(M) (M).dump()
 #else
 #define TESS_LOG(...)
 #define DUMP_MESH(M)
@@ -213,7 +213,10 @@
 void GrTriangulator::EdgeList::insert(Edge* edge, Edge* prev, Edge* next) {
     list_insert<Edge, &Edge::fLeft, &Edge::fRight>(edge, prev, next, &fHead, &fTail);
 }
+
 void GrTriangulator::EdgeList::remove(Edge* edge) {
+    TESS_LOG("removing edge %g -> %g\n", edge->fTop->fID, edge->fBottom->fID);
+    SkASSERT(this->contains(edge));
     list_remove<Edge, &Edge::fLeft, &Edge::fRight>(edge, &fHead, &fTail);
 }
 
@@ -570,17 +573,11 @@
     return fAlloc.make<Edge>(top, bottom, winding, type);
 }
 
-static void remove_edge(Edge* edge, EdgeList* edges) {
-    TESS_LOG("removing edge %g -> %g\n", edge->fTop->fID, edge->fBottom->fID);
-    SkASSERT(edges->contains(edge));
-    edges->remove(edge);
-}
-
-static void insert_edge(Edge* edge, Edge* prev, EdgeList* edges) {
+void EdgeList::insert(Edge* edge, Edge* prev) {
     TESS_LOG("inserting edge %g -> %g\n", edge->fTop->fID, edge->fBottom->fID);
-    SkASSERT(!edges->contains(edge));
-    Edge* next = prev ? prev->fRight : edges->fHead;
-    edges->insert(edge, prev, next);
+    SkASSERT(!this->contains(edge));
+    Edge* next = prev ? prev->fRight : fHead;
+    this->insert(edge, prev, next);
 }
 
 static void find_enclosing_edges(Vertex* v, EdgeList* edges, Edge** left, Edge** right) {
@@ -601,42 +598,40 @@
     *right = next;
 }
 
-static void insert_edge_above(Edge* edge, Vertex* v, const Comparator& c) {
-    if (edge->fTop->fPoint == edge->fBottom->fPoint ||
-        c.sweep_lt(edge->fBottom->fPoint, edge->fTop->fPoint)) {
+void GrTriangulator::Edge::insertAbove(Vertex* v, const Comparator& c) {
+    if (fTop->fPoint == fBottom->fPoint ||
+        c.sweep_lt(fBottom->fPoint, fTop->fPoint)) {
         return;
     }
-    TESS_LOG("insert edge (%g -> %g) above vertex %g\n",
-             edge->fTop->fID, edge->fBottom->fID, v->fID);
+    TESS_LOG("insert edge (%g -> %g) above vertex %g\n", fTop->fID, fBottom->fID, v->fID);
     Edge* prev = nullptr;
     Edge* next;
     for (next = v->fFirstEdgeAbove; next; next = next->fNextEdgeAbove) {
-        if (next->isRightOf(edge->fTop)) {
+        if (next->isRightOf(fTop)) {
             break;
         }
         prev = next;
     }
     list_insert<Edge, &Edge::fPrevEdgeAbove, &Edge::fNextEdgeAbove>(
-        edge, prev, next, &v->fFirstEdgeAbove, &v->fLastEdgeAbove);
+        this, prev, next, &v->fFirstEdgeAbove, &v->fLastEdgeAbove);
 }
 
-static void insert_edge_below(Edge* edge, Vertex* v, const Comparator& c) {
-    if (edge->fTop->fPoint == edge->fBottom->fPoint ||
-        c.sweep_lt(edge->fBottom->fPoint, edge->fTop->fPoint)) {
+void GrTriangulator::Edge::insertBelow(Vertex* v, const Comparator& c) {
+    if (fTop->fPoint == fBottom->fPoint ||
+        c.sweep_lt(fBottom->fPoint, fTop->fPoint)) {
         return;
     }
-    TESS_LOG("insert edge (%g -> %g) below vertex %g\n",
-             edge->fTop->fID, edge->fBottom->fID, v->fID);
+    TESS_LOG("insert edge (%g -> %g) below vertex %g\n", fTop->fID, fBottom->fID, v->fID);
     Edge* prev = nullptr;
     Edge* next;
     for (next = v->fFirstEdgeBelow; next; next = next->fNextEdgeBelow) {
-        if (next->isRightOf(edge->fBottom)) {
+        if (next->isRightOf(fBottom)) {
             break;
         }
         prev = next;
     }
     list_insert<Edge, &Edge::fPrevEdgeBelow, &Edge::fNextEdgeBelow>(
-        edge, prev, next, &v->fFirstEdgeBelow, &v->fLastEdgeBelow);
+        this, prev, next, &v->fFirstEdgeBelow, &v->fLastEdgeBelow);
 }
 
 static void remove_edge_above(Edge* edge) {
@@ -655,10 +650,9 @@
         edge, &edge->fTop->fFirstEdgeBelow, &edge->fTop->fLastEdgeBelow);
 }
 
-static void disconnect(Edge* edge)
-{
-    remove_edge_above(edge);
-    remove_edge_below(edge);
+void GrTriangulator::Edge::disconnect() {
+    remove_edge_above(this);
+    remove_edge_below(this);
 }
 
 static void merge_collinear_edges(Edge* edge, EdgeList* activeEdges, Vertex** current,
@@ -673,11 +667,11 @@
     while (v != dst) {
         v = v->fPrev;
         for (Edge* e = v->fFirstEdgeBelow; e; e = e->fNextEdgeBelow) {
-            remove_edge(e, activeEdges);
+            activeEdges->remove(e);
         }
         Edge* leftEdge = v->fLeftEnclosingEdge;
         for (Edge* e = v->fFirstEdgeAbove; e; e = e->fNextEdgeAbove) {
-            insert_edge(e, leftEdge, activeEdges);
+            activeEdges->insert(e, leftEdge);
             leftEdge = e;
             Vertex* top = e->fTop;
             if (c.sweep_lt(top->fPoint, dst->fPoint) &&
@@ -733,7 +727,7 @@
     remove_edge_below(edge);
     edge->fTop = v;
     edge->recompute();
-    insert_edge_below(edge, v, c);
+    edge->insertBelow(v, c);
     rewind_if_necessary(edge, activeEdges, current, c);
     merge_collinear_edges(edge, activeEdges, current, c);
 }
@@ -743,7 +737,7 @@
     remove_edge_above(edge);
     edge->fBottom = v;
     edge->recompute();
-    insert_edge_above(edge, v, c);
+    edge->insertAbove(v, c);
     rewind_if_necessary(edge, activeEdges, current, c);
     merge_collinear_edges(edge, activeEdges, current, c);
 }
@@ -756,7 +750,7 @@
                  edge->fBottom->fPoint.fX, edge->fBottom->fPoint.fY);
         rewind(activeEdges, current, edge->fTop, c);
         other->fWinding += edge->fWinding;
-        disconnect(edge);
+        edge->disconnect();
         edge->fTop = edge->fBottom = nullptr;
     } else if (c.sweep_lt(edge->fTop->fPoint, other->fTop->fPoint)) {
         rewind(activeEdges, current, edge->fTop, c);
@@ -777,7 +771,7 @@
                  edge->fBottom->fPoint.fX, edge->fBottom->fPoint.fY);
         rewind(activeEdges, current, edge->fTop, c);
         other->fWinding += edge->fWinding;
-        disconnect(edge);
+        edge->disconnect();
         edge->fTop = edge->fBottom = nullptr;
     } else if (c.sweep_lt(edge->fBottom->fPoint, other->fBottom->fPoint)) {
         rewind(activeEdges, current, other->fTop, c);
@@ -851,8 +845,8 @@
         set_bottom(edge, v, activeEdges, current, c);
     }
     Edge* newEdge = fAlloc.make<Edge>(top, bottom, winding, edge->fType);
-    insert_edge_below(newEdge, top, c);
-    insert_edge_above(newEdge, bottom, c);
+    newEdge->insertBelow(top, c);
+    newEdge->insertAbove(bottom, c);
     merge_collinear_edges(newEdge, activeEdges, current, c);
     return true;
 }
@@ -896,8 +890,8 @@
         return nullptr;
     }
     Edge* edge = this->makeEdge(prev, next, type, c);
-    insert_edge_below(edge, edge->fTop, c);
-    insert_edge_above(edge, edge->fBottom, c);
+    edge->insertBelow(edge->fTop, c);
+    edge->insertAbove(edge->fBottom, c);
     edge->fWinding *= windingScale;
     merge_collinear_edges(edge, nullptr, nullptr, c);
     return edge;
@@ -1181,8 +1175,8 @@
 }
 
 #if TRIANGULATOR_LOGGING
-static void dump_mesh(const VertexList& mesh) {
-    for (Vertex* v = mesh.fHead; v; v = v->fNext) {
+void VertexList::dump() {
+    for (Vertex* v = fHead; v; v = v->fNext) {
         TESS_LOG("vertex %g (%g, %g) alpha %d", v->fID, v->fPoint.fX, v->fPoint.fY, v->fAlpha);
         if (Vertex* p = v->fPartner) {
             TESS_LOG(", partner %g (%g, %g) alpha %d\n",
@@ -1256,16 +1250,12 @@
 
 // Stage 4: Simplify the mesh by inserting new vertices at intersecting edges.
 
-static bool connected(Vertex* v) {
-    return v->fFirstEdgeAbove || v->fFirstEdgeBelow;
-}
-
 GrTriangulator::SimplifyResult GrTriangulator::simplify(VertexList* mesh, const Comparator& c) {
     TESS_LOG("simplifying complex polygons\n");
     EdgeList activeEdges;
     auto result = SimplifyResult::kAlreadySimple;
     for (Vertex* v = mesh->fHead; v != nullptr; v = v->fNext) {
-        if (!connected(v)) {
+        if (!v->isConnected()) {
             continue;
         }
         Edge* leftEnclosingEdge;
@@ -1308,11 +1298,11 @@
         validate_edge_list(&activeEdges, c);
 #endif
         for (Edge* e = v->fFirstEdgeAbove; e; e = e->fNextEdgeAbove) {
-            remove_edge(e, &activeEdges);
+            activeEdges.remove(e);
         }
         Edge* leftEdge = leftEnclosingEdge;
         for (Edge* e = v->fFirstEdgeBelow; e; e = e->fNextEdgeBelow) {
-            insert_edge(e, leftEdge, &activeEdges);
+            activeEdges.insert(e, leftEdge);
             leftEdge = e;
         }
     }
@@ -1331,7 +1321,7 @@
     EdgeList activeEdges;
     Poly* polys = nullptr;
     for (Vertex* v = vertices.fHead; v != nullptr; v = v->fNext) {
-        if (!connected(v)) {
+        if (!v->isConnected()) {
             continue;
         }
 #if TRIANGULATOR_LOGGING
@@ -1374,7 +1364,7 @@
             }
             for (Edge* e = v->fFirstEdgeAbove; e != v->fLastEdgeAbove; e = e->fNextEdgeAbove) {
                 Edge* rightEdge = e->fNextEdgeAbove;
-                remove_edge(e, &activeEdges);
+                activeEdges.remove(e);
                 if (e->fRightPoly) {
                     e->fRightPoly->addEdge(e, kLeft_Side, fAlloc);
                 }
@@ -1382,7 +1372,7 @@
                     rightEdge->fLeftPoly->addEdge(e, kRight_Side, fAlloc);
                 }
             }
-            remove_edge(v->fLastEdgeAbove, &activeEdges);
+            activeEdges.remove(v->fLastEdgeAbove);
             if (!v->fFirstEdgeBelow) {
                 if (leftPoly && rightPoly && leftPoly != rightPoly) {
                     SkASSERT(leftPoly->fPartner == nullptr && rightPoly->fPartner == nullptr);
@@ -1413,10 +1403,10 @@
             }
             Edge* leftEdge = v->fFirstEdgeBelow;
             leftEdge->fLeftPoly = leftPoly;
-            insert_edge(leftEdge, leftEnclosingEdge, &activeEdges);
+            activeEdges.insert(leftEdge, leftEnclosingEdge);
             for (Edge* rightEdge = leftEdge->fNextEdgeBelow; rightEdge;
                  rightEdge = rightEdge->fNextEdgeBelow) {
-                insert_edge(rightEdge, leftEdge, &activeEdges);
+                activeEdges.insert(rightEdge, leftEdge);
                 int winding = leftEdge->fLeftPoly ? leftEdge->fLeftPoly->fWinding : 0;
                 winding += leftEdge->fWinding;
                 if (winding != 0) {
@@ -1447,7 +1437,7 @@
     TESS_LOG("removing non-boundary edges\n");
     EdgeList activeEdges;
     for (Vertex* v = mesh.fHead; v != nullptr; v = v->fNext) {
-        if (!connected(v)) {
+        if (!v->isConnected()) {
             continue;
         }
         Edge* leftEnclosingEdge;
@@ -1457,10 +1447,10 @@
                           apply_fill_type(fPath.getFillType(), leftEnclosingEdge->fWinding);
         for (Edge* e = v->fFirstEdgeAbove; e;) {
             Edge* next = e->fNextEdgeAbove;
-            remove_edge(e, &activeEdges);
+            activeEdges.remove(e);
             bool filled = apply_fill_type(fPath.getFillType(), e->fWinding);
             if (filled == prevFilled) {
-                disconnect(e);
+                e->disconnect();
             }
             prevFilled = filled;
             e = next;
@@ -1470,7 +1460,7 @@
             if (prev) {
                 e->fWinding += prev->fWinding;
             }
-            insert_edge(e, prev, &activeEdges);
+            activeEdges.insert(e, prev);
             prev = e;
         }
     }
@@ -1499,8 +1489,8 @@
         get_edge_normal(e, &normal);
         constexpr double kQuarterPixelSq = 0.25f * 0.25f;
         if (prev == next) {
-            remove_edge(prevEdge, boundary);
-            remove_edge(e, boundary);
+            boundary->remove(prevEdge);
+            boundary->remove(e);
             prevEdge = boundary->fTail;
             e = boundary->fHead;
             if (prevEdge) {
@@ -1513,9 +1503,9 @@
                 join->fLine.normalize();
                 join->fLine = join->fLine * join->fWinding;
             }
-            insert_edge(join, e, boundary);
-            remove_edge(prevEdge, boundary);
-            remove_edge(e, boundary);
+            boundary->insert(join, e);
+            boundary->remove(prevEdge);
+            boundary->remove(e);
             if (join->fLeft && join->fRight) {
                 prevEdge = join->fLeft;
                 e = join;
@@ -1618,7 +1608,7 @@
     SSVertexMap ssVertices;
     SSEdgeList ssEdges;
     for (Vertex* v = mesh->fHead; v != nullptr; v = v->fNext) {
-        if (!connected(v)) {
+        if (!v->isConnected()) {
             continue;
         }
         Edge* leftEnclosingEdge;
@@ -1626,7 +1616,7 @@
         find_enclosing_edges(v, &activeEdges, &leftEnclosingEdge, &rightEnclosingEdge);
         for (Edge* e = v->fLastEdgeAbove; e && e != leftEnclosingEdge;) {
             Edge* prev = e->fPrevEdgeAbove ? e->fPrevEdgeAbove : leftEnclosingEdge;
-            remove_edge(e, &activeEdges);
+            activeEdges.remove(e);
             bool leftOverlap = prev && is_overlap_edge(prev);
             bool rightOverlap = is_overlap_edge(e);
             bool isOuterBoundary = e->fType == EdgeType::kOuter &&
@@ -1637,7 +1627,7 @@
             if (leftOverlap && rightOverlap) {
                 TESS_LOG("found interior overlap edge %g -> %g, disconnecting\n",
                          e->fTop->fID, e->fBottom->fID);
-                disconnect(e);
+                e->disconnect();
             } else if (leftOverlap || rightOverlap) {
                 TESS_LOG("found overlap edge %g -> %g%s\n",
                          e->fTop->fID, e->fBottom->fID,
@@ -1658,7 +1648,7 @@
                 ssPrev->fNext = ssNext->fPrev = ssEdge;
                 this->makeEvent(ssEdge, &events);
                 if (!isOuterBoundary) {
-                    disconnect(e);
+                    e->disconnect();
                 }
             }
             e = prev;
@@ -1668,7 +1658,7 @@
             if (prev) {
                 e->fWinding += prev->fWinding;
             }
-            insert_edge(e, prev, &activeEdges);
+            activeEdges.insert(e, prev);
             prev = e;
         }
     }
@@ -1893,7 +1883,7 @@
                 down = true;
             }
         }
-        disconnect(e);
+        e->disconnect();
         e = next;
     } while (e && (down ? e->fTop : e->fBottom) != start);
 }