diff --git a/engine/src/flutter/impeller/display_list/canvas.cc b/engine/src/flutter/impeller/display_list/canvas.cc index 7ab35a5eb6..be12b9a220 100644 --- a/engine/src/flutter/impeller/display_list/canvas.cc +++ b/engine/src/flutter/impeller/display_list/canvas.cc @@ -817,10 +817,14 @@ void Canvas::DrawVertices(const std::shared_ptr& vertices, } else { auto cvg = vertices->GetCoverage(Matrix{}); FML_CHECK(cvg.has_value()); - src_coverage = - // Covered by FML_CHECK. - // NOLINTNEXTLINE(bugprone-unchecked-optional-access) - vertices->GetTextureCoordinateCoverage().value_or(cvg.value()); + auto texture_coverage = vertices->GetTextureCoordinateCoverage(); + if (texture_coverage.has_value()) { + src_coverage = + Rect::MakeOriginSize(texture_coverage->GetOrigin(), + texture_coverage->GetSize().Max({1, 1})); + } else { + src_coverage = cvg.value(); + } } src_contents = src_paint.CreateContents(); diff --git a/engine/src/flutter/impeller/display_list/canvas_unittests.cc b/engine/src/flutter/impeller/display_list/canvas_unittests.cc index 35defe6834..bd05de53e4 100644 --- a/engine/src/flutter/impeller/display_list/canvas_unittests.cc +++ b/engine/src/flutter/impeller/display_list/canvas_unittests.cc @@ -303,6 +303,7 @@ TEST_P(AiksTest, DrawVerticesLinearGradientWithEmptySize) { vertices_builder.store_texture_coordinates(texture_coordinates.data()); auto vertices = vertices_builder.build(); + // The start and end points of the gradient form an empty rectangle. std::vector colors = {flutter::DlColor::kBlue(), flutter::DlColor::kRed()}; std::vector stops = {0.0, 1.0}; @@ -322,5 +323,54 @@ TEST_P(AiksTest, DrawVerticesLinearGradientWithEmptySize) { ASSERT_TRUE(Playground::OpenPlaygroundHere(callback)); } +TEST_P(AiksTest, DrawVerticesWithEmptyTextureCoordinates) { + auto runtime_stages = + OpenAssetAsRuntimeStage("runtime_stage_simple.frag.iplr"); + + auto runtime_stage = + runtime_stages[PlaygroundBackendToRuntimeStageBackend(GetBackend())]; + ASSERT_TRUE(runtime_stage); + + auto runtime_effect = flutter::DlRuntimeEffect::MakeImpeller(runtime_stage); + auto uniform_data = std::make_shared>(); + auto color_source = flutter::DlColorSource::MakeRuntimeEffect( + runtime_effect, {}, uniform_data); + + RenderCallback callback = [&](RenderTarget& render_target) { + ContentContext context(GetContext(), nullptr); + Canvas canvas(context, render_target, true, false); + + std::vector vertex_coordinates = { + flutter::DlPoint(100, 100), + flutter::DlPoint(300, 100), + flutter::DlPoint(100, 300), + }; + // The bounding box of the texture coordinates is empty. + std::vector texture_coordinates = { + flutter::DlPoint(0, 0), + flutter::DlPoint(0, 100), + flutter::DlPoint(0, 0), + }; + std::vector indices = {0, 1, 2}; + flutter::DlVertices::Builder vertices_builder( + flutter::DlVertexMode::kTriangleStrip, vertex_coordinates.size(), + flutter::DlVertices::Builder::kHasTextureCoordinates, indices.size()); + vertices_builder.store_vertices(vertex_coordinates.data()); + vertices_builder.store_indices(indices.data()); + vertices_builder.store_texture_coordinates(texture_coordinates.data()); + auto vertices = vertices_builder.build(); + + Paint paint; + paint.color_source = color_source.get(); + canvas.DrawVertices(std::make_shared(vertices, context), + BlendMode::kSourceOver, paint); + + canvas.EndReplay(); + return true; + }; + + ASSERT_TRUE(Playground::OpenPlaygroundHere(callback)); +} + } // namespace testing } // namespace impeller diff --git a/engine/src/flutter/impeller/display_list/paint.cc b/engine/src/flutter/impeller/display_list/paint.cc index 407126264b..97e3f68c6e 100644 --- a/engine/src/flutter/impeller/display_list/paint.cc +++ b/engine/src/flutter/impeller/display_list/paint.cc @@ -65,8 +65,8 @@ std::shared_ptr Paint::CreateContents() const { std::array bounds{start_point, end_point}; auto intrinsic_size = Rect::MakePointBounds(bounds.begin(), bounds.end()); - if (intrinsic_size.has_value() && !intrinsic_size->IsEmpty()) { - contents->SetColorSourceSize(intrinsic_size->GetSize()); + if (intrinsic_size.has_value()) { + contents->SetColorSourceSize(intrinsic_size->GetSize().Max({1, 1})); } return contents; } @@ -95,8 +95,8 @@ std::shared_ptr Paint::CreateContents() const { auto radius_pt = Point(radius, radius); std::array bounds{center + radius_pt, center - radius_pt}; auto intrinsic_size = Rect::MakePointBounds(bounds.begin(), bounds.end()); - if (intrinsic_size.has_value() && !intrinsic_size->IsEmpty()) { - contents->SetColorSourceSize(intrinsic_size->GetSize()); + if (intrinsic_size.has_value()) { + contents->SetColorSourceSize(intrinsic_size->GetSize().Max({1, 1})); } return contents; } @@ -129,8 +129,8 @@ std::shared_ptr Paint::CreateContents() const { auto radius_pt = Point(radius, radius); std::array bounds{center + radius_pt, center - radius_pt}; auto intrinsic_size = Rect::MakePointBounds(bounds.begin(), bounds.end()); - if (intrinsic_size.has_value() && !intrinsic_size->IsEmpty()) { - contents->SetColorSourceSize(intrinsic_size->GetSize()); + if (intrinsic_size.has_value()) { + contents->SetColorSourceSize(intrinsic_size->GetSize().Max({1, 1})); } return contents; }