5 #include "display_list/dl_sampling_options.h"
6 #include "display_list/dl_tile_mode.h"
7 #include "display_list/dl_vertices.h"
8 #include "display_list/effects/dl_mask_filter.h"
11 #include "flutter/display_list/dl_blend_mode.h"
12 #include "flutter/display_list/dl_builder.h"
13 #include "flutter/display_list/dl_color.h"
14 #include "flutter/display_list/dl_paint.h"
15 #include "flutter/testing/testing.h"
26 std::shared_ptr<DlVertices> MakeVertices(
28 std::vector<DlPoint> vertices,
29 std::vector<uint16_t> indices,
30 std::vector<DlPoint> texture_coordinates,
31 std::vector<DlColor> colors) {
32 DlVertices::Builder::Flags flags(
33 {{texture_coordinates.size() > 0, colors.size() > 0}});
34 DlVertices::Builder builder(mode, vertices.size(), flags, indices.size());
35 if (colors.size() > 0) {
36 builder.store_colors(colors.data());
38 if (texture_coordinates.size() > 0) {
39 builder.store_texture_coordinates(texture_coordinates.data());
41 if (indices.size() > 0) {
42 builder.store_indices(indices.data());
44 builder.store_vertices(vertices.data());
45 return builder.build();
51 DisplayListBuilder builder;
55 auto size = image->impeller_texture()->GetSize();
58 DlColorSource::MakeImage(image, DlTileMode::kClamp, DlTileMode::kClamp));
60 std::vector<DlPoint> vertex_coordinates = {
65 auto vertices = MakeVertices(DlVertexMode::kTriangleStrip, vertex_coordinates,
68 builder.DrawVertices(vertices, DlBlendMode::kSrcOver, paint);
69 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
74 DisplayListBuilder builder;
78 auto size = image->impeller_texture()->GetSize();
80 DlMatrix matrix = DlMatrix::MakeTranslation({100, 100});
82 DlColorSource::MakeImage(image, DlTileMode::kClamp, DlTileMode::kClamp,
83 DlImageSampling::kLinear, &matrix));
85 std::vector<DlPoint> positions = {
91 MakeVertices(DlVertexMode::kTriangleStrip, positions, {0, 1, 2}, {}, {});
93 builder.DrawVertices(vertices, DlBlendMode::kSrcOver, paint);
94 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
99 DisplayListBuilder builder;
103 auto size = image->impeller_texture()->GetSize();
105 paint.setColorSource(
106 DlColorSource::MakeImage(image, DlTileMode::kClamp, DlTileMode::kClamp));
108 std::vector<DlPoint> positions = {
113 std::vector<DlColor> colors = {
114 DlColor::kRed().withAlpha(128), DlColor::kBlue().withAlpha(128),
115 DlColor::kGreen().withAlpha(128), DlColor::kRed().withAlpha(128),
116 DlColor::kBlue().withAlpha(128), DlColor::kGreen().withAlpha(128),
120 MakeVertices(DlVertexMode::kTriangles, positions, {}, {}, colors);
122 builder.DrawVertices(vertices, DlBlendMode::kDstOver, paint);
123 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
127 DisplayListBuilder builder;
131 auto size = image->impeller_texture()->GetSize();
133 paint.setColorSource(
134 DlColorSource::MakeImage(image, DlTileMode::kClamp, DlTileMode::kClamp));
136 std::vector<DlPoint> positions = {
141 std::vector<DlColor> colors = {
142 DlColor::kRed().modulateOpacity(0.5),
143 DlColor::kBlue().modulateOpacity(0.5),
144 DlColor::kGreen().modulateOpacity(0.5),
145 DlColor::kRed().modulateOpacity(0.5),
146 DlColor::kBlue().modulateOpacity(0.5),
147 DlColor::kGreen().modulateOpacity(0.5),
151 MakeVertices(DlVertexMode::kTriangles, positions, {}, {}, colors);
153 builder.DrawVertices(vertices, DlBlendMode::kColorBurn, paint);
154 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
159 constexpr
Scalar hexagon_radius = 125;
160 auto hex_start =
Point(200.0, -hexagon_radius + 200.0);
161 auto center_to_flat = 1.73 / 2 * hexagon_radius;
164 std::vector<DlPoint> vertices = {
165 DlPoint(hex_start.x, hex_start.y),
166 DlPoint(hex_start.x + center_to_flat, hex_start.y + 0.5 * hexagon_radius),
167 DlPoint(hex_start.x + center_to_flat, hex_start.y + 1.5 * hexagon_radius),
168 DlPoint(hex_start.x + center_to_flat, hex_start.y + 1.5 * hexagon_radius),
169 DlPoint(hex_start.x, hex_start.y + 2 * hexagon_radius),
170 DlPoint(hex_start.x, hex_start.y + 2 * hexagon_radius),
171 DlPoint(hex_start.x - center_to_flat, hex_start.y + 1.5 * hexagon_radius),
172 DlPoint(hex_start.x - center_to_flat, hex_start.y + 1.5 * hexagon_radius),
173 DlPoint(hex_start.x - center_to_flat, hex_start.y + 0.5 * hexagon_radius)
176 auto paint = flutter::DlPaint(flutter::DlColor::kDarkGrey());
177 auto dl_vertices = flutter::DlVertices::Make(
178 flutter::DlVertexMode::kTriangleFan, vertices.size(), vertices.data(),
180 flutter::DisplayListBuilder builder;
181 builder.DrawVertices(dl_vertices, flutter::DlBlendMode::kSrcOver, paint);
182 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
188 std::vector<DlPoint> positions = {
193 std::vector<flutter::DlColor> colors = {flutter::DlColor::kWhite(),
194 flutter::DlColor::kGreen(),
195 flutter::DlColor::kWhite()};
197 auto vertices = flutter::DlVertices::Make(
198 flutter::DlVertexMode::kTriangles, 3, positions.data(),
199 nullptr, colors.data());
201 flutter::DisplayListBuilder builder;
202 flutter::DlPaint paint;
204 paint.setColor(flutter::DlColor::kRed().modulateOpacity(0.5));
205 builder.Scale(-1, -1);
206 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
208 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
212 std::vector<DlPoint> positions = {
218 auto vertices = flutter::DlVertices::Make(
219 flutter::DlVertexMode::kTriangles, 3, positions.data(),
222 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
223 flutter::DlColor::kRed()};
224 const float stops[2] = {0.0, 1.0};
226 auto linear = flutter::DlColorSource::MakeLinear(
227 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
228 flutter::DlTileMode::kRepeat);
230 flutter::DisplayListBuilder builder;
231 flutter::DlPaint paint;
233 paint.setColorSource(linear);
234 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
236 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
240 std::vector<DlPoint> positions = {
245 std::vector<DlPoint> texture_coordinates = {
251 auto vertices = flutter::DlVertices::Make(
252 flutter::DlVertexMode::kTriangles, 3, positions.data(),
253 texture_coordinates.data(),
nullptr);
255 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
256 flutter::DlColor::kRed()};
257 const float stops[2] = {0.0, 1.0};
259 auto linear = flutter::DlColorSource::MakeLinear(
260 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
261 flutter::DlTileMode::kRepeat);
263 flutter::DisplayListBuilder builder;
264 flutter::DlPaint paint;
266 paint.setColorSource(linear);
267 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
269 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
273 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
275 std::vector<DlPoint> positions = {
280 std::vector<DlPoint> texture_coordinates = {
286 auto vertices = flutter::DlVertices::Make(
287 flutter::DlVertexMode::kTriangles, 3, positions.data(),
288 texture_coordinates.data(),
nullptr);
290 flutter::DisplayListBuilder builder;
291 flutter::DlPaint paint;
293 auto image_source = flutter::DlColorSource::MakeImage(
294 dl_image, flutter::DlTileMode::kRepeat, flutter::DlTileMode::kRepeat);
296 paint.setColorSource(image_source);
297 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
299 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
303 DrawVerticesImageSourceWithTextureCoordinatesAndColorBlending) {
304 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
306 std::vector<DlPoint> positions = {
311 std::vector<flutter::DlColor> colors = {flutter::DlColor::kWhite(),
312 flutter::DlColor::kGreen(),
313 flutter::DlColor::kWhite()};
314 std::vector<DlPoint> texture_coordinates = {
320 auto vertices = flutter::DlVertices::Make(
321 flutter::DlVertexMode::kTriangles, 3, positions.data(),
322 texture_coordinates.data(), colors.data());
324 flutter::DisplayListBuilder builder;
325 flutter::DlPaint paint;
327 auto image_source = flutter::DlColorSource::MakeImage(
328 dl_image, flutter::DlTileMode::kRepeat, flutter::DlTileMode::kRepeat);
330 paint.setColorSource(image_source);
331 builder.DrawVertices(vertices, flutter::DlBlendMode::kModulate, paint);
333 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
337 std::vector<DlPoint> positions = {
343 std::vector<uint16_t> indices = {0, 1, 2, 0, 2, 3};
345 auto vertices = flutter::DlVertices::Make(
346 flutter::DlVertexMode::kTriangles, positions.size(), positions.data(),
347 nullptr,
nullptr, indices.size(),
350 flutter::DisplayListBuilder builder;
351 flutter::DlPaint paint;
353 paint.setColor(flutter::DlColor::kRed());
354 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
356 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
360 std::vector<DlPoint> positions = {
366 auto color = flutter::DlColor::kBlue().withAlpha(0x99);
367 std::vector<uint16_t> indices = {0, 1, 2, 0, 2, 3};
368 std::vector<flutter::DlColor> colors = {color, color, color, color};
370 auto vertices = flutter::DlVertices::Make(
371 flutter::DlVertexMode::kTriangles, positions.size(), positions.data(),
372 nullptr, colors.data(), indices.size(),
375 flutter::DisplayListBuilder builder;
376 flutter::DlPaint paint;
377 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
378 paint.setColor(flutter::DlColor::kRed());
380 builder.DrawRect(DlRect::MakeLTRB(0, 0, 400, 400), paint);
381 builder.DrawVertices(vertices, flutter::DlBlendMode::kDst, paint);
383 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
387 std::vector<DlPoint> positions = {
393 std::vector<uint16_t> indices = {0, 1, 2, 0, 2, 3, 99, 100, 101};
395 auto vertices = flutter::DlVertices::Make(
396 flutter::DlVertexMode::kTriangles, positions.size(), positions.data(),
397 nullptr,
nullptr, indices.size(),
400 EXPECT_EQ(vertices->GetBounds(), DlRect::MakeLTRB(100, 100, 300, 500));
402 flutter::DisplayListBuilder builder;
403 flutter::DlPaint paint;
404 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
405 paint.setColor(flutter::DlColor::kRed());
407 builder.DrawRect(DlRect::MakeLTRB(0, 0, 400, 400), paint);
408 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrc, paint);
411 std::shared_ptr<Texture> image =
419 std::vector<DlPoint> positions_lt = {
426 auto vertices_lt = flutter::DlVertices::Make(
427 flutter::DlVertexMode::kTriangleStrip, positions_lt.size(),
429 positions_lt.data(),
nullptr,
433 std::vector<DlPoint> positions_rt = {
440 auto vertices_rt = flutter::DlVertices::Make(
441 flutter::DlVertexMode::kTriangleStrip, positions_rt.size(),
443 positions_rt.data(),
nullptr,
447 std::vector<DlPoint> positions_lb = {
454 auto vertices_lb = flutter::DlVertices::Make(
455 flutter::DlVertexMode::kTriangleStrip, positions_lb.size(),
457 positions_lb.data(),
nullptr,
461 std::vector<DlPoint> positions_rb = {
468 auto vertices_rb = flutter::DlVertices::Make(
469 flutter::DlVertexMode::kTriangleStrip, positions_rb.size(),
471 positions_rb.data(),
nullptr,
475 flutter::DisplayListBuilder builder;
476 flutter::DlPaint paint;
477 flutter::DlPaint rect_paint;
478 rect_paint.setColor(DlColor::kBlue());
480 auto runtime_stages =
481 OpenAssetAsRuntimeStage(
"runtime_stage_simple.frag.iplr");
485 ASSERT_TRUE(runtime_stage);
488 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
489 auto color_source = flutter::DlColorSource::MakeRuntimeEffect(
490 runtime_effect, {}, uniform_data);
492 paint.setColorSource(color_source);
494 builder.Scale(GetContentScale().
x, GetContentScale().y);
496 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100, 100), rect_paint);
497 builder.DrawVertices(vertices_lt, flutter::DlBlendMode::kSrcOver, paint);
498 builder.DrawVertices(vertices_rt, flutter::DlBlendMode::kSrcOver, paint);
499 builder.DrawVertices(vertices_lb, flutter::DlBlendMode::kSrcOver, paint);
500 builder.DrawVertices(vertices_rb, flutter::DlBlendMode::kSrcOver, paint);
503 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
509 DrawVerticesTextureCoordinatesWithFragmentShaderNonZeroOrigin) {
510 std::vector<DlPoint> positions_lt = {
517 auto vertices = flutter::DlVertices::Make(
518 flutter::DlVertexMode::kTriangleStrip, positions_lt.size(),
520 positions_lt.data(),
nullptr,
524 flutter::DisplayListBuilder builder;
525 flutter::DlPaint paint;
526 flutter::DlPaint rect_paint;
527 rect_paint.setColor(DlColor::kBlue());
529 auto runtime_stages =
530 OpenAssetAsRuntimeStage(
"runtime_stage_position.frag.iplr");
534 ASSERT_TRUE(runtime_stage);
537 auto rect_data = std::vector<Rect>{
Rect::MakeLTRB(200, 200, 250, 250)};
539 auto uniform_data = std::make_shared<std::vector<uint8_t>>();
540 uniform_data->resize(rect_data.size() *
sizeof(
Rect));
541 memcpy(uniform_data->data(), rect_data.data(), uniform_data->size());
543 auto color_source = flutter::DlColorSource::MakeRuntimeEffect(
544 runtime_effect, {}, uniform_data);
546 paint.setColorSource(color_source);
548 builder.Scale(GetContentScale().
x, GetContentScale().y);
549 builder.DrawRect(DlRect::MakeLTRB(200, 200, 250, 250), rect_paint);
550 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
552 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
557 DisplayListBuilder builder;
559 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 10));
561 std::vector<DlPoint> vertex_coordinates = {
566 auto vertices = MakeVertices(DlVertexMode::kTriangleStrip, vertex_coordinates,
569 builder.DrawVertices(vertices, DlBlendMode::kSrcOver, paint);
570 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
static sk_sp< DlRuntimeEffect > Make(std::shared_ptr< impeller::RuntimeStage > runtime_stage)
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)