From d5e58c2bf5fcc46a05008a02301dab432c310e82 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Tue, 11 Apr 2023 20:48:16 -0700 Subject: [PATCH] [Impeller] Convert SaveLayer alpha playgrounds into goldens (flutter/engine#41095) [Impeller] Convert SaveLayer alpha playgrounds into goldens --- .../flutter/impeller/aiks/aiks_unittests.cc | 116 ++++++++++++++++++ .../display_list/display_list_unittests.cc | 105 ---------------- 2 files changed, 116 insertions(+), 105 deletions(-) diff --git a/engine/src/flutter/impeller/aiks/aiks_unittests.cc b/engine/src/flutter/impeller/aiks/aiks_unittests.cc index af8255d704..0211b27797 100644 --- a/engine/src/flutter/impeller/aiks/aiks_unittests.cc +++ b/engine/src/flutter/impeller/aiks/aiks_unittests.cc @@ -1980,5 +1980,121 @@ static Picture BlendModeSaveLayerTest(BlendMode blend_mode) { } IMPELLER_FOR_EACH_BLEND_MODE(BLEND_MODE_TEST) +TEST_P(AiksTest, TranslucentSaveLayerDrawsCorrectly) { + Canvas canvas; + + canvas.DrawRect(Rect::MakeXYWH(100, 100, 300, 300), {.color = Color::Blue()}); + + canvas.SaveLayer({.color = Color::Black().WithAlpha(0.5)}); + canvas.DrawRect(Rect::MakeXYWH(100, 500, 300, 300), {.color = Color::Blue()}); + canvas.Restore(); + + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + +TEST_P(AiksTest, TranslucentSaveLayerWithBlendColorFilterDrawsCorrectly) { + Canvas canvas; + + canvas.DrawRect(Rect::MakeXYWH(100, 100, 300, 300), {.color = Color::Blue()}); + + canvas.SaveLayer({ + .color = Color::Black().WithAlpha(0.5), + .color_filter = + [](FilterInput::Ref input) { + return ColorFilterContents::MakeBlend( + BlendMode::kDestinationOver, {std::move(input)}, Color::Red()); + }, + }); + canvas.DrawRect(Rect::MakeXYWH(100, 500, 300, 300), {.color = Color::Blue()}); + canvas.Restore(); + + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + +TEST_P(AiksTest, TranslucentSaveLayerWithBlendImageFilterAndDrawsCorrectly) { + Canvas canvas; + + canvas.DrawRect(Rect::MakeXYWH(100, 100, 300, 300), {.color = Color::Blue()}); + + canvas.SaveLayer({ + .color = Color::Black().WithAlpha(0.5), + .image_filter = + [](FilterInput::Ref input, const Matrix& effect_transform, + bool is_subpass) { + return ColorFilterContents::MakeBlend( + BlendMode::kDestinationOver, {std::move(input)}, Color::Red()); + }, + }); + + canvas.DrawRect(Rect::MakeXYWH(100, 500, 300, 300), {.color = Color::Blue()}); + canvas.Restore(); + + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + +TEST_P(AiksTest, TranslucentSaveLayerImageDrawsCorrectly) { + Canvas canvas; + + auto image = std::make_shared(CreateTextureForFixture("airplane.jpg")); + canvas.DrawImage(image, {100, 100}, {}); + + canvas.SaveLayer({.color = Color::Black().WithAlpha(0.5)}); + canvas.DrawImage(image, {100, 500}, {}); + canvas.Restore(); + + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + +TEST_P(AiksTest, TranslucentSaveLayerWithColorMatrixColorFilterDrawsCorrectly) { + Canvas canvas; + + auto image = std::make_shared(CreateTextureForFixture("airplane.jpg")); + canvas.DrawImage(image, {100, 100}, {}); + + canvas.SaveLayer({ + .color = Color::Black().WithAlpha(0.5), + .color_filter = + [](FilterInput::Ref input) { + return ColorFilterContents::MakeColorMatrix({std::move(input)}, + {.array = { + 1, 0, 0, 0, 0, // + 0, 1, 0, 0, 0, // + 0, 0, 1, 0, 0, // + 0, 0, 0, 2, 0 // + }}); + }, + }); + canvas.DrawImage(image, {100, 500}, {}); + canvas.Restore(); + + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + +TEST_P(AiksTest, TranslucentSaveLayerWithColorMatrixImageFilterDrawsCorrectly) { + Canvas canvas; + + auto image = std::make_shared(CreateTextureForFixture("airplane.jpg")); + canvas.DrawImage(image, {100, 100}, {}); + + canvas.SaveLayer({ + .color = Color::Black().WithAlpha(0.5), + .image_filter = + [](FilterInput::Ref input, const Matrix& effect_transform, + bool is_subpass) { + return ColorFilterContents::MakeColorMatrix({std::move(input)}, + {.array = { + 1, 0, 0, 0, 0, // + 0, 1, 0, 0, 0, // + 0, 0, 1, 0, 0, // + 0, 0, 0, 2, 0 // + }}); + }, + }); + canvas.DrawImage(image, {100, 500}, {}); + canvas.Restore(); + + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + } // namespace testing } // namespace impeller diff --git a/engine/src/flutter/impeller/display_list/display_list_unittests.cc b/engine/src/flutter/impeller/display_list/display_list_unittests.cc index ca2930eaf7..4512eaacb2 100644 --- a/engine/src/flutter/impeller/display_list/display_list_unittests.cc +++ b/engine/src/flutter/impeller/display_list/display_list_unittests.cc @@ -573,111 +573,6 @@ TEST_P(DisplayListTest, CanClampTheResultingColorOfColorMatrixFilter) { ASSERT_TRUE(OpenPlaygroundHere(builder.Build())); } -TEST_P(DisplayListTest, SaveLayerWithColorMatrixFiltersAndAlphaDrawCorrectly) { - auto texture = CreateTextureForFixture("boston.jpg"); - enum class Type { kUseAsImageFilter, kUseAsColorFilter, kDisableFilter }; - auto callback = [&]() { - static float alpha = 0.5; - static int selected_type = 0; - const char* names[] = {"Use as image filter", "Use as color filter", - "Disable filter"}; - - static float color_matrix[20] = { - 1, 0, 0, 0, 0, // - 0, 1, 0, 0, 0, // - 0, 0, 1, 0, 0, // - 0, 0, 0, 2, 0, // - }; - - ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::SliderFloat("Alpha", &alpha, 0, 1); - - ImGui::Combo("Type", &selected_type, names, sizeof(names) / sizeof(char*)); - std::string label = "##1"; - for (int i = 0; i < 20; i += 5) { - ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float, - &(color_matrix[i]), 5, nullptr, nullptr, "%.2f", 0); - label[2]++; - } - ImGui::End(); - - flutter::DisplayListBuilder builder; - flutter::DlPaint save_paint; - save_paint.setAlpha(static_cast(255 * alpha)); - auto color_filter = - std::make_shared(color_matrix); - Type type = static_cast(selected_type); - switch (type) { - case Type::kUseAsImageFilter: { - auto image_filter = - std::make_shared(color_filter); - save_paint.setImageFilter(image_filter); - break; - } - case Type::kUseAsColorFilter: { - save_paint.setColorFilter(color_filter); - break; - } - case Type::kDisableFilter: - break; - } - builder.SaveLayer(nullptr, &save_paint); - flutter::DlPaint draw_paint; - builder.DrawImage(DlImageImpeller::Make(texture), SkPoint::Make(100, 100), - flutter::DlImageSampling::kNearestNeighbor, &draw_paint); - builder.Restore(); - return builder.Build(); - }; - - ASSERT_TRUE(OpenPlaygroundHere(callback)); -} - -TEST_P(DisplayListTest, SaveLayerWithBlendFiltersAndAlphaDrawCorrectly) { - auto texture = CreateTextureForFixture("boston.jpg"); - enum class Type { kUseAsImageFilter, kUseAsColorFilter, kDisableFilter }; - auto callback = [&]() { - static float alpha = 0.5; - static int selected_type = 0; - const char* names[] = {"Use as image filter", "Use as color filter", - "Disable filter"}; - - ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize); - ImGui::SliderFloat("Alpha", &alpha, 0, 1); - - ImGui::Combo("Type", &selected_type, names, sizeof(names) / sizeof(char*)); - ImGui::End(); - - flutter::DisplayListBuilder builder; - flutter::DlPaint save_paint; - save_paint.setAlpha(static_cast(255 * alpha)); - auto color_filter = std::make_shared( - flutter::DlColor::kRed(), flutter::DlBlendMode::kDstOver); - Type type = static_cast(selected_type); - switch (type) { - case Type::kUseAsImageFilter: { - auto image_filter = - std::make_shared(color_filter); - save_paint.setImageFilter(image_filter); - break; - } - case Type::kUseAsColorFilter: { - save_paint.setColorFilter(color_filter); - break; - } - case Type::kDisableFilter: - break; - } - builder.SaveLayer(nullptr, &save_paint); - flutter::DlPaint draw_paint; - draw_paint.setColor(flutter::DlColor::kBlue()); - builder.DrawRect(SkRect::MakeLTRB(100, 100, 400, 400), draw_paint); - builder.Restore(); - return builder.Build(); - }; - - ASSERT_TRUE(OpenPlaygroundHere(callback)); -} - TEST_P(DisplayListTest, CanDrawBackdropFilter) { auto texture = CreateTextureForFixture("embarcadero.jpg");