[Impeller] Ensure that texture coordinate coverage and gradient color source sizes used by DrawVertices are nonempty (#163177)
Fixes https://github.com/flutter/flutter/issues/162969
This commit is contained in:
parent
59c5b2a81d
commit
ce659cda5e
@ -817,10 +817,14 @@ void Canvas::DrawVertices(const std::shared_ptr<VerticesGeometry>& 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();
|
||||
|
||||
|
@ -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<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
|
||||
flutter::DlColor::kRed()};
|
||||
std::vector<Scalar> 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<std::vector<uint8_t>>();
|
||||
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<flutter::DlPoint> 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<flutter::DlPoint> texture_coordinates = {
|
||||
flutter::DlPoint(0, 0),
|
||||
flutter::DlPoint(0, 100),
|
||||
flutter::DlPoint(0, 0),
|
||||
};
|
||||
std::vector<uint16_t> 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<DlVerticesGeometry>(vertices, context),
|
||||
BlendMode::kSourceOver, paint);
|
||||
|
||||
canvas.EndReplay();
|
||||
return true;
|
||||
};
|
||||
|
||||
ASSERT_TRUE(Playground::OpenPlaygroundHere(callback));
|
||||
}
|
||||
|
||||
} // namespace testing
|
||||
} // namespace impeller
|
||||
|
@ -65,8 +65,8 @@ std::shared_ptr<ColorSourceContents> Paint::CreateContents() const {
|
||||
|
||||
std::array<Point, 2> 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<ColorSourceContents> Paint::CreateContents() const {
|
||||
auto radius_pt = Point(radius, radius);
|
||||
std::array<Point, 2> 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<ColorSourceContents> Paint::CreateContents() const {
|
||||
auto radius_pt = Point(radius, radius);
|
||||
std::array<Point, 2> 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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user