// Triangulate an unimonotone chain. bool TriangulateMonotone(Vertex *first, Vertex *last, SkTDArray<SkPoint> *triangles) { DebugPrintf("TriangulateMonotone()\n"); size_t numVertices = CountVertices(first, last); if (numVertices == kMaxCount) { FailureMessage("Way too many vertices: %d:\n", numVertices); PrintLinkedVertices(numVertices, first); return false; } Vertex *start = first; // First find the point with the smallest Y. DebugPrintf("TriangulateMonotone: finding bottom\n"); int count = kMaxCount; // Maximum number of vertices. for (Vertex *v = first->next(); v != first && count-- > 0; v = v->next()) if (v->point() < start->point()) start = v; if (count <= 0) { FailureMessage("TriangulateMonotone() was given disjoint chain\n"); return false; // Something went wrong. } // Start at the far end of the long edge. if (start->prev()->point() < start->next()->point()) start = start->next(); Vertex *current = start->next(); while (numVertices >= 3) { if (current->angleIsConvex()) { DebugPrintf("Angle %p is convex\n", current); // Print the vertices PrintLinkedVertices(numVertices, start); appendTriangleAtVertex(current, triangles); if (triangles->count() > kMaxCount * 3) { FailureMessage("An extraordinarily large number of triangles " "were generated\n"); return false; } Vertex *save = current->prev(); current->delink(); current = (save == start || save == start->prev()) ? start->next() : save; --numVertices; } else { if (numVertices == 3) { FailureMessage("Convexity error in TriangulateMonotone()\n"); appendTriangleAtVertex(current, triangles); return false; } DebugPrintf("Angle %p is concave\n", current); current = current->next(); } } return true; }