7 #include "display_list/dl_sampling_options.h"
8 #include "display_list/dl_tile_mode.h"
9 #include "display_list/effects/dl_color_filter.h"
10 #include "display_list/effects/dl_color_source.h"
11 #include "display_list/effects/dl_image_filter.h"
12 #include "display_list/geometry/dl_geometry_types.h"
13 #include "display_list/geometry/dl_path_builder.h"
14 #include "display_list/image/dl_image.h"
17 #include "flutter/display_list/dl_blend_mode.h"
18 #include "flutter/display_list/dl_builder.h"
19 #include "flutter/display_list/dl_color.h"
20 #include "flutter/display_list/dl_paint.h"
21 #include "flutter/testing/testing.h"
22 #include "fml/synchronization/count_down_latch.h"
23 #include "gtest/gtest.h"
42 DisplayListBuilder builder;
45 paint.setColor(DlColor::kYellow());
46 paint.setBlendMode(DlBlendMode::kSrc);
47 builder.DrawPaint(paint);
50 save_paint.setBlendMode(DlBlendMode::kMultiply);
51 builder.SaveLayer(std::nullopt, &save_paint);
54 draw_paint.setColor(DlColor::kCornflowerBlue().modulateOpacity(0.75f));
55 builder.DrawPaint(draw_paint);
57 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
62 DisplayListBuilder builder;
65 paint.setColor(DlColor::kYellow());
66 paint.setBlendMode(DlBlendMode::kSrc);
67 builder.DrawPaint(paint);
69 auto filter = DlImageFilter::MakeBlur(20.0, 20.0, DlTileMode::kDecal);
70 builder.SaveLayer(std::nullopt,
nullptr, filter.get());
73 draw_paint.setColor(DlColor::kCornflowerBlue());
74 builder.DrawPaint(draw_paint);
76 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
80 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
81 builder.DrawPaint(DlPaint().setColor(DlColor::kWhite()));
83 const float matrix[20] = {
89 auto filter = DlColorFilter::MakeMatrix(matrix);
92 paint.setColorFilter(filter);
93 builder.SaveLayer(std::nullopt, &paint);
95 builder.Translate(500, 300);
99 draw_paint.setColor(DlColor::kBlue());
100 builder.DrawRect(DlRect::MakeXYWH(100, 100, 200, 200), draw_paint);
102 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
106 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
109 paint.setColorFilter(DlColorFilter::MakeLinearToSrgbGamma());
110 builder.SaveLayer(std::nullopt, &paint);
112 builder.Translate(500, 300);
116 draw_paint.setColor(DlColor::kBlue());
117 builder.DrawRect(DlRect::MakeXYWH(100, 100, 200, 200), draw_paint);
119 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
123 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
126 paint.setColorFilter(DlColorFilter::MakeLinearToSrgbGamma());
127 builder.SaveLayer(std::nullopt, &paint);
129 builder.Translate(500, 300);
133 draw_paint.setColor(DlColor::kBlue());
134 builder.DrawRect(DlRect::MakeXYWH(100, 100, 200, 200), draw_paint);
136 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
140 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
143 paint.setColor(DlColor::kBlue());
144 builder.DrawRect(DlRect::MakeXYWH(100, 100, 300, 300), paint);
147 save_paint.setColor(DlColor::kBlack().withAlpha(128));
148 builder.SaveLayer(std::nullopt, &save_paint);
149 builder.DrawRect(DlRect::MakeXYWH(100, 500, 300, 300), paint);
152 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
156 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
159 paint.setColor(DlColor::kBlue());
160 builder.DrawRect(DlRect::MakeXYWH(100, 100, 300, 300), paint);
163 paint.setColor(DlColor::kBlack().withAlpha(128));
164 paint.setColorFilter(
165 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver));
167 builder.ClipRect(DlRect::MakeXYWH(100, 500, 300, 300));
168 builder.SaveLayer(std::nullopt, &paint);
171 draw_paint.setColor(DlColor::kBlue());
172 builder.DrawRect(DlRect::MakeXYWH(100, 500, 300, 300), draw_paint);
176 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
180 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
183 paint.setColor(DlColor::kBlue());
184 builder.DrawRect(DlRect::MakeXYWH(100, 100, 300, 300), paint);
187 save_paint.setColor(DlColor::kBlack().withAlpha(128));
188 save_paint.setImageFilter(DlImageFilter::MakeColorFilter(
189 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver)));
191 builder.SaveLayer(std::nullopt, &save_paint);
194 draw_paint.setColor(DlColor::kBlue());
195 builder.DrawRect(DlRect::MakeXYWH(100, 500, 300, 300), draw_paint);
198 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
202 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
205 paint.setColor(DlColor::kBlue());
206 builder.DrawRect(DlRect::MakeXYWH(100, 100, 300, 300), paint);
209 save_paint.setColor(DlColor::kBlack().withAlpha(128));
210 save_paint.setColorFilter(
211 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver));
213 builder.ClipRect(DlRect::MakeXYWH(100, 500, 300, 300));
214 builder.SaveLayer(std::nullopt, &save_paint);
217 draw_paint.setColor(DlColor::kBlue());
218 builder.DrawRect(DlRect::MakeXYWH(100, 500, 300, 300), draw_paint);
222 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
226 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
227 builder.Scale(GetContentScale().
x, GetContentScale().y);
230 save_paint.setImageFilter(
231 DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal));
232 builder.SaveLayer(std::nullopt, &save_paint);
237 draw_paint.setColor(DlColor::kYellow());
238 builder.DrawPaint(draw_paint);
242 draw_rect.setColor(DlColor::kBlue());
243 builder.DrawRect(DlRect::MakeLTRB(125, 125, 175, 175), draw_rect);
247 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
251 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
254 builder.DrawImage(image,
DlPoint(100, 100), DlImageSampling::kMipmapLinear);
257 paint.setColor(DlColor::kBlack().withAlpha(128));
258 builder.SaveLayer(std::nullopt, &paint);
259 builder.DrawImage(image,
DlPoint(100, 500), DlImageSampling::kMipmapLinear);
262 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
266 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
269 builder.DrawImage(image,
DlPoint(100, 100), {});
271 const float matrix[20] = {
278 paint.setColor(DlColor::kBlack().withAlpha(128));
279 paint.setColorFilter(DlColorFilter::MakeMatrix(matrix));
280 builder.SaveLayer(std::nullopt, &paint);
281 builder.DrawImage(image,
DlPoint(100, 500), {});
284 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
288 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
291 builder.DrawImage(image,
DlPoint(100, 100), {});
293 const float matrix[20] = {
300 paint.setColor(DlColor::kBlack().withAlpha(128));
301 paint.setColorFilter(DlColorFilter::MakeMatrix(matrix));
302 builder.SaveLayer(std::nullopt, &paint);
303 builder.DrawImage(image,
DlPoint(100, 500), {});
306 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
310 TranslucentSaveLayerWithColorFilterAndImageFilterDrawsCorrectly) {
311 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
314 builder.DrawImage(image,
DlPoint(100, 100), {});
316 const float matrix[20] = {
323 paint.setColor(DlColor::kBlack().withAlpha(128));
324 paint.setImageFilter(
325 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix)));
326 paint.setColorFilter(
327 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kModulate));
328 builder.SaveLayer(std::nullopt, &paint);
329 builder.DrawImage(image,
DlPoint(100, 500), {});
332 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
336 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
339 paint.setColor(DlColor::kRed());
340 builder.DrawRect(DlRect::MakeXYWH(0, 0, 400, 400), paint);
343 save_paint.setAlpha(128);
344 save_paint.setBlendMode(DlBlendMode::kLighten);
345 builder.SaveLayer(std::nullopt, &save_paint);
348 draw_paint.setColor(DlColor::kGreen());
349 builder.DrawCircle(
DlPoint(200, 200), 100, draw_paint);
352 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
359 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
362 paint.setColor(DlColor::kRed());
363 builder.DrawPaint(paint);
366 builder.SaveLayer(std::nullopt);
368 DlPaint yellow_paint;
369 yellow_paint.setColor(DlColor::kYellow());
370 builder.DrawCircle(
DlPoint(100, 100), 0.1, yellow_paint);
372 builder.SaveLayer(std::nullopt);
373 builder.DrawCircle(
DlPoint(100, 100), 0.1, yellow_paint);
377 draw_paint.setColor(DlColor::kGreen());
378 builder.DrawPaint(draw_paint);
380 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
384 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
387 paint.setColor(DlColor::kRed());
388 builder.DrawPaint(paint);
394 save_paint.setBlendMode(DlBlendMode::kSrc);
395 builder.SaveLayer(std::nullopt, &save_paint);
398 draw_paint.setColor(DlColor::kGreen());
399 builder.DrawCircle(
DlPoint(300, 300), 100, draw_paint);
402 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
406 std::vector<DlPoint>
points = {
416 paint_round.setColor(DlColor::kYellow().withAlpha(128));
417 paint_round.setStrokeCap(DlStrokeCap::kRound);
418 paint_round.setStrokeWidth(20);
420 DlPaint paint_square;
421 paint_square.setColor(DlColor::kYellow().withAlpha(128));
422 paint_square.setStrokeCap(DlStrokeCap::kSquare);
423 paint_square.setStrokeWidth(20);
426 background.setColor(DlColor::kBlack());
428 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
429 builder.DrawPaint(background);
430 builder.Translate(200, 200);
432 builder.DrawPoints(DlPointMode::kPoints,
points.size(),
points.data(),
434 builder.Translate(150, 0);
435 builder.DrawPoints(DlPointMode::kPoints,
points.size(),
points.data(),
438 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
443 CreateTextureForFixture(
"table_mountain_nx.png",
446 std::vector<DlPoint>
points = {
457 DlColorSource::MakeImage(texture, DlTileMode::kClamp, DlTileMode::kClamp);
460 paint_round.setStrokeCap(DlStrokeCap::kRound);
461 paint_round.setColorSource(image_src);
462 paint_round.setStrokeWidth(200);
464 DlPaint paint_square;
465 paint_square.setStrokeCap(DlStrokeCap::kSquare);
466 paint_square.setColorSource(image_src);
467 paint_square.setStrokeWidth(200);
469 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
470 builder.Translate(200, 200);
472 builder.DrawPoints(DlPointMode::kPoints,
points.size(),
points.data(),
474 builder.Translate(150, 0);
475 builder.DrawPoints(DlPointMode::kPoints,
points.size(),
points.data(),
478 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
483 texture_descriptor.
size =
ISize{1024, 1024};
488 std::vector<uint8_t> bytes(4194304);
489 bool alternate =
false;
490 for (
auto i = 0u; i < 4194304; i += 4) {
502 alternate = !alternate;
506 auto mapping = std::make_shared<fml::NonOwnedMapping>(
511 GetContext()->GetResourceAllocator()->CreateTexture(texture_descriptor);
514 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
515 auto command_buffer = GetContext()->CreateCommandBuffer();
516 auto blit_pass = command_buffer->CreateBlitPass();
520 blit_pass->GenerateMipmap(texture);
521 EXPECT_TRUE(blit_pass->EncodeCommands());
522 EXPECT_TRUE(GetContext()->GetCommandQueue()->Submit({command_buffer}).ok());
526 DisplayListBuilder builder;
527 builder.DrawImageRect(
529 DlRect::MakeWH(texture->GetSize().width, texture->GetSize().height),
530 DlRect::MakeLTRB(0, 0, 100, 100), DlImageSampling::kMipmapLinear);
532 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
537 DlPathBuilder path_builder;
538 path_builder.MoveTo(
DlPoint(0, 400))
545 DlPath path = path_builder.TakePath();
547 DisplayListBuilder builder;
548 builder.Translate(50, 50);
551 paint.setColor(DlColor::kBlue());
552 paint.setStrokeCap(DlStrokeCap::kRound);
553 paint.setStrokeWidth(10);
554 paint.setDrawStyle(DlDrawStyle::kStroke);
555 builder.DrawPath(path, paint);
557 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
561 auto bridge = CreateTextureForFixture(
"bay_bridge.jpg");
564 std::vector<uint8_t> bytes(100 * 100 * 4);
565 for (
auto i = 0u; i < bytes.size(); i += 4) {
572 std::make_shared<fml::NonOwnedMapping>(bytes.data(), bytes.size());
574 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
575 auto cmd_buffer = GetContext()->CreateCommandBuffer();
576 auto blit_pass = cmd_buffer->CreateBlitPass();
581 blit_pass->EncodeCommands() &&
582 GetContext()->GetCommandQueue()->Submit({std::move(cmd_buffer)}).ok();
583 ASSERT_TRUE(did_submit);
587 DisplayListBuilder builder;
588 builder.DrawImage(image,
DlPoint(0, 0), {});
590 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
595 auto context = MakeContext();
596 std::weak_ptr<Texture> weak_texture;
599 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
600 weak_texture = texture;
602 DisplayListBuilder builder;
603 builder.Scale(GetContentScale().
x, GetContentScale().y);
604 builder.Translate(100.0f, 100.0f);
607 paint.setColorSource(DlColorSource::MakeImage(
609 DlImageSampling::kLinear,
nullptr));
611 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
613 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
624 ASSERT_TRUE(weak_texture.expired()) <<
"When the texture is no longer in use "
625 "by the backend, it should be "
631 auto callback = [&]() -> sk_sp<DisplayList> {
633 ImGuiWindowFlags_AlwaysAutoResize)) {
634 ImGui::SliderFloat(
"Scale", &scale, 1, 2);
637 DisplayListBuilder builder;
638 builder.Scale(GetContentScale().
x, GetContentScale().y);
641 builder.Translate(600, -200);
643 DlMatrix matrix = DlMatrix::MakeScale({scale, scale, 1});
645 paint.setImageFilter(
646 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear));
647 builder.SaveLayer(std::nullopt, &paint);
650 rect_paint.setAlpha(0.5 * 255);
651 builder.DrawImage(image,
DlPoint(0, 0), DlImageSampling::kLinear,
655 return builder.Build();
658 ASSERT_TRUE(OpenPlaygroundHere(callback));
662 DisplayListBuilder builder;
663 builder.Scale(GetContentScale().
x, GetContentScale().y);
665 auto test = [&builder](
const std::shared_ptr<DlImageFilter>& filter) {
669 paint.setDrawStyle(DlDrawStyle::kStroke);
670 builder.DrawPath(DlPath::MakeLine(p0, p1), paint);
674 paint.setColor(DlColor::kWhite());
681 save_paint.setImageFilter(filter);
682 DlRect bounds = DlRect::MakeLTRB(100, 100, 200, 200);
683 builder.SaveLayer(bounds, &save_paint);
688 paint.setColor(DlColor::kYellow());
689 builder.DrawPaint(paint);
692 paint.setColor(DlColor::kBlue());
693 builder.DrawRect(DlRect::MakeLTRB(125, 125, 175, 175), paint);
698 test(DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal));
700 builder.Translate(200.0, 0.0);
702 test(DlImageFilter::MakeDilate(10.0, 10.0));
704 builder.Translate(200.0, 0.0);
706 test(DlImageFilter::MakeErode(10.0, 10.0));
708 builder.Translate(-400.0, 200.0);
710 DlMatrix matrix = DlMatrix::MakeRotationZ(DlDegrees(10));
713 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear);
716 builder.Translate(200.0, 0.0);
718 const float m[20] = {
724 auto rgb_swap_filter =
725 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(m));
726 test(rgb_swap_filter);
728 builder.Translate(200.0, 0.0);
730 test(DlImageFilter::MakeCompose(rotate_filter, rgb_swap_filter));
732 builder.Translate(-400.0, 200.0);
734 test(rotate_filter->makeWithLocalMatrix(
735 DlMatrix::MakeTranslation({25.0, 25.0})));
737 builder.Translate(200.0, 0.0);
739 test(rgb_swap_filter->makeWithLocalMatrix(
740 DlMatrix::MakeTranslation({25.0, 25.0})));
742 builder.Translate(200.0, 0.0);
744 test(DlImageFilter::MakeCompose(rotate_filter, rgb_swap_filter)
745 ->makeWithLocalMatrix(DlMatrix::MakeTranslation({25.0, 25.0})));
747 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
751 DisplayListBuilder builder;
754 paint.setColor(DlColor::kBlack());
755 builder.DrawPaint(paint);
756 builder.SaveLayer(std::nullopt,
nullptr);
759 paint.setColor(DlColor::kGreen().withAlpha(0.5 * 255));
760 paint.setBlendMode(DlBlendMode::kPlus);
763 rect_paint.setColor(DlColor::kRed());
764 rect_paint.setStrokeWidth(4);
765 rect_paint.setDrawStyle(DlDrawStyle::kStroke);
766 builder.DrawRect(DlRect::MakeLTRB(0, 0, 300, 300), rect_paint);
767 builder.DrawCircle(
DlPoint(200, 200), 100, paint);
770 DlMatrix matrix = DlMatrix::MakeTranslation({(100 + 100 *
k1OverSqrt2),
772 DlMatrix::MakeScale({0.5, 0.5, 1}) *
773 DlMatrix::MakeTranslation({-100, -100});
774 auto backdrop_filter =
775 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear);
776 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter.get());
781 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
785 DisplayListBuilder builder;
788 paint.setColor(DlColor::kBlack());
789 builder.DrawPaint(paint);
790 builder.SaveLayer(std::nullopt,
nullptr);
792 paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
793 paint.setBlendMode(DlBlendMode::kPlus);
794 builder.DrawCircle(
DlPoint(200, 200), 100, paint);
798 DlMatrix matrix = DlMatrix::MakeTranslation({(200 + 100 *
k1OverSqrt2),
800 DlMatrix::MakeScale({0.5, 0.5, 1}) *
801 DlMatrix::MakeTranslation({-200, -200});
803 save_paint.setImageFilter(
804 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear));
806 builder.SaveLayer(std::nullopt, &save_paint);
808 DlPaint circle_paint;
809 circle_paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
810 circle_paint.setBlendMode(DlBlendMode::kPlus);
811 builder.DrawCircle(
DlPoint(200, 200), 100, circle_paint);
816 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
821 std::vector<DlPoint> point = {
826 paint.setStrokeCap(DlStrokeCap::kRound);
827 paint.setColor(DlColor::kRed());
828 paint.setStrokeWidth(100 * 1000000);
830 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
831 builder.Translate(200, 200);
832 builder.Scale(0.000001, 0.000001);
834 builder.DrawPoints(DlPointMode::kPoints, point.size(), point.data(), paint);
836 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
841 std::vector<DlPoint> point = {
846 paint.setStrokeCap(DlStrokeCap::kRound);
847 paint.setColor(DlColor::kRed());
848 paint.setStrokeWidth(100 * 0.000001);
850 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
851 builder.Translate(200, 200);
852 builder.Scale(1000000, 1000000);
854 builder.DrawPoints(DlPointMode::kPoints, point.size(), point.data(), paint);
855 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
859 DisplayListBuilder builder;
861 builder.Scale(1.618, 1.618);
862 DlPath path = DlPath::MakeRect(DlRect::MakeXYWH(0, 0, 200, 100));
864 builder.DrawShadow(path, flutter::DlColor::kTransparent(), 15,
false, 1);
867 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
872 flutter::DisplayListBuilder sub_builder(
true);
873 sub_builder.DrawRect(DlRect::MakeXYWH(0, 0, 50, 50),
874 flutter::DlPaint(flutter::DlColor::kRed()));
875 auto display_list = sub_builder.Build();
882 DisplayListBuilder builder;
884 builder.Scale(2.0, 2.0);
885 builder.Translate(-93.0, 0.0);
888 builder.TransformFullPerspective(
889 0.8, -0.2, -0.1, -0.0,
892 63.2, 65.3, 48.6, 1.1
895 builder.Translate(35.0, 75.0);
896 builder.DrawDisplayList(display_list, 1.0f);
898 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
903 DisplayListBuilder builder;
907 builder.ClipRect(DlRect::MakeLTRB(50, 50, 100, 100), DlClipOp::kDifference);
910 paint.setColor(DlColor::kRed());
911 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100, 100), paint);
914 auto count = builder.GetSaveCount();
917 builder.ClipRect(DlRect::MakeLTRB(0, 0, 100, 100));
920 auto backdrop_filter =
921 DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal);
922 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter.get());
925 builder.RestoreToCount(count);
928 paint.setColor(DlColor::kGreen());
929 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100, 100), paint);
931 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
935 DisplayListBuilder recorder_canvas;
937 paint.setColor(DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0));
938 recorder_canvas.DrawRect(DlRect::MakeXYWH(100.0, 100.0, 600, 600), paint);
939 paint.setColor(DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0));
940 recorder_canvas.DrawRect(DlRect::MakeXYWH(200.0, 200.0, 600, 600), paint);
942 DisplayListBuilder canvas;
944 paint.setColor(DlColor::kTransparent());
945 canvas.DrawPaint(paint);
951 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
952 canvas.DrawRect(DlRect::MakeWH(1000, 1000), paint);
955 ASSERT_TRUE(OpenPlaygroundHere(canvas.Build()));
962 DisplayListBuilder recorder_builder;
964 DisplayListBuilder builder;
968 paint.setColor(DlColor::kTransparent());
969 builder.DrawPaint(paint);
977 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
978 recorder_builder.DrawRect(DlRect::MakeWH(1000, 1000), paint);
981 ASSERT_TRUE(OpenPlaygroundHere(recorder_builder.Build()));
987 DisplayListBuilder builder;
991 builder.DrawPath(path, DlPaint()
992 .setColor(DlColor::kRed())
993 .setDrawStyle(DlDrawStyle::kStroke)
996 builder.ClipPath(path);
998 std::vector<DlPoint>
points = {
999 DlPoint::MakeXY(0, -200), DlPoint::MakeXY(400, 200),
1000 DlPoint::MakeXY(0, -100), DlPoint::MakeXY(400, 300),
1001 DlPoint::MakeXY(0, 0), DlPoint::MakeXY(400, 400),
1002 DlPoint::MakeXY(0, 100), DlPoint::MakeXY(400, 500),
1003 DlPoint::MakeXY(0, 150), DlPoint::MakeXY(400, 600)};
1005 builder.DrawPoints(DlPointMode::kLines,
points.size(),
points.data(),
1006 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1009 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1015 DisplayListBuilder builder;
1019 builder.DrawPath(path, DlPaint()
1020 .setColor(DlColor::kRed())
1021 .setDrawStyle(DlDrawStyle::kStroke)
1022 .setStrokeWidth(5));
1024 builder.ClipPath(path);
1026 std::vector<DlPoint>
points = {
1027 DlPoint::MakeXY(0, -200), DlPoint::MakeXY(400, 200),
1028 DlPoint::MakeXY(0, -100), DlPoint::MakeXY(400, 300),
1029 DlPoint::MakeXY(0, 0), DlPoint::MakeXY(400, 400),
1030 DlPoint::MakeXY(0, 100), DlPoint::MakeXY(400, 500),
1031 DlPoint::MakeXY(0, 150), DlPoint::MakeXY(400, 600)};
1033 builder.DrawPoints(DlPointMode::kPolygon,
points.size(),
points.data(),
1034 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1037 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1043 DisplayListBuilder builder;
1044 DlPath path = DlPath::MakeArc(DlRect::MakeLTRB(0, 0, 100, 100), DlDegrees(0),
1048 builder.DrawPath(path, DlPaint().setColor(DlColor::kRed()));
1056 desc.
size = texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel();
1060 auto device_buffer = GetContext()->GetResourceAllocator()->CreateBuffer(desc);
1062 auto cmd_buffer = GetContext()->CreateCommandBuffer();
1063 auto blit_pass = cmd_buffer->CreateBlitPass();
1065 blit_pass->AddCopy(texture, device_buffer);
1066 blit_pass->EncodeCommands();
1068 auto latch = std::make_shared<fml::CountDownLatch>(1u);
1069 GetContext()->GetCommandQueue()->Submit(
1076 auto reupload_texture =
1077 GetContext()->GetResourceAllocator()->CreateTexture(tex_desc);
1081 auto cmd_buffer = GetContext()->CreateCommandBuffer();
1082 auto blit_pass = cmd_buffer->CreateBlitPass();
1085 blit_pass->ConvertTextureToShaderRead(texture);
1086 blit_pass->EncodeCommands();
1088 auto latch = std::make_shared<fml::CountDownLatch>(1u);
1089 GetContext()->GetCommandQueue()->Submit(
1096 DisplayListBuilder canvas;
1097 DlPaint paint = DlPaint();
1099 DlRect::MakeLTRB(0, 0, 100, 100),
1100 DlPaint().setColor(DlColor::kBlue()).setDrawStyle(DlDrawStyle::kStroke));
1102 DlImageSampling::kNearestNeighbor, &paint);
1105 DlRect::MakeLTRB(0, 100, 100, 200),
1106 DlPaint().setColor(DlColor::kRed()).setDrawStyle(DlDrawStyle::kStroke));
1108 DlImageSampling::kNearestNeighbor, &paint);
1109 OpenPlaygroundHere(canvas.Build());
1114 DisplayListBuilder builder;
1122 EXPECT_EQ(texture,
nullptr);
1126 DisplayListBuilder builder;
1128 std::shared_ptr<DlImageFilter> filter =
1129 DlImageFilter::MakeBlur(8, 8, DlTileMode::kClamp);
1130 builder.SaveLayer(std::nullopt,
nullptr, filter.get());
1140 EXPECT_FALSE(texture->NeedsMipmapGeneration());
ContentContext & GetContentContext() const
std::shared_ptr< Context > GetContext() const
static bool ImGuiBegin(const char *name, bool *p_open, ImGuiWindowFlags flags)
const std::shared_ptr< RenderTargetAllocator > & GetRenderTargetCache() const
static BufferView AsBufferView(std::shared_ptr< DeviceBuffer > buffer)
Create a buffer view of this entire buffer.
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 float k1OverSqrt2
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
constexpr size_t MipCount() const
Return the mip count of the texture.
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
constexpr size_t GetByteSizeOfBaseMipLevel() const
std::vector< Point > points