[Impeller] Convert SaveLayer alpha playgrounds into goldens (flutter/engine#41095)
[Impeller] Convert SaveLayer alpha playgrounds into goldens
This commit is contained in:
@@ -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<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
|
||||
|
||||
@@ -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<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");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user