5 #include "display_list/dl_sampling_options.h"
6 #include "display_list/dl_tile_mode.h"
7 #include "display_list/dl_vertices.h"
10 #include "flutter/display_list/dl_blend_mode.h"
11 #include "flutter/display_list/dl_builder.h"
12 #include "flutter/display_list/dl_color.h"
13 #include "flutter/display_list/dl_paint.h"
14 #include "flutter/testing/testing.h"
24 std::shared_ptr<DlVertices> MakeVertices(
26 std::vector<DlPoint> vertices,
27 std::vector<uint16_t> indices,
28 std::vector<DlPoint> texture_coordinates,
29 std::vector<DlColor> colors) {
30 DlVertices::Builder::Flags flags(
31 {{texture_coordinates.size() > 0, colors.size() > 0}});
32 DlVertices::Builder builder(mode, vertices.size(), flags, indices.size());
33 if (colors.size() > 0) {
34 builder.store_colors(colors.data());
36 if (texture_coordinates.size() > 0) {
37 builder.store_texture_coordinates(texture_coordinates.data());
39 if (indices.size() > 0) {
40 builder.store_indices(indices.data());
42 builder.store_vertices(vertices.data());
43 return builder.build();
49 DisplayListBuilder builder;
53 auto size = image->impeller_texture()->GetSize();
56 DlColorSource::MakeImage(image, DlTileMode::kClamp, DlTileMode::kClamp));
58 std::vector<DlPoint> vertex_coordinates = {
63 auto vertices = MakeVertices(DlVertexMode::kTriangleStrip, vertex_coordinates,
66 builder.DrawVertices(vertices, DlBlendMode::kSrcOver, paint);
67 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
72 DisplayListBuilder builder;
76 auto size = image->impeller_texture()->GetSize();
78 DlMatrix matrix = DlMatrix::MakeTranslation({100, 100});
80 DlColorSource::MakeImage(image, DlTileMode::kClamp, DlTileMode::kClamp,
81 DlImageSampling::kLinear, &matrix));
83 std::vector<DlPoint> positions = {
89 MakeVertices(DlVertexMode::kTriangleStrip, positions, {0, 1, 2}, {}, {});
91 builder.DrawVertices(vertices, DlBlendMode::kSrcOver, paint);
92 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
97 DisplayListBuilder builder;
101 auto size = image->impeller_texture()->GetSize();
103 paint.setColorSource(
104 DlColorSource::MakeImage(image, DlTileMode::kClamp, DlTileMode::kClamp));
106 std::vector<DlPoint> positions = {
111 std::vector<DlColor> colors = {
112 DlColor::kRed().withAlpha(128), DlColor::kBlue().withAlpha(128),
113 DlColor::kGreen().withAlpha(128), DlColor::kRed().withAlpha(128),
114 DlColor::kBlue().withAlpha(128), DlColor::kGreen().withAlpha(128),
118 MakeVertices(DlVertexMode::kTriangles, positions, {}, {}, colors);
120 builder.DrawVertices(vertices, DlBlendMode::kDstOver, paint);
121 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
125 DisplayListBuilder builder;
129 auto size = image->impeller_texture()->GetSize();
131 paint.setColorSource(
132 DlColorSource::MakeImage(image, DlTileMode::kClamp, DlTileMode::kClamp));
134 std::vector<DlPoint> positions = {
139 std::vector<DlColor> colors = {
140 DlColor::kRed().modulateOpacity(0.5),
141 DlColor::kBlue().modulateOpacity(0.5),
142 DlColor::kGreen().modulateOpacity(0.5),
143 DlColor::kRed().modulateOpacity(0.5),
144 DlColor::kBlue().modulateOpacity(0.5),
145 DlColor::kGreen().modulateOpacity(0.5),
149 MakeVertices(DlVertexMode::kTriangles, positions, {}, {}, colors);
151 builder.DrawVertices(vertices, DlBlendMode::kColorBurn, paint);
152 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
157 constexpr
Scalar hexagon_radius = 125;
158 auto hex_start =
Point(200.0, -hexagon_radius + 200.0);
159 auto center_to_flat = 1.73 / 2 * hexagon_radius;
162 std::vector<DlPoint> vertices = {
163 DlPoint(hex_start.x, hex_start.y),
164 DlPoint(hex_start.x + center_to_flat, hex_start.y + 0.5 * hexagon_radius),
165 DlPoint(hex_start.x + center_to_flat, hex_start.y + 1.5 * hexagon_radius),
166 DlPoint(hex_start.x + center_to_flat, hex_start.y + 1.5 * hexagon_radius),
167 DlPoint(hex_start.x, hex_start.y + 2 * hexagon_radius),
168 DlPoint(hex_start.x, hex_start.y + 2 * hexagon_radius),
169 DlPoint(hex_start.x - center_to_flat, hex_start.y + 1.5 * hexagon_radius),
170 DlPoint(hex_start.x - center_to_flat, hex_start.y + 1.5 * hexagon_radius),
171 DlPoint(hex_start.x - center_to_flat, hex_start.y + 0.5 * hexagon_radius)
174 auto paint = flutter::DlPaint(flutter::DlColor::kDarkGrey());
175 auto dl_vertices = flutter::DlVertices::Make(
176 flutter::DlVertexMode::kTriangleFan, vertices.size(), vertices.data(),
178 flutter::DisplayListBuilder builder;
179 builder.DrawVertices(dl_vertices, flutter::DlBlendMode::kSrcOver, paint);
180 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
186 std::vector<DlPoint> positions = {
191 std::vector<flutter::DlColor> colors = {flutter::DlColor::kWhite(),
192 flutter::DlColor::kGreen(),
193 flutter::DlColor::kWhite()};
195 auto vertices = flutter::DlVertices::Make(
196 flutter::DlVertexMode::kTriangles, 3, positions.data(),
197 nullptr, colors.data());
199 flutter::DisplayListBuilder builder;
200 flutter::DlPaint paint;
202 paint.setColor(flutter::DlColor::kRed().modulateOpacity(0.5));
203 builder.Scale(-1, -1);
204 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
206 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
210 std::vector<DlPoint> positions = {
216 auto vertices = flutter::DlVertices::Make(
217 flutter::DlVertexMode::kTriangles, 3, positions.data(),
220 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
221 flutter::DlColor::kRed()};
222 const float stops[2] = {0.0, 1.0};
224 auto linear = flutter::DlColorSource::MakeLinear(
225 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
226 flutter::DlTileMode::kRepeat);
228 flutter::DisplayListBuilder builder;
229 flutter::DlPaint paint;
231 paint.setColorSource(linear);
232 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
234 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
238 std::vector<DlPoint> positions = {
243 std::vector<DlPoint> texture_coordinates = {
249 auto vertices = flutter::DlVertices::Make(
250 flutter::DlVertexMode::kTriangles, 3, positions.data(),
251 texture_coordinates.data(),
nullptr);
253 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
254 flutter::DlColor::kRed()};
255 const float stops[2] = {0.0, 1.0};
257 auto linear = flutter::DlColorSource::MakeLinear(
258 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
259 flutter::DlTileMode::kRepeat);
261 flutter::DisplayListBuilder builder;
262 flutter::DlPaint paint;
264 paint.setColorSource(linear);
265 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
267 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
271 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
273 std::vector<DlPoint> positions = {
278 std::vector<DlPoint> texture_coordinates = {
284 auto vertices = flutter::DlVertices::Make(
285 flutter::DlVertexMode::kTriangles, 3, positions.data(),
286 texture_coordinates.data(),
nullptr);
288 flutter::DisplayListBuilder builder;
289 flutter::DlPaint paint;
291 auto image_source = flutter::DlColorSource::MakeImage(
292 dl_image, flutter::DlTileMode::kRepeat, flutter::DlTileMode::kRepeat);
294 paint.setColorSource(image_source);
295 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
297 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
301 DrawVerticesImageSourceWithTextureCoordinatesAndColorBlending) {
302 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
304 std::vector<DlPoint> positions = {
309 std::vector<flutter::DlColor> colors = {flutter::DlColor::kWhite(),
310 flutter::DlColor::kGreen(),
311 flutter::DlColor::kWhite()};
312 std::vector<DlPoint> texture_coordinates = {
318 auto vertices = flutter::DlVertices::Make(
319 flutter::DlVertexMode::kTriangles, 3, positions.data(),
320 texture_coordinates.data(), colors.data());
322 flutter::DisplayListBuilder builder;
323 flutter::DlPaint paint;
325 auto image_source = flutter::DlColorSource::MakeImage(
326 dl_image, flutter::DlTileMode::kRepeat, flutter::DlTileMode::kRepeat);
328 paint.setColorSource(image_source);
329 builder.DrawVertices(vertices, flutter::DlBlendMode::kModulate, paint);
331 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
335 std::vector<DlPoint> positions = {
341 std::vector<uint16_t> indices = {0, 1, 2, 0, 2, 3};
343 auto vertices = flutter::DlVertices::Make(
344 flutter::DlVertexMode::kTriangles, positions.size(), positions.data(),
345 nullptr,
nullptr, indices.size(),
348 flutter::DisplayListBuilder builder;
349 flutter::DlPaint paint;
351 paint.setColor(flutter::DlColor::kRed());
352 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
354 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
358 std::vector<DlPoint> positions = {
364 auto color = flutter::DlColor::kBlue().withAlpha(0x99);
365 std::vector<uint16_t> indices = {0, 1, 2, 0, 2, 3};
366 std::vector<flutter::DlColor> colors = {color, color, color, color};
368 auto vertices = flutter::DlVertices::Make(
369 flutter::DlVertexMode::kTriangles, positions.size(), positions.data(),
370 nullptr, colors.data(), indices.size(),
373 flutter::DisplayListBuilder builder;
374 flutter::DlPaint paint;
375 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
376 paint.setColor(flutter::DlColor::kRed());
378 builder.DrawRect(DlRect::MakeLTRB(0, 0, 400, 400), paint);
379 builder.DrawVertices(vertices, flutter::DlBlendMode::kDst, paint);
381 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
385 std::vector<DlPoint> positions = {
391 std::vector<uint16_t> indices = {0, 1, 2, 0, 2, 3, 99, 100, 101};
393 auto vertices = flutter::DlVertices::Make(
394 flutter::DlVertexMode::kTriangles, positions.size(), positions.data(),
395 nullptr,
nullptr, indices.size(),
398 EXPECT_EQ(vertices->GetBounds(), DlRect::MakeLTRB(100, 100, 300, 500));
400 flutter::DisplayListBuilder builder;
401 flutter::DlPaint paint;
402 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
403 paint.setColor(flutter::DlColor::kRed());
405 builder.DrawRect(DlRect::MakeLTRB(0, 0, 400, 400), paint);
406 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrc, paint);
409 std::shared_ptr<Texture> image =
417 std::vector<DlPoint> positions_lt = {
424 auto vertices_lt = flutter::DlVertices::Make(
425 flutter::DlVertexMode::kTriangleStrip, positions_lt.size(),
427 positions_lt.data(),
nullptr,
431 std::vector<DlPoint> positions_rt = {
438 auto vertices_rt = flutter::DlVertices::Make(
439 flutter::DlVertexMode::kTriangleStrip, positions_rt.size(),
441 positions_rt.data(),
nullptr,
445 std::vector<DlPoint> positions_lb = {
452 auto vertices_lb = flutter::DlVertices::Make(
453 flutter::DlVertexMode::kTriangleStrip, positions_lb.size(),
455 positions_lb.data(),
nullptr,
459 std::vector<DlPoint> positions_rb = {
466 auto vertices_rb = flutter::DlVertices::Make(
467 flutter::DlVertexMode::kTriangleStrip, positions_rb.size(),
469 positions_rb.data(),
nullptr,
473 flutter::DisplayListBuilder builder;
474 flutter::DlPaint paint;
475 flutter::DlPaint rect_paint;
476 rect_paint.setColor(DlColor::kBlue());
478 auto runtime_stages =
479 OpenAssetAsRuntimeStage(
"runtime_stage_simple.frag.iplr");
483 ASSERT_TRUE(runtime_stage);
485 auto runtime_effect = DlRuntimeEffect::MakeImpeller(runtime_stage);
486 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
487 auto color_source = flutter::DlColorSource::MakeRuntimeEffect(
488 runtime_effect, {}, uniform_data);
490 paint.setColorSource(color_source);
492 builder.Scale(GetContentScale().
x, GetContentScale().y);
494 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100, 100), rect_paint);
495 builder.DrawVertices(vertices_lt, flutter::DlBlendMode::kSrcOver, paint);
496 builder.DrawVertices(vertices_rt, flutter::DlBlendMode::kSrcOver, paint);
497 builder.DrawVertices(vertices_lb, flutter::DlBlendMode::kSrcOver, paint);
498 builder.DrawVertices(vertices_rb, flutter::DlBlendMode::kSrcOver, paint);
501 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
507 DrawVerticesTextureCoordinatesWithFragmentShaderNonZeroOrigin) {
508 std::vector<DlPoint> positions_lt = {
515 auto vertices = flutter::DlVertices::Make(
516 flutter::DlVertexMode::kTriangleStrip, positions_lt.size(),
518 positions_lt.data(),
nullptr,
522 flutter::DisplayListBuilder builder;
523 flutter::DlPaint paint;
524 flutter::DlPaint rect_paint;
525 rect_paint.setColor(DlColor::kBlue());
527 auto runtime_stages =
528 OpenAssetAsRuntimeStage(
"runtime_stage_position.frag.iplr");
532 ASSERT_TRUE(runtime_stage);
534 auto runtime_effect = DlRuntimeEffect::MakeImpeller(runtime_stage);
535 auto rect_data = std::vector<Rect>{
Rect::MakeLTRB(200, 200, 250, 250)};
537 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
538 uniform_data->resize(rect_data.size() *
sizeof(
Rect));
539 memcpy(uniform_data->data(), rect_data.data(), uniform_data->size());
541 auto color_source = flutter::DlColorSource::MakeRuntimeEffect(
542 runtime_effect, {}, uniform_data);
544 paint.setColorSource(color_source);
546 builder.Scale(GetContentScale().
x, GetContentScale().y);
547 builder.DrawRect(DlRect::MakeLTRB(200, 200, 250, 250), rect_paint);
548 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
550 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
static sk_sp< DlImageImpeller > Make(std::shared_ptr< Texture > texture, OwningContext owning_context=OwningContext::kIO)
TEST_P(AiksTest, DrawAtlasNoColor)
std::shared_ptr< Texture > DisplayListToTexture(const sk_sp< flutter::DisplayList > &display_list, ISize size, AiksContext &context, bool reset_host_buffer, bool generate_mips)
Render the provided display list to a texture with the given size.
constexpr RuntimeStageBackend PlaygroundBackendToRuntimeStageBackend(PlaygroundBackend backend)
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)