[Impeller] Convert SaveLayer alpha playgrounds into goldens (#41095)
[Impeller] Convert SaveLayer alpha playgrounds into goldens
diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc
index af8255d..0211b27 100644
--- a/impeller/aiks/aiks_unittests.cc
+++ b/impeller/aiks/aiks_unittests.cc
@@ -1980,5 +1980,121 @@
}
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<Image>(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<Image>(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<Image>(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/impeller/display_list/display_list_unittests.cc b/impeller/display_list/display_list_unittests.cc
index ca2930e..4512eaa 100644
--- a/impeller/display_list/display_list_unittests.cc
+++ b/impeller/display_list/display_list_unittests.cc
@@ -573,111 +573,6 @@
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<uint8_t>(255 * alpha));
- auto color_filter =
- std::make_shared<flutter::DlMatrixColorFilter>(color_matrix);
- Type type = static_cast<Type>(selected_type);
- switch (type) {
- case Type::kUseAsImageFilter: {
- auto image_filter =
- std::make_shared<flutter::DlColorFilterImageFilter>(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<uint8_t>(255 * alpha));
- auto color_filter = std::make_shared<flutter::DlBlendColorFilter>(
- flutter::DlColor::kRed(), flutter::DlBlendMode::kDstOver);
- Type type = static_cast<Type>(selected_type);
- switch (type) {
- case Type::kUseAsImageFilter: {
- auto image_filter =
- std::make_shared<flutter::DlColorFilterImageFilter>(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");