7 #include "flutter/display_list/geometry/dl_path_builder.h"
8 #include "flutter/testing/testing.h"
9 #include "gtest/gtest.h"
18 #include "impeller/renderer/testing/mocks.h"
21 std::vector<impeller::Point> a,
22 std::vector<impeller::Point>
b) {
23 if (a.size() !=
b.size()) {
24 return ::testing::AssertionFailure() <<
"Colors length does not match";
26 for (
auto i = 0u; i <
b.size(); i++) {
28 return ::testing::AssertionFailure() <<
"Positions are not equal.";
31 return ::testing::AssertionSuccess();
35 std::vector<impeller::TextureFillVertexShader::PerVertexData> a,
36 std::vector<impeller::TextureFillVertexShader::PerVertexData>
b) {
37 if (a.size() !=
b.size()) {
38 return ::testing::AssertionFailure() <<
"Colors length does not match";
40 for (
auto i = 0u; i <
b.size(); i++) {
41 if (!
PointNear(a[i].position,
b[i].position)) {
42 return ::testing::AssertionFailure() <<
"Positions are not equal.";
44 if (!
PointNear(a[i].texture_coords,
b[i].texture_coords)) {
45 return ::testing::AssertionFailure() <<
"Texture coords are not equal.";
48 return ::testing::AssertionSuccess();
51 #define EXPECT_SOLID_VERTICES_NEAR(a, b) \
52 EXPECT_PRED2(&::SolidVerticesNear, a, b)
53 #define EXPECT_TEXTURE_VERTICES_NEAR(a, b) \
54 EXPECT_PRED2(&::TextureVerticesNear, a, b)
67 return StrokePathGeometry::GenerateSolidStrokeVertices(
68 tessellator, path, stroke, scale);
74 TEST(EntityGeometryTest, RectGeometryCoversArea) {
76 ASSERT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(0, 0, 100, 100)));
77 ASSERT_FALSE(geometry->CoversArea({},
Rect::MakeLTRB(-1, 0, 100, 100)));
78 ASSERT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(1, 1, 100, 100)));
79 ASSERT_TRUE(geometry->CoversArea({},
Rect()));
82 TEST(EntityGeometryTest, FillRectGeometryPaddingIsAdjustedByInverseMaxBasis) {
89 EXPECT_TRUE(coverage.has_value());
90 if (coverage.has_value()) {
100 EXPECT_TRUE(coverage.has_value());
101 if (coverage.has_value()) {
102 EXPECT_EQ(coverage.value(),
Rect::MakeLTRB(-0.5, -0.5, 100.5, 100.5)
112 EXPECT_TRUE(coverage.has_value());
113 if (coverage.has_value()) {
114 EXPECT_EQ(coverage.value(),
Rect::MakeLTRB(-2.0, -2.0, 102.0, 102.0)
120 TEST(EntityGeometryTest, FillPathGeometryCoversArea) {
121 auto path = flutter::DlPathBuilder{}
126 ASSERT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(0, 0, 100, 100)));
127 ASSERT_FALSE(geometry->CoversArea({},
Rect::MakeLTRB(-1, 0, 100, 100)));
128 ASSERT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(1, 1, 100, 100)));
129 ASSERT_TRUE(geometry->CoversArea({},
Rect()));
132 TEST(EntityGeometryTest, FillPathGeometryCoversAreaNoInnerRect) {
133 auto path = flutter::DlPathBuilder{}
137 ASSERT_FALSE(geometry->CoversArea({},
Rect::MakeLTRB(0, 0, 100, 100)));
138 ASSERT_FALSE(geometry->CoversArea({},
Rect::MakeLTRB(-1, 0, 100, 100)));
139 ASSERT_FALSE(geometry->CoversArea({},
Rect::MakeLTRB(1, 1, 100, 100)));
140 ASSERT_FALSE(geometry->CoversArea({},
Rect()));
143 TEST(EntityGeometryTest, FillArcGeometryCoverage) {
151 for (
int sweep = 360; sweep <= 720; sweep += 30) {
153 "start: " + std::to_string(
start) +
" + " + std::to_string(sweep);
156 EXPECT_EQ(geometry->GetCoverage({}), oval_bounds)
157 <<
"start: " <<
start <<
", sweep: " << sweep;
160 EXPECT_EQ(geometry->GetCoverage({}), oval_bounds)
161 <<
"start: " <<
start <<
", sweep: " << -sweep;
164 EXPECT_EQ(geometry->GetCoverage({}), oval_bounds)
165 <<
"start: " <<
start <<
", sweep: " << -sweep <<
", with center";
173 EXPECT_EQ(geometry->GetCoverage({}), oval_bounds)
174 <<
"start: " <<
start <<
" without center";
177 EXPECT_EQ(geometry->GetCoverage({}), oval_bounds)
178 <<
"start: " <<
start <<
" with center";
185 EXPECT_EQ(geometry->GetCoverage({}), oval_bounds)
186 <<
"start: " <<
start <<
" without center";
189 EXPECT_EQ(geometry->GetCoverage({}), oval_bounds)
190 <<
"start: " <<
start <<
" with center";
204 <<
"start: " <<
start - 45;
215 <<
"start: " <<
start + 45;
226 <<
"start: " <<
start + 135;
237 <<
"start: " <<
start + 225;
252 <<
"start: " <<
start - 45;
263 <<
"start: " <<
start + 45;
274 <<
"start: " <<
start + 135;
285 <<
"start: " <<
start + 225;
294 EXPECT_TRUE(geometry->GetCoverage(transform45)
296 .Contains(oval_bounds));
303 EXPECT_TRUE(geometry->GetCoverage(transform45)
305 .Contains(oval_bounds));
309 TEST(EntityGeometryTest, StrokeArcGeometryCoverage) {
329 for (
int sweep = 360; sweep <= 720; sweep += 30) {
331 "start: " + std::to_string(
start) +
" + " + std::to_string(sweep);
334 EXPECT_EQ(geometry->GetCoverage({}), expanded_bounds)
335 <<
"start: " <<
start <<
", sweep: " << sweep;
338 EXPECT_EQ(geometry->GetCoverage({}), expanded_bounds)
339 <<
"start: " <<
start <<
", sweep: " << -sweep;
341 Degrees(-sweep), square_params);
342 EXPECT_EQ(geometry->GetCoverage({}), expanded_bounds)
343 <<
"start: " <<
start <<
", sweep: " << -sweep <<
", square caps";
351 EXPECT_EQ(geometry->GetCoverage({}), expanded_bounds)
352 <<
"start: " <<
start <<
", butt caps";
355 EXPECT_EQ(geometry->GetCoverage({}), squared_bounds)
356 <<
"start: " <<
start <<
", square caps";
363 EXPECT_EQ(geometry->GetCoverage({}), expanded_bounds)
364 <<
"start: " <<
start <<
" without center";
367 EXPECT_EQ(geometry->GetCoverage({}), squared_bounds)
368 <<
"start: " <<
start <<
" with center";
382 <<
"start: " <<
start - 45;
393 <<
"start: " <<
start + 45;
404 <<
"start: " <<
start + 135;
415 <<
"start: " <<
start + 225;
431 <<
"start: " <<
start - 45;
442 <<
"start: " <<
start + 45;
453 <<
"start: " <<
start + 135;
464 <<
"start: " <<
start + 225;
474 EXPECT_TRUE(geometry->GetCoverage(transform45)
476 .Contains(expanded_bounds));
484 EXPECT_TRUE(geometry->GetCoverage(transform45)
486 .Contains(squared_bounds));
494 EXPECT_TRUE(geometry->GetCoverage(transform45)
496 .Contains(expanded_bounds));
504 EXPECT_TRUE(geometry->GetCoverage(transform45)
506 .Contains(squared_bounds));
510 TEST(EntityGeometryTest, FillRoundRectGeometryCoversArea) {
515 .top_right =
Size(2, 12),
516 .bottom_left =
Size(3, 13),
517 .bottom_right =
Size(4, 14),
522 EXPECT_TRUE(geom.CoversArea({},
Rect::MakeLTRB(103, 100, 196, 200)));
523 EXPECT_FALSE(geom.CoversArea({},
Rect::MakeLTRB(102, 100, 196, 200)));
524 EXPECT_FALSE(geom.CoversArea({},
Rect::MakeLTRB(103, 99, 196, 200)));
525 EXPECT_FALSE(geom.CoversArea({},
Rect::MakeLTRB(103, 100, 197, 200)));
526 EXPECT_FALSE(geom.CoversArea({},
Rect::MakeLTRB(103, 100, 196, 201)));
529 EXPECT_TRUE(geom.CoversArea({},
Rect::MakeLTRB(100, 112, 200, 186)));
530 EXPECT_FALSE(geom.CoversArea({},
Rect::MakeLTRB(99, 112, 200, 186)));
531 EXPECT_FALSE(geom.CoversArea({},
Rect::MakeLTRB(100, 111, 200, 186)));
532 EXPECT_FALSE(geom.CoversArea({},
Rect::MakeLTRB(100, 112, 201, 186)));
533 EXPECT_FALSE(geom.CoversArea({},
Rect::MakeLTRB(100, 112, 200, 187)));
536 TEST(EntityGeometryTest, LineGeometryCoverage) {
539 {10, 10}, {20, 10}, {.width = 2, .cap =
Cap::kButt});
540 EXPECT_EQ(geometry->GetCoverage({}),
Rect::MakeLTRB(10, 9, 20, 11));
541 EXPECT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(10, 9, 20, 11)));
547 EXPECT_EQ(geometry->GetCoverage({}),
Rect::MakeLTRB(9, 9, 21, 11));
548 EXPECT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(9, 9, 21, 11)));
553 {10, 10}, {10, 20}, {.width = 2, .cap =
Cap::kButt});
554 EXPECT_EQ(geometry->GetCoverage({}),
Rect::MakeLTRB(9, 10, 11, 20));
555 EXPECT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(9, 10, 11, 20)));
561 EXPECT_EQ(geometry->GetCoverage({}),
Rect::MakeLTRB(9, 9, 11, 21));
562 EXPECT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(9, 9, 11, 21)));
566 TEST(EntityGeometryTest, RoundRectGeometryCoversArea) {
569 EXPECT_FALSE(geometry->CoversArea({},
Rect::MakeLTRB(15, 15, 85, 85)));
570 EXPECT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(20, 20, 80, 80)));
571 EXPECT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(30, 1, 70, 99)));
572 EXPECT_TRUE(geometry->CoversArea({},
Rect::MakeLTRB(1, 30, 99, 70)));
575 TEST(EntityGeometryTest, GeometryResultHasReasonableDefaults) {
582 TEST(EntityGeometryTest, AlphaCoverageStrokePaths) {
585 ->ComputeAlphaCoverage(matrix),
588 ->ComputeAlphaCoverage(matrix),
591 ->ComputeAlphaCoverage(matrix),
594 ->ComputeAlphaCoverage(matrix),
597 ->ComputeAlphaCoverage(matrix),
600 ->ComputeAlphaCoverage(matrix),
603 ->ComputeAlphaCoverage(matrix),
607 TEST(EntityGeometryTest, SimpleTwoLineStrokeVerticesButtCap) {
608 flutter::DlPathBuilder path_builder;
609 path_builder.MoveTo({20, 20});
610 path_builder.LineTo({30, 20});
611 path_builder.MoveTo({120, 20});
612 path_builder.LineTo({130, 20});
625 std::vector<Point> expected = {
645 EXPECT_EQ(
points, expected);
648 TEST(EntityGeometryTest, SimpleTwoLineStrokeVerticesRoundCap) {
649 flutter::DlPathBuilder path_builder;
650 path_builder.MoveTo({20, 20});
651 path_builder.LineTo({30, 20});
652 path_builder.MoveTo({120, 20});
653 path_builder.LineTo({130, 20});
666 size_t count =
points.size();
667 ASSERT_TRUE((count & 0x1) == 0x0);
675 ASSERT_EQ(
points.size(), 40u);
681 auto offset = [](
int step,
bool left,
bool backwards) ->
Point {
685 Point center = backwards ? -along : along;
686 return left ? center + across : center - across;
691 EXPECT_EQ(
points[1],
Point(20, 20) + offset(1,
true,
true));
692 EXPECT_EQ(
points[2],
Point(20, 20) + offset(1,
false,
true));
693 EXPECT_EQ(
points[3],
Point(20, 20) + offset(2,
true,
true));
694 EXPECT_EQ(
points[4],
Point(20, 20) + offset(2,
false,
true));
695 EXPECT_EQ(
points[5],
Point(20, 20) + offset(3,
true,
true));
696 EXPECT_EQ(
points[6],
Point(20, 20) + offset(3,
false,
true));
701 EXPECT_EQ(
points[11],
Point(30, 20) + offset(3,
true,
false));
702 EXPECT_EQ(
points[12],
Point(30, 20) + offset(3,
false,
false));
703 EXPECT_EQ(
points[13],
Point(30, 20) + offset(2,
true,
false));
704 EXPECT_EQ(
points[14],
Point(30, 20) + offset(2,
false,
false));
705 EXPECT_EQ(
points[15],
Point(30, 20) + offset(1,
true,
false));
706 EXPECT_EQ(
points[16],
Point(30, 20) + offset(1,
false,
false));
717 EXPECT_EQ(
points[23],
Point(120, 20) + offset(1,
true,
true));
718 EXPECT_EQ(
points[24],
Point(120, 20) + offset(1,
false,
true));
719 EXPECT_EQ(
points[25],
Point(120, 20) + offset(2,
true,
true));
720 EXPECT_EQ(
points[26],
Point(120, 20) + offset(2,
false,
true));
721 EXPECT_EQ(
points[27],
Point(120, 20) + offset(3,
true,
true));
722 EXPECT_EQ(
points[28],
Point(120, 20) + offset(3,
false,
true));
727 EXPECT_EQ(
points[33],
Point(130, 20) + offset(3,
true,
false));
728 EXPECT_EQ(
points[34],
Point(130, 20) + offset(3,
false,
false));
729 EXPECT_EQ(
points[35],
Point(130, 20) + offset(2,
true,
false));
730 EXPECT_EQ(
points[36],
Point(130, 20) + offset(2,
false,
false));
731 EXPECT_EQ(
points[37],
Point(130, 20) + offset(1,
true,
false));
732 EXPECT_EQ(
points[38],
Point(130, 20) + offset(1,
false,
false));
736 TEST(EntityGeometryTest, SimpleTwoLineStrokeVerticesSquareCap) {
737 flutter::DlPathBuilder path_builder;
738 path_builder.MoveTo({20, 20});
739 path_builder.LineTo({30, 20});
740 path_builder.MoveTo({120, 20});
741 path_builder.LineTo({130, 20});
755 std::vector<Point> expected = {
784 EXPECT_EQ(
points, expected);
787 TEST(EntityGeometryTest, TwoLineSegmentsRightTurnStrokeVerticesBevelJoin) {
788 flutter::DlPathBuilder path_builder;
789 path_builder.MoveTo({20, 20});
790 path_builder.LineTo({30, 20});
791 path_builder.LineTo({30, 30});
804 std::vector<Point> expected = {
818 EXPECT_EQ(
points, expected);
821 TEST(EntityGeometryTest, TwoLineSegmentsLeftTurnStrokeVerticesBevelJoin) {
822 flutter::DlPathBuilder path_builder;
823 path_builder.MoveTo({20, 20});
824 path_builder.LineTo({30, 20});
825 path_builder.LineTo({30, 10});
838 std::vector<Point> expected = {
852 EXPECT_EQ(
points, expected);
855 TEST(EntityGeometryTest, TwoLineSegmentsRightTurnStrokeVerticesMiterJoin) {
856 flutter::DlPathBuilder path_builder;
857 path_builder.MoveTo({20, 20});
858 path_builder.LineTo({30, 20});
859 path_builder.LineTo({30, 30});
872 std::vector<Point> expected = {
889 EXPECT_EQ(
points, expected);
892 TEST(EntityGeometryTest, TwoLineSegmentsLeftTurnStrokeVerticesMiterJoin) {
893 flutter::DlPathBuilder path_builder;
894 path_builder.MoveTo({20, 20});
895 path_builder.LineTo({30, 20});
896 path_builder.LineTo({30, 10});
909 std::vector<Point> expected = {
926 EXPECT_EQ(
points, expected);
929 TEST(EntityGeometryTest, TinyQuadGeneratesCaps) {
930 flutter::DlPathBuilder path_builder;
931 path_builder.MoveTo({20, 20});
932 path_builder.QuadraticCurveTo({20.125, 20}, {20.250, 20});
945 std::vector<Point> expected = {
963 EXPECT_EQ(
points, expected);
966 TEST(EntityGeometryTest, TinyConicGeneratesCaps) {
967 flutter::DlPathBuilder path_builder;
968 path_builder.MoveTo({20, 20});
969 path_builder.ConicCurveTo({20.125, 20}, {20.250, 20}, 0.6);
982 std::vector<Point> expected = {
1000 EXPECT_EQ(
points, expected);
1003 TEST(EntityGeometryTest, TinyCubicGeneratesCaps) {
1004 flutter::DlPathBuilder path_builder;
1005 path_builder.MoveTo({20, 20});
1006 path_builder.CubicCurveTo({20.0625, 20}, {20.125, 20}, {20.250, 20});
1015 .miter_limit = 4.0f,
1019 std::vector<Point> expected = {
1037 EXPECT_EQ(
points, expected);
1040 TEST(EntityGeometryTest, TwoLineSegmentsMiterLimit) {
1042 for (
int degrees = 10; degrees < 180; degrees += 10) {
1045 for (
int width = 2; width <= 10; width++) {
1059 Degrees between(180 - degrees);
1063 flutter::DlPathBuilder path_builder;
1064 path_builder.MoveTo(
Point(20, 20));
1065 path_builder.LineTo(
Point(30, 20));
1066 path_builder.LineTo(
Point(30, 20) + pixel_delta * 10.0f);
1074 .width =
static_cast<Scalar>(width),
1077 .miter_limit = limit * 0.99f,
1080 EXPECT_EQ(points1.size(), 8u)
1081 <<
"degrees: " << degrees <<
", width: " << width <<
", "
1089 .width =
static_cast<Scalar>(width),
1092 .miter_limit = limit * 1.01f,
1095 EXPECT_EQ(points2.size(), 9u)
1096 <<
"degrees: " << degrees <<
", width: " << width;
1097 EXPECT_LE(points2[4].GetDistance({30, 20}), width * limit * 1.05f)
1098 <<
"degrees: " << degrees <<
", width: " << width <<
", "
1104 TEST(EntityGeometryTest, TwoLineSegments180DegreeJoins) {
1106 flutter::DlPathBuilder path_builder;
1107 path_builder.MoveTo(
Point(10, 10));
1108 path_builder.LineTo(
Point(100, 10));
1109 path_builder.LineTo(
Point(10, 10));
1119 .miter_limit = 4.0f,
1123 EXPECT_EQ(points_bevel.size(), 8u);
1132 .miter_limit = 400.0f,
1136 EXPECT_EQ(points_miter.size(), 8u);
1145 .miter_limit = 4.0f,
1149 EXPECT_EQ(points_round.size(), 19u);
1152 TEST(EntityGeometryTest, TightQuadratic180DegreeJoins) {
1155 flutter::DlPathBuilder path_builder_refrence;
1156 path_builder_refrence.MoveTo(
Point(10, 10));
1157 path_builder_refrence.QuadraticCurveTo(
Point(100, 10),
Point(100, 100));
1160 auto points_bevel_reference =
1167 .miter_limit = 4.0f,
1171 EXPECT_EQ(points_bevel_reference.size(), 74u);
1174 flutter::DlPathBuilder path_builder;
1175 path_builder.MoveTo(
Point(10, 10));
1176 path_builder.QuadraticCurveTo(
Point(100, 10),
Point(10, 10));
1186 .miter_limit = 4.0f,
1190 EXPECT_GT(points_bevel.size(), points_bevel_reference.size());
1199 .miter_limit = 400.0f,
1203 EXPECT_GT(points_miter.size(), points_bevel_reference.size());
1212 .miter_limit = 4.0f,
1216 EXPECT_GT(points_round.size(), points_bevel_reference.size());
1219 TEST(EntityGeometryTest, TightConic180DegreeJoins) {
1222 flutter::DlPathBuilder path_builder_refrence;
1223 path_builder_refrence.MoveTo(
Point(10, 10));
1224 path_builder_refrence.ConicCurveTo(
Point(100, 10),
Point(100, 100), 0.9f);
1227 auto points_bevel_reference =
1234 .miter_limit = 4.0f,
1238 EXPECT_EQ(points_bevel_reference.size(), 78u);
1241 flutter::DlPathBuilder path_builder;
1242 path_builder.MoveTo(
Point(10, 10));
1243 path_builder.QuadraticCurveTo(
Point(100, 10),
Point(10, 10));
1253 .miter_limit = 4.0f,
1257 EXPECT_GT(points_bevel.size(), points_bevel_reference.size());
1266 .miter_limit = 400.0f,
1270 EXPECT_GT(points_miter.size(), points_bevel_reference.size());
1279 .miter_limit = 4.0f,
1283 EXPECT_GT(points_round.size(), points_bevel_reference.size());
1286 TEST(EntityGeometryTest, TightCubic180DegreeJoins) {
1289 flutter::DlPathBuilder path_builder_reference;
1290 path_builder_reference.MoveTo(
Point(10, 10));
1291 path_builder_reference.CubicCurveTo(
Point(60, 10),
Point(100, 40),
1295 auto points_reference =
1302 .miter_limit = 4.0f,
1306 EXPECT_EQ(points_reference.size(), 76u);
1309 flutter::DlPathBuilder path_builder;
1310 path_builder.MoveTo(
Point(10, 10));
1311 path_builder.CubicCurveTo(
Point(60, 10),
Point(100, 40),
Point(60, 10));
1321 .miter_limit = 4.0f,
1325 EXPECT_GT(points_bevel.size(), points_reference.size());
1334 .miter_limit = 400.0f,
1338 EXPECT_GT(points_miter.size(), points_reference.size());
1347 .miter_limit = 4.0f,
1351 EXPECT_GT(points_round.size(), points_reference.size());
1354 TEST(EntityGeometryTest, RotatedFilledCircleGeometryCoverage) {
1358 ASSERT_EQ(geometry->GetCoverage({}).value_or(
Rect()), circle_bounds);
1364 EXPECT_TRUE(geometry->GetCoverage(transform45).has_value());
1365 Rect bounds = geometry->GetCoverage(transform45).value_or(
Rect());
1366 EXPECT_TRUE(bounds.
Contains(circle_bounds))
1367 <<
"geometry bounds: " << bounds << std::endl
1368 <<
" circle bounds: " << circle_bounds;
1371 TEST(EntityGeometryTest, RotatedStrokedCircleGeometryCoverage) {
1375 ASSERT_EQ(geometry->GetCoverage({}).value_or(
Rect()), circle_bounds);
1381 EXPECT_TRUE(geometry->GetCoverage(transform45).has_value());
1382 Rect bounds = geometry->GetCoverage(transform45).value_or(
Rect());
1383 EXPECT_TRUE(bounds.
Contains(circle_bounds))
1384 <<
"geometry bounds: " << bounds << std::endl
1385 <<
" circle bounds: " << circle_bounds;
void SetAntialiasPadding(Scalar padding)
std::optional< Rect > GetCoverage(const Matrix &transform) const override
A Geometry class that produces fillable vertices from any |RoundRect| object regardless of radii unif...
static std::unique_ptr< Geometry > MakeFillPath(const flutter::DlPath &path, std::optional< Rect > inner_rect=std::nullopt)
static std::unique_ptr< Geometry > MakeRect(const Rect &rect)
static std::unique_ptr< Geometry > MakeFilledArc(const Rect &oval_bounds, Degrees start, Degrees sweep, bool include_center)
static std::unique_ptr< Geometry > MakeStrokePath(const flutter::DlPath &path, const StrokeParameters &stroke={})
static std::unique_ptr< Geometry > MakeCircle(const Point ¢er, Scalar radius)
static std::unique_ptr< Geometry > MakeRoundRect(const Rect &rect, const Size &radii)
static std::unique_ptr< Geometry > MakeLine(const Point &p0, const Point &p1, const StrokeParameters &stroke)
static std::unique_ptr< Geometry > MakeStrokedCircle(const Point ¢er, Scalar radius, Scalar stroke_width)
static std::unique_ptr< Geometry > MakeStrokedArc(const Rect &oval_bounds, Degrees start, Degrees sweep, const StrokeParameters &stroke)
static std::vector< Point > GenerateSolidStrokeVertices(const PathSource &path, const StrokeParameters &stroke, Scalar scale)
A utility that generates triangles of the specified fill type given a polyline. This happens on the C...
inline ::testing::AssertionResult SolidVerticesNear(std::vector< impeller::Point > a, std::vector< impeller::Point > b)
inline ::testing::AssertionResult TextureVerticesNear(std::vector< impeller::TextureFillVertexShader::PerVertexData > a, std::vector< impeller::TextureFillVertexShader::PerVertexData > b)
inline ::testing::AssertionResult PointNear(impeller::Point a, impeller::Point b)
#define EXPECT_RECT_NEAR(a, b)
TEST(AllocationSizeTest, CanCreateTypedAllocations)
constexpr float kSqrt2Over2
@ kNormal
The geometry has no overlapping triangles.
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static Matrix MakeRotationZ(Radians r)
static constexpr Matrix MakeScale(const Vector3 &s)
static RoundRect MakeRectRadii(const Rect &rect, const RoundingRadii &radii)
A structure to store all of the parameters related to stroking a path or basic geometry object.
constexpr Type GetDistance(const TPoint &p) const
constexpr TRect< T > Expand(T left, T top, T right, T bottom) const
Returns a rectangle with expanded edges. Negative expansion results in shrinking.
constexpr TRect TransformBounds(const Matrix &transform) const
Creates a new bounding box that contains this transformed rectangle.
constexpr bool Contains(const TPoint< Type > &p) const
Returns true iff the provided point |p| is inside the half-open interior of this rectangle.
constexpr TRect TransformAndClipBounds(const Matrix &transform) const
Creates a new bounding box that contains this transformed rectangle, clipped against the near clippin...
constexpr Point GetCenter() const
Get the center point as a |Point|.
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
std::vector< Point > points