5 #include "flutter/testing/testing.h"
6 #include "gtest/gtest.h"
16 TEST(TessellatorTest, TessellatorBuilderReturnsCorrectResultStatus) {
23 [](
const float* vertices,
size_t vertices_count,
24 const uint16_t* indices,
size_t indices_count) {
return true; });
35 [](
const float* vertices,
size_t vertices_count,
36 const uint16_t* indices,
size_t indices_count) {
return true; });
48 [](
const float* vertices,
size_t vertices_count,
49 const uint16_t* indices,
size_t indices_count) {
return true; });
58 for (
int i = 0; i < 1000; i++) {
59 auto coord = i * 1.0f;
60 builder.
AddLine({coord, coord}, {coord + 1, coord + 1});
65 [](
const float* vertices,
size_t vertices_count,
66 const uint16_t* indices,
size_t indices_count) {
return true; });
78 [](
const float* vertices,
size_t vertices_count,
79 const uint16_t* indices,
size_t indices_count) {
return false; });
88 for (
auto i = 0; i < 1000; i++) {
92 bool no_indices =
false;
96 [&no_indices, &count](
const float* vertices,
size_t vertices_count,
97 const uint16_t* indices,
size_t indices_count) {
98 no_indices = indices ==
nullptr;
99 count = vertices_count;
103 ASSERT_TRUE(no_indices);
104 ASSERT_TRUE(count >= USHRT_MAX);
109 TEST(TessellatorTest, TessellateConvex) {
116 std::vector<Point> expected = {
117 {0, 0}, {10, 0}, {0, 10}, {10, 10},
119 EXPECT_EQ(pts, expected);
130 std::vector<Point> expected = {{0, 0}, {10, 0}, {0, 10}, {10, 10},
131 {10, 10}, {20, 20}, {20, 20}, {30, 20},
133 EXPECT_EQ(pts, expected);
137 TEST(TessellatorTest, CircleVertexCounts) {
138 auto tessellator = std::make_shared<Tessellator>();
140 auto test = [&tessellator](
const Matrix& transform,
Scalar radius) {
141 auto generator = tessellator->FilledCircle(transform, {}, radius);
142 size_t quadrant_divisions = generator.GetVertexCount() / 4;
147 double angle =
kPiOver2 / quadrant_divisions;
148 Point first = {radius, 0};
149 Point next = {
static_cast<Scalar>(cos(angle) * radius),
150 static_cast<Scalar>(sin(angle) * radius)};
151 Point midpoint = (first + next) * 0.5;
154 <<
", transform = " << transform <<
", radius = " << radius
155 <<
", divisions = " << quadrant_divisions;
168 for (
int i = 36; i < 10000; i += 4) {
173 TEST(TessellatorTest, FilledCircleTessellationVertices) {
174 auto tessellator = std::make_shared<Tessellator>();
176 auto test = [&tessellator](
const Matrix& transform,
const Point& center,
178 auto generator = tessellator->FilledCircle(transform, center, radius);
181 auto vertex_count = generator.GetVertexCount();
182 auto vertices = std::vector<Point>();
183 generator.GenerateVertices([&vertices](
const Point& p) {
184 vertices.push_back(p);
186 EXPECT_EQ(vertices.size(), vertex_count);
187 ASSERT_EQ(vertex_count % 4, 0u);
189 auto quadrant_count = vertex_count / 4;
190 for (
size_t i = 0; i < quadrant_count; i++) {
191 double angle =
kPiOver2 * i / (quadrant_count - 1);
192 double degrees = angle * 180.0 /
kPi;
193 double rsin = sin(angle) * radius;
194 double rcos = cos(angle) * radius;
196 Point(center.x - rcos, center.y + rsin))
197 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
199 Point(center.x - rcos, center.y - rsin))
200 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
202 Point(center.x + rcos, center.y - rsin))
203 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
205 Point(center.x + rcos, center.y + rsin))
206 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
211 test({}, {10, 10}, 2.0);
216 TEST(TessellatorTest, StrokedCircleTessellationVertices) {
217 auto tessellator = std::make_shared<Tessellator>();
219 auto test = [&tessellator](
const Matrix& transform,
const Point& center,
221 ASSERT_GT(radius, half_width);
223 tessellator->StrokedCircle(transform, center, radius, half_width);
226 auto vertex_count = generator.GetVertexCount();
227 auto vertices = std::vector<Point>();
228 generator.GenerateVertices([&vertices](
const Point& p) {
229 vertices.push_back(p);
231 EXPECT_EQ(vertices.size(), vertex_count);
232 ASSERT_EQ(vertex_count % 4, 0u);
234 auto quadrant_count = vertex_count / 8;
237 for (
size_t i = 0; i < quadrant_count; i++) {
238 double angle =
kPiOver2 * i / (quadrant_count - 1);
239 double degrees = angle * 180.0 /
kPi;
240 double rsin = sin(angle) * (radius + half_width);
241 double rcos = cos(angle) * (radius + half_width);
243 Point(center.x - rcos, center.y - rsin))
244 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
246 Point(center.x + rsin, center.y - rcos))
247 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
249 Point(center.x + rcos, center.y + rsin))
250 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
252 Point(center.x - rsin, center.y + rcos))
253 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
257 for (
size_t i = 0; i < quadrant_count; i++) {
258 double angle =
kPiOver2 * i / (quadrant_count - 1);
259 double degrees = angle * 180.0 /
kPi;
260 double rsin = sin(angle) * (radius - half_width);
261 double rcos = cos(angle) * (radius - half_width);
263 Point(center.x - rcos, center.y - rsin))
264 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
266 Point(center.x + rsin, center.y - rcos))
267 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
269 Point(center.x + rcos, center.y + rsin))
270 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
272 Point(center.x - rsin, center.y + rcos))
273 <<
"vertex " << i <<
", angle = " << degrees << std::endl;
277 test({}, {}, 2.0, 1.0);
278 test({}, {}, 2.0, 0.5);
279 test({}, {10, 10}, 2.0, 1.0);
284 TEST(TessellatorTest, RoundCapLineTessellationVertices) {
285 auto tessellator = std::make_shared<Tessellator>();
287 auto test = [&tessellator](
const Matrix& transform,
const Point& p0,
289 auto generator = tessellator->RoundCapLine(transform, p0, p1, radius);
292 auto vertex_count = generator.GetVertexCount();
293 auto vertices = std::vector<Point>();
294 generator.GenerateVertices([&vertices](
const Point& p) {
295 vertices.push_back(p);
297 EXPECT_EQ(vertices.size(), vertex_count);
298 ASSERT_EQ(vertex_count % 4, 0u);
300 Point along = p1 - p0;
303 along *= radius / length;
307 Point across = {-along.
y, along.
x};
309 auto quadrant_count = vertex_count / 4;
310 for (
size_t i = 0; i < quadrant_count; i++) {
311 double angle =
kPiOver2 * i / (quadrant_count - 1);
312 double degrees = angle * 180.0 /
kPi;
313 Point relative_along = along * cos(angle);
314 Point relative_across = across * sin(angle);
316 p0 - relative_along + relative_across)
317 <<
"vertex " << i <<
", angle = " << degrees <<
", "
318 <<
"line = " << p0 <<
" => " << p1 <<
", "
319 <<
"radius = " << radius << std::endl;
321 p0 - relative_along - relative_across)
322 <<
"vertex " << i <<
", angle = " << degrees <<
", "
323 <<
"line = " << p0 <<
" => " << p1 <<
", "
324 <<
"radius = " << radius << std::endl;
326 p1 + relative_along - relative_across)
327 <<
"vertex " << i <<
", angle = " << degrees <<
", "
328 <<
"line = " << p0 <<
" => " << p1 <<
", "
329 <<
"radius = " << radius << std::endl;
331 p1 + relative_along + relative_across)
332 <<
"vertex " << i <<
", angle = " << degrees <<
", "
333 <<
"line = " << p0 <<
" => " << p1 <<
", "
334 <<
"radius = " << radius << std::endl;
340 test({}, {0, 0}, {0, 0}, 10);
342 test({}, {0, 0}, {10, 0}, 2);
343 test({}, {10, 0}, {0, 0}, 2);
344 test({}, {0, 0}, {10, 10}, 2);
355 TEST(TessellatorTest, FilledEllipseTessellationVertices) {
356 auto tessellator = std::make_shared<Tessellator>();
358 auto test = [&tessellator](
const Matrix& transform,
const Rect& bounds) {
359 auto center = bounds.GetCenter();
360 auto half_size = bounds.GetSize() * 0.5f;
362 auto generator = tessellator->FilledEllipse(transform, bounds);
365 auto vertex_count = generator.GetVertexCount();
366 auto vertices = std::vector<Point>();
367 generator.GenerateVertices([&vertices](
const Point& p) {
368 vertices.push_back(p);
370 EXPECT_EQ(vertices.size(), vertex_count);
371 ASSERT_EQ(vertex_count % 4, 0u);
373 auto quadrant_count = vertex_count / 4;
374 for (
size_t i = 0; i < quadrant_count; i++) {
375 double angle =
kPiOver2 * i / (quadrant_count - 1);
376 double degrees = angle * 180.0 /
kPi;
377 double rcos = cos(angle) * half_size.width;
378 double rsin = sin(angle) * half_size.height;
380 Point(center.x - rcos, center.y + rsin))
381 <<
"vertex " << i <<
", angle = " << degrees <<
", "
382 <<
"bounds = " << bounds << std::endl;
384 Point(center.x - rcos, center.y - rsin))
385 <<
"vertex " << i <<
", angle = " << degrees <<
", "
386 <<
"bounds = " << bounds << std::endl;
388 Point(center.x + rcos, center.y - rsin))
389 <<
"vertex " << i <<
", angle = " << degrees <<
", "
390 <<
"bounds = " << bounds << std::endl;
392 Point(center.x + rcos, center.y + rsin))
393 <<
"vertex " << i <<
", angle = " << degrees <<
", "
394 <<
"bounds = " << bounds << std::endl;
414 TEST(TessellatorTest, FilledRoundRectTessellationVertices) {
415 auto tessellator = std::make_shared<Tessellator>();
417 auto test = [&tessellator](
const Matrix& transform,
const Rect& bounds,
419 FML_DCHECK(radii.width * 2 <= bounds.GetWidth()) << radii << bounds;
420 FML_DCHECK(radii.height * 2 <= bounds.GetHeight()) << radii << bounds;
422 Scalar middle_left = bounds.GetX() + radii.width;
423 Scalar middle_top = bounds.GetY() + radii.height;
424 Scalar middle_right = bounds.GetX() + bounds.GetWidth() - radii.width;
425 Scalar middle_bottom = bounds.GetY() + bounds.GetHeight() - radii.height;
427 auto generator = tessellator->FilledRoundRect(transform, bounds, radii);
430 auto vertex_count = generator.GetVertexCount();
431 auto vertices = std::vector<Point>();
432 generator.GenerateVertices([&vertices](
const Point& p) {
433 vertices.push_back(p);
435 EXPECT_EQ(vertices.size(), vertex_count);
436 ASSERT_EQ(vertex_count % 4, 0u);
438 auto quadrant_count = vertex_count / 4;
439 for (
size_t i = 0; i < quadrant_count; i++) {
440 double angle =
kPiOver2 * i / (quadrant_count - 1);
441 double degrees = angle * 180.0 /
kPi;
442 double rcos = cos(angle) * radii.width;
443 double rsin = sin(angle) * radii.height;
445 Point(middle_left - rcos, middle_bottom + rsin))
446 <<
"vertex " << i <<
", angle = " << degrees <<
", "
447 <<
"bounds = " << bounds << std::endl;
449 Point(middle_left - rcos, middle_top - rsin))
450 <<
"vertex " << i <<
", angle = " << degrees <<
", "
451 <<
"bounds = " << bounds << std::endl;
453 Point(middle_right + rcos, middle_top - rsin))
454 <<
"vertex " << i <<
", angle = " << degrees <<
", "
455 <<
"bounds = " << bounds << std::endl;
457 Point(middle_right + rcos, middle_bottom + rsin))
458 <<
"vertex " << i <<
", angle = " << degrees <<
", "
459 <<
"bounds = " << bounds << std::endl;