Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 95d7e84

Browse files
committed
Cache polyline and tesselation on Path
1 parent c254deb commit 95d7e84

11 files changed

Lines changed: 397 additions & 184 deletions

File tree

impeller/entity/geometry/geometry.cc

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,27 @@ namespace impeller {
1717

1818
/// Given a convex polyline, create a triangle fan structure.
1919
std::pair<std::vector<Point>, std::vector<uint16_t>> TessellateConvex(
20-
Path::Polyline polyline) {
20+
const Path::Polyline& polyline) {
2121
std::vector<Point> output;
2222
std::vector<uint16_t> indices;
2323

24-
for (auto j = 0u; j < polyline.contours.size(); j++) {
24+
const auto& points = polyline.points();
25+
26+
for (auto j = 0u; j < polyline.contours().size(); j++) {
2527
auto [start, end] = polyline.GetContourPointBounds(j);
26-
auto center = polyline.points[start];
28+
auto center = points[start];
2729

2830
// Some polygons will not self close and an additional triangle
2931
// must be inserted, others will self close and we need to avoid
3032
// inserting an extra triangle.
31-
if (polyline.points[end - 1] == polyline.points[start]) {
33+
if (points[end - 1] == points[start]) {
3234
end--;
3335
}
3436
output.emplace_back(center);
35-
output.emplace_back(polyline.points[start + 1]);
37+
output.emplace_back(points[start + 1]);
3638

3739
for (auto i = start + 2; i < end; i++) {
38-
const auto& point_b = polyline.points[i];
40+
const auto& point_b = points[i];
3941
output.emplace_back(point_b);
4042

4143
indices.emplace_back(0);

impeller/entity/geometry/geometry.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ GeometryResult ComputeUVGeometryForRect(Rect source_rect,
4949
/// @brief Given a polyline created from a convex filled path, perform a
5050
/// tessellation.
5151
std::pair<std::vector<Point>, std::vector<uint16_t>> TessellateConvex(
52-
Path::Polyline polyline);
52+
const Path::Polyline& polyline);
5353

5454
class Geometry {
5555
public:

impeller/entity/geometry/stroke_path_geometry.cc

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -237,29 +237,29 @@ StrokePathGeometry::CreateSolidStrokeVertices(
237237
auto polyline = path.CreatePolyline(scale);
238238

239239
VS::PerVertexData vtx;
240+
const auto& contours = polyline.contours();
241+
const auto& points = polyline.points();
240242

241243
// Offset state.
242244
Point offset;
243245
Point previous_offset; // Used for computing joins.
244246

245-
auto compute_offset = [&polyline, &offset, &previous_offset,
247+
auto compute_offset = [&points, &offset, &previous_offset,
246248
&stroke_width](size_t point_i) {
247249
previous_offset = offset;
248-
Point direction =
249-
(polyline.points[point_i] - polyline.points[point_i - 1]).Normalize();
250+
Point direction = (points[point_i] - points[point_i - 1]).Normalize();
250251
offset = Vector2{-direction.y, direction.x} * stroke_width * 0.5;
251252
};
252253

253-
for (size_t contour_i = 0; contour_i < polyline.contours.size();
254-
contour_i++) {
255-
auto contour = polyline.contours[contour_i];
254+
for (size_t contour_i = 0; contour_i < contours.size(); contour_i++) {
255+
auto contour = contours[contour_i];
256256
size_t contour_start_point_i, contour_end_point_i;
257257
std::tie(contour_start_point_i, contour_end_point_i) =
258258
polyline.GetContourPointBounds(contour_i);
259259

260260
switch (contour_end_point_i - contour_start_point_i) {
261261
case 1: {
262-
Point p = polyline.points[contour_start_point_i];
262+
Point p = points[contour_start_point_i];
263263
cap_proc(vtx_builder, p, {-stroke_width * 0.5f, 0}, scale, false);
264264
cap_proc(vtx_builder, p, {stroke_width * 0.5f, 0}, scale, false);
265265
continue;
@@ -282,60 +282,60 @@ StrokePathGeometry::CreateSolidStrokeVertices(
282282
// vertices at the start of the new contour (thus connecting the two
283283
// contours with two zero volume triangles, which will be discarded by
284284
// the rasterizer).
285-
vtx.position = polyline.points[contour_start_point_i - 1];
285+
vtx.position = points[contour_start_point_i - 1];
286286
// Append two vertices when "picking up" the pen so that the triangle
287287
// drawn when moving to the beginning of the new contour will have zero
288288
// volume.
289289
vtx_builder.AppendVertex(vtx);
290290
vtx_builder.AppendVertex(vtx);
291291

292-
vtx.position = polyline.points[contour_start_point_i];
292+
vtx.position = points[contour_start_point_i];
293293
// Append two vertices at the beginning of the new contour, which
294294
// appends two triangles of zero area.
295295
vtx_builder.AppendVertex(vtx);
296296
vtx_builder.AppendVertex(vtx);
297297
}
298298

299299
// Generate start cap.
300-
if (!polyline.contours[contour_i].is_closed) {
300+
if (!contours[contour_i].is_closed) {
301301
auto cap_offset =
302302
Vector2(-contour.start_direction.y, contour.start_direction.x) *
303303
stroke_width * 0.5; // Counterclockwise normal
304-
cap_proc(vtx_builder, polyline.points[contour_start_point_i], cap_offset,
305-
scale, true);
304+
cap_proc(vtx_builder, points[contour_start_point_i], cap_offset, scale,
305+
true);
306306
}
307307

308308
// Generate contour geometry.
309309
for (size_t point_i = contour_start_point_i + 1;
310310
point_i < contour_end_point_i; point_i++) {
311311
// Generate line rect.
312-
vtx.position = polyline.points[point_i - 1] + offset;
312+
vtx.position = points[point_i - 1] + offset;
313313
vtx_builder.AppendVertex(vtx);
314-
vtx.position = polyline.points[point_i - 1] - offset;
314+
vtx.position = points[point_i - 1] - offset;
315315
vtx_builder.AppendVertex(vtx);
316-
vtx.position = polyline.points[point_i] + offset;
316+
vtx.position = points[point_i] + offset;
317317
vtx_builder.AppendVertex(vtx);
318-
vtx.position = polyline.points[point_i] - offset;
318+
vtx.position = points[point_i] - offset;
319319
vtx_builder.AppendVertex(vtx);
320320

321321
if (point_i < contour_end_point_i - 1) {
322322
compute_offset(point_i + 1);
323323

324324
// Generate join from the current line to the next line.
325-
join_proc(vtx_builder, polyline.points[point_i], previous_offset,
326-
offset, scaled_miter_limit, scale);
325+
join_proc(vtx_builder, points[point_i], previous_offset, offset,
326+
scaled_miter_limit, scale);
327327
}
328328
}
329329

330330
// Generate end cap or join.
331-
if (!polyline.contours[contour_i].is_closed) {
331+
if (!contours[contour_i].is_closed) {
332332
auto cap_offset =
333333
Vector2(-contour.end_direction.y, contour.end_direction.x) *
334334
stroke_width * 0.5; // Clockwise normal
335-
cap_proc(vtx_builder, polyline.points[contour_end_point_i - 1],
336-
cap_offset, scale, false);
335+
cap_proc(vtx_builder, points[contour_end_point_i - 1], cap_offset, scale,
336+
false);
337337
} else {
338-
join_proc(vtx_builder, polyline.points[contour_start_point_i], offset,
338+
join_proc(vtx_builder, points[contour_start_point_i], offset,
339339
contour_first_offset, scaled_miter_limit, scale);
340340
}
341341
}

impeller/geometry/geometry_benchmarks.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ static void BM_Polyline(benchmark::State& state, Args&&... args) {
3030
size_t single_point_count = 0u;
3131
while (state.KeepRunning()) {
3232
auto polyline = path.CreatePolyline(1.0f);
33-
single_point_count = polyline.points.size();
33+
single_point_count = polyline.points().size();
3434
point_count += single_point_count;
3535
if (tessellate) {
3636
tess.Tessellate(

impeller/geometry/geometry_unittests.cc

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -600,8 +600,8 @@ TEST(GeometryTest, EmptyPath) {
600600
ASSERT_POINT_NEAR(c.destination, Point());
601601

602602
Path::Polyline polyline = path.CreatePolyline(1.0f);
603-
ASSERT_TRUE(polyline.points.empty());
604-
ASSERT_TRUE(polyline.contours.empty());
603+
ASSERT_TRUE(polyline.points().empty());
604+
ASSERT_TRUE(polyline.contours().empty());
605605
}
606606

607607
TEST(GeometryTest, SimplePath) {
@@ -2016,13 +2016,13 @@ TEST(GeometryTest, PathCreatePolyLineDoesNotDuplicatePoints) {
20162016

20172017
auto polyline = path.CreatePolyline(1.0f);
20182018

2019-
ASSERT_EQ(polyline.contours.size(), 2u);
2020-
ASSERT_EQ(polyline.points.size(), 5u);
2021-
ASSERT_EQ(polyline.points[0].x, 10);
2022-
ASSERT_EQ(polyline.points[1].x, 20);
2023-
ASSERT_EQ(polyline.points[2].x, 30);
2024-
ASSERT_EQ(polyline.points[3].x, 40);
2025-
ASSERT_EQ(polyline.points[4].x, 50);
2019+
ASSERT_EQ(polyline.contours().size(), 2u);
2020+
ASSERT_EQ(polyline.points().size(), 5u);
2021+
ASSERT_EQ(polyline.points()[0].x, 10);
2022+
ASSERT_EQ(polyline.points()[1].x, 20);
2023+
ASSERT_EQ(polyline.points()[2].x, 30);
2024+
ASSERT_EQ(polyline.points()[3].x, 40);
2025+
ASSERT_EQ(polyline.points()[4].x, 50);
20262026
}
20272027

20282028
TEST(GeometryTest, PathBuilderSetsCorrectContourPropertiesForAddCommands) {
@@ -2101,12 +2101,12 @@ TEST(GeometryTest, PathCreatePolylineGeneratesCorrectContourData) {
21012101
.Close()
21022102
.TakePath()
21032103
.CreatePolyline(1.0f);
2104-
ASSERT_EQ(polyline.points.size(), 6u);
2105-
ASSERT_EQ(polyline.contours.size(), 2u);
2106-
ASSERT_EQ(polyline.contours[0].is_closed, false);
2107-
ASSERT_EQ(polyline.contours[0].start_index, 0u);
2108-
ASSERT_EQ(polyline.contours[1].is_closed, true);
2109-
ASSERT_EQ(polyline.contours[1].start_index, 2u);
2104+
ASSERT_EQ(polyline.points().size(), 6u);
2105+
ASSERT_EQ(polyline.contours().size(), 2u);
2106+
ASSERT_EQ(polyline.contours()[0].is_closed, false);
2107+
ASSERT_EQ(polyline.contours()[0].start_index, 0u);
2108+
ASSERT_EQ(polyline.contours()[1].is_closed, true);
2109+
ASSERT_EQ(polyline.contours()[1].start_index, 2u);
21102110
}
21112111

21122112
TEST(GeometryTest, PolylineGetContourPointBoundsReturnsCorrectRanges) {
@@ -2132,15 +2132,15 @@ TEST(GeometryTest, PathAddRectPolylineHasCorrectContourData) {
21322132
.AddRect(Rect::MakeLTRB(50, 60, 70, 80))
21332133
.TakePath()
21342134
.CreatePolyline(1.0f);
2135-
ASSERT_EQ(polyline.contours.size(), 1u);
2136-
ASSERT_TRUE(polyline.contours[0].is_closed);
2137-
ASSERT_EQ(polyline.contours[0].start_index, 0u);
2138-
ASSERT_EQ(polyline.points.size(), 5u);
2139-
ASSERT_EQ(polyline.points[0], Point(50, 60));
2140-
ASSERT_EQ(polyline.points[1], Point(70, 60));
2141-
ASSERT_EQ(polyline.points[2], Point(70, 80));
2142-
ASSERT_EQ(polyline.points[3], Point(50, 80));
2143-
ASSERT_EQ(polyline.points[4], Point(50, 60));
2135+
ASSERT_EQ(polyline.contours().size(), 1u);
2136+
ASSERT_TRUE(polyline.contours()[0].is_closed);
2137+
ASSERT_EQ(polyline.contours()[0].start_index, 0u);
2138+
ASSERT_EQ(polyline.points().size(), 5u);
2139+
ASSERT_EQ(polyline.points()[0], Point(50, 60));
2140+
ASSERT_EQ(polyline.points()[1], Point(70, 60));
2141+
ASSERT_EQ(polyline.points()[2], Point(70, 80));
2142+
ASSERT_EQ(polyline.points()[3], Point(50, 80));
2143+
ASSERT_EQ(polyline.points()[4], Point(50, 60));
21442144
}
21452145

21462146
TEST(GeometryTest, PathPolylineDuplicatesAreRemovedForSameContour) {
@@ -2157,19 +2157,19 @@ TEST(GeometryTest, PathPolylineDuplicatesAreRemovedForSameContour) {
21572157
.LineTo({0, 100}) // Insert duplicate at end of contour.
21582158
.TakePath()
21592159
.CreatePolyline(1.0f);
2160-
ASSERT_EQ(polyline.contours.size(), 2u);
2161-
ASSERT_EQ(polyline.contours[0].start_index, 0u);
2162-
ASSERT_TRUE(polyline.contours[0].is_closed);
2163-
ASSERT_EQ(polyline.contours[1].start_index, 4u);
2164-
ASSERT_FALSE(polyline.contours[1].is_closed);
2165-
ASSERT_EQ(polyline.points.size(), 7u);
2166-
ASSERT_EQ(polyline.points[0], Point(50, 50));
2167-
ASSERT_EQ(polyline.points[1], Point(100, 50));
2168-
ASSERT_EQ(polyline.points[2], Point(100, 100));
2169-
ASSERT_EQ(polyline.points[3], Point(50, 50));
2170-
ASSERT_EQ(polyline.points[4], Point(50, 50));
2171-
ASSERT_EQ(polyline.points[5], Point(0, 50));
2172-
ASSERT_EQ(polyline.points[6], Point(0, 100));
2160+
ASSERT_EQ(polyline.contours().size(), 2u);
2161+
ASSERT_EQ(polyline.contours()[0].start_index, 0u);
2162+
ASSERT_TRUE(polyline.contours()[0].is_closed);
2163+
ASSERT_EQ(polyline.contours()[1].start_index, 4u);
2164+
ASSERT_FALSE(polyline.contours()[1].is_closed);
2165+
ASSERT_EQ(polyline.points().size(), 7u);
2166+
ASSERT_EQ(polyline.points()[0], Point(50, 50));
2167+
ASSERT_EQ(polyline.points()[1], Point(100, 50));
2168+
ASSERT_EQ(polyline.points()[2], Point(100, 100));
2169+
ASSERT_EQ(polyline.points()[3], Point(50, 50));
2170+
ASSERT_EQ(polyline.points()[4], Point(50, 50));
2171+
ASSERT_EQ(polyline.points()[5], Point(0, 50));
2172+
ASSERT_EQ(polyline.points()[6], Point(0, 100));
21732173
}
21742174

21752175
TEST(GeometryTest, MatrixPrinting) {

0 commit comments

Comments
 (0)