From 43d98767df5b507f5c80d43eb1c942423626ea37 Mon Sep 17 00:00:00 2001 From: jonahwilliams Date: Fri, 1 Sep 2023 16:36:02 -0700 Subject: [PATCH] [impeller] premultiply vertices colors. --- impeller/display_list/dl_unittests.cc | 23 +++++++++++++++++++ impeller/display_list/dl_vertices_geometry.cc | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/impeller/display_list/dl_unittests.cc b/impeller/display_list/dl_unittests.cc index f79148465c4e7..70396ccdb2200 100644 --- a/impeller/display_list/dl_unittests.cc +++ b/impeller/display_list/dl_unittests.cc @@ -1500,6 +1500,29 @@ TEST_P(DisplayListTest, DrawVerticesSolidColorTrianglesWithIndices) { ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } +TEST_P(DisplayListTest, DrawVerticesPremultipliesColors) { + std::vector positions = { + SkPoint::Make(100, 300), SkPoint::Make(200, 100), SkPoint::Make(300, 300), + SkPoint::Make(200, 500)}; + auto color = flutter::DlColor::kBlue().withAlpha(0x99); + std::vector indices = {0, 1, 2, 0, 2, 3}; + std::vector colors = {color, color, color, color}; + + auto vertices = flutter::DlVertices::Make( + flutter::DlVertexMode::kTriangles, 6, positions.data(), + /*texture_coorindates=*/nullptr, colors.data(), 6, indices.data()); + + flutter::DisplayListBuilder builder; + flutter::DlPaint paint; + paint.setBlendMode(flutter::DlBlendMode::kSrcOver); + paint.setColor(flutter::DlColor::kRed()); + + builder.DrawRect(SkRect::MakeLTRB(0, 0, 400, 400), paint); + builder.DrawVertices(vertices, flutter::DlBlendMode::kDst, paint); + + ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); +} + TEST_P(DisplayListTest, DrawShapes) { flutter::DisplayListBuilder builder; std::vector joins = { diff --git a/impeller/display_list/dl_vertices_geometry.cc b/impeller/display_list/dl_vertices_geometry.cc index 66ad5aac91d15..279e5905700bf 100644 --- a/impeller/display_list/dl_vertices_geometry.cc +++ b/impeller/display_list/dl_vertices_geometry.cc @@ -46,7 +46,8 @@ std::shared_ptr MakeVertices( if (vertices->colors()) { colors.reserve(vertices->vertex_count()); for (auto i = 0; i < vertices->vertex_count(); i++) { - colors.push_back(skia_conversions::ToColor(vertices->colors()[i])); + colors.push_back( + skia_conversions::ToColor(vertices->colors()[i]).Premultiply()); } } std::vector texture_coordinates;