blob: 1c9c1439cfc0bbffeaf2b87f9c2486c23144a5f8 [file] [log] [blame]
/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrTriangulator_DEFINED
#define GrTriangulator_DEFINED
#include "include/core/SkPoint.h"
#include "include/private/SkColorData.h"
#include "src/gpu/GrColor.h"
class GrEagerVertexAllocator;
class SkPath;
struct SkRect;
/**
* Provides utility functions for converting paths to a collection of triangles.
*/
#define TRIANGULATOR_WIREFRAME 0
namespace GrTriangulator {
struct WindingVertex {
SkPoint fPos;
int fWinding;
};
// Triangulates a path to an array of vertices. Each triangle is represented as a set of three
// WindingVertex entries, each of which contains the position and winding count (which is the same
// for all three vertices of a triangle). The 'verts' out parameter is set to point to the resultant
// vertex array. CALLER IS RESPONSIBLE for deleting this buffer to avoid a memory leak!
int PathToVertices(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds,
WindingVertex** verts);
enum class Mode {
kNormal,
// Surround path edges with coverage ramps for antialiasing.
kEdgeAntialias,
// Triangulate only each contour's inner polygon. The inner polygons connect the endpoints of
// each verb. (i.e., they are the path that would result from collapsing all curves to single
// lines.)
//
// If the inner polygons are not simple (e.g., self intersection, double winding), then the
// tessellator aborts and returns 0.
kSimpleInnerPolygons
};
constexpr size_t GetVertexStride(Mode mode) {
return sizeof(SkPoint) + ((Mode::kEdgeAntialias == mode) ? sizeof(float) : 0);
}
int PathToTriangles(const SkPath& path, SkScalar tolerance, const SkRect& clipBounds,
GrEagerVertexAllocator*, Mode, int* numCountedCurves);
}
#endif