blob: ed386b36683ecebb7227d02d219bcb37a8d65e80 [file] [log] [blame]
* Copyright 2021 Google LLC
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
#ifndef GrInnerFanTriangulator_DEFINED
#define GrInnerFanTriangulator_DEFINED
#include "src/gpu/geometry/GrTriangulator.h"
// Triangulates the inner polygon(s) of a path (i.e., the triangle fan for a Redbook rendering
// method). When combined with the outer curves and breadcrumb triangles, these produce a complete
// path. If a breadcrumbCollector is not provided, pathToPolys fails upon self intersection.
class GrInnerFanTriangulator : private GrTriangulator {
using GrTriangulator::BreadcrumbTriangleList;
GrInnerFanTriangulator(const SkPath& path, SkArenaAlloc* alloc)
: GrTriangulator(path, alloc) {
fPreserveCollinearVertices = true;
fCollectBreadcrumbTriangles = true;
int pathToTriangles(GrEagerVertexAllocator* vertexAlloc, BreadcrumbTriangleList* breadcrumbList,
bool* isLinear) {
Poly* polys = this->pathToPolys(breadcrumbList, isLinear);
return this->polysToTriangles(polys, vertexAlloc, breadcrumbList);
Poly* pathToPolys(BreadcrumbTriangleList* breadcrumbList, bool* isLinear) {
auto [ polys, success ] = this->GrTriangulator::pathToPolys(0, SkRect::MakeEmpty(),
if (!success) {
return nullptr;
return polys;
int polysToTriangles(Poly* polys, GrEagerVertexAllocator* vertexAlloc,
BreadcrumbTriangleList* breadcrumbList) const {
int vertexCount = this->GrTriangulator::polysToTriangles(polys, vertexAlloc);
return vertexCount;