[Impeller] handle fill polylines with zero area. (#51945)
Fixes https://github.com/flutter/flutter/issues/146362
Sometimes we can have effectively zero area in a way that doesn't seem to register with the Skia bounding box logic we're using. Add a sanity check for zero points in the polyline.
diff --git a/impeller/tessellator/tessellator.cc b/impeller/tessellator/tessellator.cc
index 665a624..afbf01d 100644
--- a/impeller/tessellator/tessellator.cc
+++ b/impeller/tessellator/tessellator.cc
@@ -187,6 +187,9 @@
[this](Path::Polyline::PointBufferPtr point_buffer) {
point_buffer_ = std::move(point_buffer);
});
+ if (polyline.points->size() == 0) {
+ return output;
+ }
output.reserve(polyline.points->size() +
(4 * (polyline.contours.size() - 1)));
diff --git a/impeller/tessellator/tessellator_unittests.cc b/impeller/tessellator/tessellator_unittests.cc
index 772a794..fcc2849 100644
--- a/impeller/tessellator/tessellator_unittests.cc
+++ b/impeller/tessellator/tessellator_unittests.cc
@@ -480,6 +480,19 @@
Rect::MakeXYWH(5000, 10000, 2000, 3000), {50, 70});
}
+TEST(TessellatorTest, EarlyReturnEmptyConvexShape) {
+ // This path is not technically empty (it has a size in one dimension),
+ // but is otherwise completely flat.
+ auto tessellator = std::make_shared<Tessellator>();
+ PathBuilder builder;
+ builder.MoveTo({0, 0});
+ builder.MoveTo({10, 10}, /*relative=*/true);
+
+ auto points = tessellator->TessellateConvex(builder.TakePath(), 3.0);
+
+ EXPECT_TRUE(points.empty());
+}
+
#if !NDEBUG
TEST(TessellatorTest, ChecksConcurrentPolylineUsage) {
auto tessellator = std::make_shared<Tessellator>();