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);
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()));
597 EnsureContextIsUnique();
600 std::weak_ptr<Texture> weak_texture;
603 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
604 weak_texture = texture;
606 DisplayListBuilder builder;
607 builder.Scale(GetContentScale().
x, GetContentScale().y);
608 builder.Translate(100.0f, 100.0f);
611 paint.setColorSource(DlColorSource::MakeImage(
613 DlImageSampling::kLinear,
nullptr));
615 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
617 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
628 ASSERT_TRUE(weak_texture.expired()) <<
"When the texture is no longer in use "
629 "by the backend, it should be "
635 auto callback = [&]() -> sk_sp<DisplayList> {
637 ImGuiWindowFlags_AlwaysAutoResize)) {
638 ImGui::SliderFloat(
"Scale", &scale, 1, 2);
641 DisplayListBuilder builder;
642 builder.Scale(GetContentScale().
x, GetContentScale().y);
645 builder.Translate(600, -200);
647 DlMatrix matrix = DlMatrix::MakeScale({scale, scale, 1});
649 paint.setImageFilter(
650 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear));
651 builder.SaveLayer(std::nullopt, &paint);
654 rect_paint.setAlpha(0.5 * 255);
655 builder.DrawImage(image,
DlPoint(0, 0), DlImageSampling::kLinear,
659 return builder.Build();
662 ASSERT_TRUE(OpenPlaygroundHere(callback));
666 DisplayListBuilder builder;
667 builder.Scale(GetContentScale().
x, GetContentScale().y);
669 auto test = [&builder](
const std::shared_ptr<DlImageFilter>& filter) {
673 paint.setDrawStyle(DlDrawStyle::kStroke);
674 builder.DrawPath(DlPath::MakeLine(p0,
p1), paint);
678 paint.setColor(DlColor::kWhite());
685 save_paint.setImageFilter(filter);
686 DlRect bounds = DlRect::MakeLTRB(100, 100, 200, 200);
687 builder.SaveLayer(bounds, &save_paint);
692 paint.setColor(DlColor::kYellow());
693 builder.DrawPaint(paint);
696 paint.setColor(DlColor::kBlue());
697 builder.DrawRect(DlRect::MakeLTRB(125, 125, 175, 175), paint);
702 test(DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal));
704 builder.Translate(200.0, 0.0);
706 test(DlImageFilter::MakeDilate(10.0, 10.0));
708 builder.Translate(200.0, 0.0);
710 test(DlImageFilter::MakeErode(10.0, 10.0));
712 builder.Translate(-400.0, 200.0);
714 DlMatrix matrix = DlMatrix::MakeRotationZ(DlDegrees(10));
717 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear);
720 builder.Translate(200.0, 0.0);
722 const float m[20] = {
728 auto rgb_swap_filter =
729 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(m));
730 test(rgb_swap_filter);
732 builder.Translate(200.0, 0.0);
734 test(DlImageFilter::MakeCompose(rotate_filter, rgb_swap_filter));
736 builder.Translate(-400.0, 200.0);
738 test(rotate_filter->makeWithLocalMatrix(
739 DlMatrix::MakeTranslation({25.0, 25.0})));
741 builder.Translate(200.0, 0.0);
743 test(rgb_swap_filter->makeWithLocalMatrix(
744 DlMatrix::MakeTranslation({25.0, 25.0})));
746 builder.Translate(200.0, 0.0);
748 test(DlImageFilter::MakeCompose(rotate_filter, rgb_swap_filter)
749 ->makeWithLocalMatrix(DlMatrix::MakeTranslation({25.0, 25.0})));
751 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
755 DisplayListBuilder builder;
758 paint.setColor(DlColor::kBlack());
759 builder.DrawPaint(paint);
760 builder.SaveLayer(std::nullopt,
nullptr);
763 paint.setColor(DlColor::kGreen().withAlpha(0.5 * 255));
764 paint.setBlendMode(DlBlendMode::kPlus);
767 rect_paint.setColor(DlColor::kRed());
768 rect_paint.setStrokeWidth(4);
769 rect_paint.setDrawStyle(DlDrawStyle::kStroke);
770 builder.DrawRect(DlRect::MakeLTRB(0, 0, 300, 300), rect_paint);
771 builder.DrawCircle(
DlPoint(200, 200), 100, paint);
774 DlMatrix matrix = DlMatrix::MakeTranslation({(100 + 100 *
k1OverSqrt2),
776 DlMatrix::MakeScale({0.5, 0.5, 1}) *
777 DlMatrix::MakeTranslation({-100, -100});
778 auto backdrop_filter =
779 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear);
780 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter.get());
785 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
789 DisplayListBuilder builder;
792 paint.setColor(DlColor::kBlack());
793 builder.DrawPaint(paint);
794 builder.SaveLayer(std::nullopt,
nullptr);
796 paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
797 paint.setBlendMode(DlBlendMode::kPlus);
798 builder.DrawCircle(
DlPoint(200, 200), 100, paint);
802 DlMatrix matrix = DlMatrix::MakeTranslation({(200 + 100 *
k1OverSqrt2),
804 DlMatrix::MakeScale({0.5, 0.5, 1}) *
805 DlMatrix::MakeTranslation({-200, -200});
807 save_paint.setImageFilter(
808 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear));
810 builder.SaveLayer(std::nullopt, &save_paint);
812 DlPaint circle_paint;
813 circle_paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
814 circle_paint.setBlendMode(DlBlendMode::kPlus);
815 builder.DrawCircle(
DlPoint(200, 200), 100, circle_paint);
820 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
825 std::vector<DlPoint> point = {
830 paint.setStrokeCap(DlStrokeCap::kRound);
831 paint.setColor(DlColor::kRed());
832 paint.setStrokeWidth(100 * 1000000);
834 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
835 builder.Translate(200, 200);
836 builder.Scale(0.000001, 0.000001);
838 builder.DrawPoints(DlPointMode::kPoints, point.size(), point.data(), paint);
840 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
845 std::vector<DlPoint> point = {
850 paint.setStrokeCap(DlStrokeCap::kRound);
851 paint.setColor(DlColor::kRed());
852 paint.setStrokeWidth(100 * 0.000001);
854 DisplayListBuilder builder(DlRect::MakeSize(GetWindowSize()));
855 builder.Translate(200, 200);
856 builder.Scale(1000000, 1000000);
858 builder.DrawPoints(DlPointMode::kPoints, point.size(), point.data(), paint);
859 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
863 DisplayListBuilder builder;
865 builder.Scale(1.618, 1.618);
866 DlPath path = DlPath::MakeRect(DlRect::MakeXYWH(0, 0, 200, 100));
868 builder.DrawShadow(path, flutter::DlColor::kTransparent(), 15,
false, 1);
871 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
876 flutter::DisplayListBuilder sub_builder(
true);
877 sub_builder.DrawRect(DlRect::MakeXYWH(0, 0, 50, 50),
878 flutter::DlPaint(flutter::DlColor::kRed()));
879 auto display_list = sub_builder.Build();
883 context.GetContentContext().GetRenderTargetCache()->CreateOffscreen(
884 *
context.GetContext(), {2400, 1800}, 1);
886 DisplayListBuilder builder;
888 builder.Scale(2.0, 2.0);
889 builder.Translate(-93.0, 0.0);
892 builder.TransformFullPerspective(
893 0.8, -0.2, -0.1, -0.0,
896 63.2, 65.3, 48.6, 1.1
899 builder.Translate(35.0, 75.0);
900 builder.DrawDisplayList(display_list, 1.0f);
902 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
907 DisplayListBuilder builder;
911 builder.ClipRect(DlRect::MakeLTRB(50, 50, 100, 100), DlClipOp::kDifference);
914 paint.setColor(DlColor::kRed());
915 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100, 100), paint);
918 auto count = builder.GetSaveCount();
921 builder.ClipRect(DlRect::MakeLTRB(0, 0, 100, 100));
924 auto backdrop_filter =
925 DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal);
926 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter.get());
929 builder.RestoreToCount(count);
932 paint.setColor(DlColor::kGreen());
933 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100, 100), paint);
935 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
939 DisplayListBuilder recorder_canvas;
941 paint.setColor(DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0));
942 recorder_canvas.DrawRect(DlRect::MakeXYWH(100.0, 100.0, 600, 600), paint);
943 paint.setColor(DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0));
944 recorder_canvas.DrawRect(DlRect::MakeXYWH(200.0, 200.0, 600, 600), paint);
946 DisplayListBuilder canvas;
948 paint.setColor(DlColor::kTransparent());
949 canvas.DrawPaint(paint);
955 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
956 canvas.DrawRect(DlRect::MakeWH(1000, 1000), paint);
959 ASSERT_TRUE(OpenPlaygroundHere(canvas.Build()));
966 DisplayListBuilder recorder_builder;
968 DisplayListBuilder builder;
972 paint.setColor(DlColor::kTransparent());
973 builder.DrawPaint(paint);
981 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
982 recorder_builder.DrawRect(DlRect::MakeWH(1000, 1000), paint);
985 ASSERT_TRUE(OpenPlaygroundHere(recorder_builder.Build()));
991 DisplayListBuilder builder;
995 builder.DrawPath(path, DlPaint()
996 .setColor(DlColor::kRed())
997 .setDrawStyle(DlDrawStyle::kStroke)
1000 builder.ClipPath(path);
1002 std::vector<DlPoint>
points = {
1003 DlPoint::MakeXY(0, -200), DlPoint::MakeXY(400, 200),
1004 DlPoint::MakeXY(0, -100), DlPoint::MakeXY(400, 300),
1005 DlPoint::MakeXY(0, 0), DlPoint::MakeXY(400, 400),
1006 DlPoint::MakeXY(0, 100), DlPoint::MakeXY(400, 500),
1007 DlPoint::MakeXY(0, 150), DlPoint::MakeXY(400, 600)};
1009 builder.DrawPoints(DlPointMode::kLines,
points.size(),
points.data(),
1010 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1013 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1019 DisplayListBuilder builder;
1023 builder.DrawPath(path, DlPaint()
1024 .setColor(DlColor::kRed())
1025 .setDrawStyle(DlDrawStyle::kStroke)
1026 .setStrokeWidth(5));
1028 builder.ClipPath(path);
1030 std::vector<DlPoint>
points = {
1031 DlPoint::MakeXY(0, -200), DlPoint::MakeXY(400, 200),
1032 DlPoint::MakeXY(0, -100), DlPoint::MakeXY(400, 300),
1033 DlPoint::MakeXY(0, 0), DlPoint::MakeXY(400, 400),
1034 DlPoint::MakeXY(0, 100), DlPoint::MakeXY(400, 500),
1035 DlPoint::MakeXY(0, 150), DlPoint::MakeXY(400, 600)};
1037 builder.DrawPoints(DlPointMode::kPolygon,
points.size(),
points.data(),
1038 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1041 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1047 DisplayListBuilder builder;
1048 DlPath path = DlPath::MakeArc(DlRect::MakeLTRB(0, 0, 100, 100), DlDegrees(0),
1052 builder.DrawPath(path, DlPaint().setColor(DlColor::kRed()));
1060 desc.
size = texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel();
1064 auto device_buffer = GetContext()->GetResourceAllocator()->CreateBuffer(desc);
1066 auto cmd_buffer = GetContext()->CreateCommandBuffer();
1067 auto blit_pass = cmd_buffer->CreateBlitPass();
1069 blit_pass->AddCopy(texture, device_buffer);
1070 blit_pass->EncodeCommands();
1072 auto latch = std::make_shared<fml::CountDownLatch>(1u);
1073 GetContext()->GetCommandQueue()->Submit(
1080 auto reupload_texture =
1081 GetContext()->GetResourceAllocator()->CreateTexture(tex_desc);
1085 auto cmd_buffer = GetContext()->CreateCommandBuffer();
1086 auto blit_pass = cmd_buffer->CreateBlitPass();
1089 blit_pass->ConvertTextureToShaderRead(texture);
1090 blit_pass->EncodeCommands();
1092 auto latch = std::make_shared<fml::CountDownLatch>(1u);
1093 GetContext()->GetCommandQueue()->Submit(
1100 DisplayListBuilder canvas;
1101 DlPaint paint = DlPaint();
1103 DlRect::MakeLTRB(0, 0, 100, 100),
1104 DlPaint().setColor(DlColor::kBlue()).setDrawStyle(DlDrawStyle::kStroke));
1106 DlImageSampling::kNearestNeighbor, &paint);
1109 DlRect::MakeLTRB(0, 100, 100, 200),
1110 DlPaint().setColor(DlColor::kRed()).setDrawStyle(DlDrawStyle::kStroke));
1112 DlImageSampling::kNearestNeighbor, &paint);
1113 OpenPlaygroundHere(canvas.Build());
1118 DisplayListBuilder builder;
1126 EXPECT_EQ(texture,
nullptr);
1130 DisplayListBuilder builder;
1132 std::shared_ptr<DlImageFilter> filter =
1133 DlImageFilter::MakeBlur(8, 8, DlTileMode::kClamp);
1134 builder.SaveLayer(std::nullopt,
nullptr, filter.get());
1144 EXPECT_FALSE(texture->NeedsMipmapGeneration());
static bool ImGuiBegin(const char *name, bool *p_open, ImGuiWindowFlags flags)
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, std::optional< PixelFormat > target_pixel_format)
Render the provided display list to a texture with the given size.
constexpr float k1OverSqrt2
std::shared_ptr< ContextGLES > context
std::shared_ptr< CommandBuffer > command_buffer
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