8 #include "third_party/libtess2/Include/tesselator.h"
12 static void*
HeapAlloc(
void* userData,
unsigned int size) {
16 static void*
HeapRealloc(
void* userData,
void* ptr,
unsigned int size) {
17 return realloc(ptr, size);
20 static void HeapFree(
void* userData,
void* ptr) {
41 c_tessellator_ = std::move(tessellator);
50 return TESS_WINDING_ODD;
52 return TESS_WINDING_NONZERO;
54 return TESS_WINDING_ODD;
65 size_t size()
const {
return end -
start; }
68 void Write(
Point point)
override {
points.emplace_back(point); }
70 void EndContour()
override {
71 size_t contour_end =
points.size();
72 contours.push_back({contour_start_, contour_end});
73 contour_start_ = contour_end;
80 size_t contour_start_ = 0u;
98 if (polyline.points.empty()) {
102 auto tessellator = c_tessellator_.get();
107 constexpr
int kVertexSize = 2;
108 constexpr
int kPolygonSize = 3;
113 static_assert(
sizeof(
Point) == 2 *
sizeof(
float));
114 for (
auto contour : polyline.contours) {
115 ::tessAddContour(tessellator,
117 polyline.points.data() + contour.start,
126 auto result = ::tessTesselate(tessellator,
138 int element_item_count = tessGetElementCount(tessellator) * kPolygonSize;
145 if (element_item_count < USHRT_MAX) {
146 int vertex_item_count = tessGetVertexCount(tessellator);
147 auto vertices = tessGetVertices(tessellator);
148 auto elements = tessGetElements(tessellator);
152 std::vector<uint16_t> indices(element_item_count);
153 for (
int i = 0; i < element_item_count; i++) {
154 indices[i] =
static_cast<uint16_t
>(elements[i]);
156 if (!callback(vertices, vertex_item_count, indices.data(),
157 element_item_count)) {
161 std::vector<Point>
points;
162 std::vector<float>
data;
164 int vertex_item_count = tessGetVertexCount(tessellator) * kVertexSize;
165 auto vertices = tessGetVertices(tessellator);
166 points.reserve(vertex_item_count);
167 for (
int i = 0; i < vertex_item_count; i += 2) {
168 points.emplace_back(vertices[i], vertices[i + 1]);
171 int element_item_count = tessGetElementCount(tessellator) * kPolygonSize;
172 auto elements = tessGetElements(tessellator);
173 data.reserve(element_item_count);
174 for (
int i = 0; i < element_item_count; i++) {
178 if (!callback(
data.data(), element_item_count,
nullptr, 0u)) {
187 if (tessellator !=
nullptr) {
188 ::tessDeleteTess(tessellator);
virtual FillType GetFillType() const =0
An interface for generating a multi contour polyline as a triangle strip.
static void PathToFilledVertices(const PathSource &source, VertexWriter &writer, Scalar scale)
std::function< bool(const float *vertices, size_t vertices_count, const uint16_t *indices, size_t indices_count)> BuilderCallback
A callback that returns the results of the tessellation.
TessellatorLibtess::Result Tessellate(const PathSource &source, Scalar tolerance, const BuilderCallback &callback)
Generates filled triangles from the path. A callback is invoked once for the entire tessellation.
static void * HeapRealloc(void *userData, void *ptr, unsigned int size)
void DestroyTessellator(TESStesselator *tessellator)
static void * HeapAlloc(void *userData, unsigned int size)
std::unique_ptr< TESStesselator, decltype(&DestroyTessellator)> CTessellator
static int ToTessWindingRule(FillType fill_type)
static void HeapFree(void *userData, void *ptr)
static const TESSalloc kAlloc
std::vector< Point > points
std::vector< Contour > contours
std::shared_ptr< const fml::Mapping > data