Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 1a00d10

Browse files
committed
test fixes
1 parent 8a1caa1 commit 1a00d10

File tree

4 files changed

+109
-10
lines changed

4 files changed

+109
-10
lines changed

impeller/aiks/canvas.cc

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,10 +397,9 @@ void Canvas::DrawVertices(std::unique_ptr<VerticesGeometry> vertices,
397397
GetCurrentPass().AddEntity(entity);
398398
return;
399399
}
400-
401400
auto contents = std::make_shared<VerticesContents>();
402-
contents->SetSrcContents(
403-
paint.CreateContentsForGeometry(Geometry::MakeRect(rect.value())));
401+
contents->SetSrcContents(paint.CreateContentsForGeometry(
402+
Geometry::MakeRect(Rect::MakeSize(rect.value().size))));
404403
contents->SetColor(paint.color);
405404
contents->SetBlendMode(blend_mode);
406405
contents->SetGeometry(std::move(vertices));

impeller/display_list/display_list_unittests.cc

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,15 @@
3434
namespace impeller {
3535
namespace testing {
3636

37+
flutter::DlColor toColor(const float* components) {
38+
auto value = (((std::lround(components[3] * 255) & 0xff) << 24) |
39+
((std::lround(components[0] * 255) & 0xff) << 16) |
40+
((std::lround(components[1] * 255) & 0xff) << 8) |
41+
((std::lround(components[2] * 255) & 0xff) << 0)) &
42+
0xFFFFFFFF;
43+
return flutter::DlColor(value);
44+
}
45+
3746
using DisplayListTest = DisplayListPlayground;
3847
INSTANTIATE_PLAYGROUND_SUITE(DisplayListTest);
3948

@@ -1159,6 +1168,97 @@ TEST_P(DisplayListTest, DrawShapes) {
11591168
ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
11601169
}
11611170

1171+
TEST_P(DisplayListTest, DrawVerticesBlendModes) {
1172+
std::vector<const char*> blend_mode_names;
1173+
std::vector<flutter::DlBlendMode> blend_mode_values;
1174+
{
1175+
const std::vector<std::tuple<const char*, flutter::DlBlendMode>> blends = {
1176+
// Pipeline blends (Porter-Duff alpha compositing)
1177+
{"Clear", flutter::DlBlendMode::kClear},
1178+
{"Source", flutter::DlBlendMode::kSrc},
1179+
{"Destination", flutter::DlBlendMode::kDst},
1180+
{"SourceOver", flutter::DlBlendMode::kSrcOver},
1181+
{"DestinationOver", flutter::DlBlendMode::kDstOver},
1182+
{"SourceIn", flutter::DlBlendMode::kSrcIn},
1183+
{"DestinationIn", flutter::DlBlendMode::kDstIn},
1184+
{"SourceOut", flutter::DlBlendMode::kSrcOut},
1185+
{"DestinationOut", flutter::DlBlendMode::kDstOut},
1186+
{"SourceATop", flutter::DlBlendMode::kSrcATop},
1187+
{"DestinationATop", flutter::DlBlendMode::kDstATop},
1188+
{"Xor", flutter::DlBlendMode::kXor},
1189+
{"Plus", flutter::DlBlendMode::kPlus},
1190+
{"Modulate", flutter::DlBlendMode::kModulate},
1191+
// Advanced blends (color component blends)
1192+
{"Screen", flutter::DlBlendMode::kScreen},
1193+
{"Overlay", flutter::DlBlendMode::kOverlay},
1194+
{"Darken", flutter::DlBlendMode::kDarken},
1195+
{"Lighten", flutter::DlBlendMode::kLighten},
1196+
{"ColorDodge", flutter::DlBlendMode::kColorDodge},
1197+
{"ColorBurn", flutter::DlBlendMode::kColorBurn},
1198+
{"HardLight", flutter::DlBlendMode::kHardLight},
1199+
{"SoftLight", flutter::DlBlendMode::kSoftLight},
1200+
{"Difference", flutter::DlBlendMode::kDifference},
1201+
{"Exclusion", flutter::DlBlendMode::kExclusion},
1202+
{"Multiply", flutter::DlBlendMode::kMultiply},
1203+
{"Hue", flutter::DlBlendMode::kHue},
1204+
{"Saturation", flutter::DlBlendMode::kSaturation},
1205+
{"Color", flutter::DlBlendMode::kColor},
1206+
{"Luminosity", flutter::DlBlendMode::kLuminosity},
1207+
};
1208+
assert(blends.size() ==
1209+
static_cast<size_t>(flutter::DlBlendMode::kLastMode) + 1);
1210+
for (const auto& [name, mode] : blends) {
1211+
blend_mode_names.push_back(name);
1212+
blend_mode_values.push_back(mode);
1213+
}
1214+
}
1215+
1216+
auto callback = [&]() {
1217+
static int current_blend_index = 3;
1218+
static float dst_alpha = 1;
1219+
static float src_alpha = 1;
1220+
static float color0[4] = {1.0f, 0.0f, 0.0f, 1.0f};
1221+
static float color1[4] = {0.0f, 1.0f, 0.0f, 1.0f};
1222+
static float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
1223+
static float src_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1224+
1225+
ImGui::Begin("Controls", nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1226+
{
1227+
ImGui::ListBox("Blending mode", &current_blend_index,
1228+
blend_mode_names.data(), blend_mode_names.size());
1229+
ImGui::SliderFloat("Source alpha", &src_alpha, 0, 1);
1230+
ImGui::ColorEdit4("Color A", color0);
1231+
ImGui::ColorEdit4("Color B", color1);
1232+
ImGui::ColorEdit4("Color C", color2);
1233+
ImGui::ColorEdit4("Source Color", src_color);
1234+
ImGui::SliderFloat("Destination alpha", &dst_alpha, 0, 1);
1235+
}
1236+
ImGui::End();
1237+
1238+
std::vector<SkPoint> positions = {SkPoint::Make(100, 300),
1239+
SkPoint::Make(200, 100),
1240+
SkPoint::Make(300, 300)};
1241+
std::vector<flutter::DlColor> colors = {
1242+
toColor(color0).modulateOpacity(dst_alpha),
1243+
toColor(color1).modulateOpacity(dst_alpha),
1244+
toColor(color2).modulateOpacity(dst_alpha)};
1245+
1246+
auto vertices = flutter::DlVertices::Make(
1247+
flutter::DlVertexMode::kTriangles, 3, positions.data(),
1248+
/*texture_coorindates=*/nullptr, colors.data());
1249+
1250+
flutter::DisplayListBuilder builder;
1251+
flutter::DlPaint paint;
1252+
1253+
paint.setColor(toColor(src_color).modulateOpacity(src_alpha));
1254+
builder.drawVertices(vertices, blend_mode_values[current_blend_index],
1255+
paint);
1256+
return builder.Build();
1257+
};
1258+
1259+
ASSERT_TRUE(OpenPlaygroundHere(callback));
1260+
}
1261+
11621262
#ifdef IMPELLER_ENABLE_3D
11631263
TEST_P(DisplayListTest, SceneColorSource) {
11641264
// Load up the scene.

impeller/display_list/display_list_vertices_geometry.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,17 +235,19 @@ GeometryResult DLVerticesGeometry::GetPositionUVBuffer(
235235
auto* dl_vertices = vertices_->vertices();
236236
auto* dl_colors = vertices_->colors();
237237

238-
auto coverage = ToRect(vertices_->bounds());
238+
auto coverage_rect = ToRect(vertices_->bounds());
239239
std::vector<VS::PerVertexData> vertex_data(vertex_count);
240240
for (auto i = 0; i < vertex_count; i++) {
241241
auto dl_color = dl_colors[i];
242242
auto color = Color(dl_color.getRedF(), dl_color.getGreenF(),
243243
dl_color.getBlueF(), dl_color.getAlphaF());
244244
auto sk_point = dl_vertices[i];
245+
auto vertex = Point(sk_point.x(), sk_point.y());
246+
auto coverage_coords = (vertex - coverage_rect.origin) / coverage_rect.size;
245247
vertex_data[i] = {
246-
.vertices = Point(sk_point.x(), sk_point.y()),
248+
.vertices = vertex,
247249
.dst_color = color,
248-
.src_texture_coords = Point(sk_point.x(), sk_point.y()) / coverage.size,
250+
.src_texture_coords = coverage_coords / coverage_rect.size,
249251
};
250252
}
251253

impeller/entity/contents/vertices_contents.cc

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,7 @@ bool VerticesContents::Render(const ContentContext& renderer,
180180
}
181181

182182
VS::FrameInfo frame_info;
183-
frame_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
184-
entity.GetTransformation();
183+
frame_info.mvp = geometry_result.transform;
185184

186185
FS::FragInfo frag_info;
187186
frag_info.src_y_coord_scale = src_texture->texture->GetYCoordScale();
@@ -219,8 +218,7 @@ bool VerticesContents::RenderDestination(const ContentContext& renderer,
219218
cmd.BindVertices(geometry_result.vertex_buffer);
220219

221220
VS::VertInfo vert_info;
222-
vert_info.mvp = Matrix::MakeOrthographic(pass.GetRenderTargetSize()) *
223-
entity.GetTransformation();
221+
vert_info.mvp = geometry_result.transform;
224222
VS::BindVertInfo(cmd, host_buffer.EmplaceUniform(vert_info));
225223

226224
FS::FragInfo frag_info;

0 commit comments

Comments
 (0)