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.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"
34 #include "include/core/SkCanvas.h"
35 #include "include/core/SkMatrix.h"
36 #include "include/core/SkPath.h"
37 #include "include/core/SkRefCnt.h"
45 SkRect GetCullRect(
ISize window_size) {
46 return SkRect::MakeSize(SkSize::Make(window_size.width, window_size.height));
51 DisplayListBuilder builder;
54 paint.setColor(DlColor::kYellow());
55 paint.setBlendMode(DlBlendMode::kSrc);
56 builder.DrawPaint(paint);
59 save_paint.setBlendMode(DlBlendMode::kMultiply);
60 builder.SaveLayer(
nullptr, &save_paint);
63 draw_paint.setColor(DlColor::kCornflowerBlue().modulateOpacity(0.75f));
64 builder.DrawPaint(draw_paint);
66 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
71 DisplayListBuilder builder;
74 paint.setColor(DlColor::kYellow());
75 paint.setBlendMode(DlBlendMode::kSrc);
76 builder.DrawPaint(paint);
78 auto filter = DlImageFilter::MakeBlur(20.0, 20.0, DlTileMode::kDecal);
79 builder.SaveLayer(
nullptr,
nullptr, filter.get());
82 draw_paint.setColor(DlColor::kCornflowerBlue());
83 builder.DrawPaint(draw_paint);
85 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
89 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
91 const float matrix[20] = {
97 auto filter = DlColorFilter::MakeMatrix(matrix);
100 paint.setColorFilter(filter);
101 builder.SaveLayer(
nullptr, &paint);
103 builder.Translate(500, 300);
107 draw_paint.setColor(DlColor::kBlue());
108 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
110 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
114 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
117 paint.setColorFilter(DlColorFilter::MakeLinearToSrgbGamma());
118 builder.SaveLayer(
nullptr, &paint);
120 builder.Translate(500, 300);
124 draw_paint.setColor(DlColor::kBlue());
125 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
127 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
131 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
134 paint.setColorFilter(DlColorFilter::MakeLinearToSrgbGamma());
135 builder.SaveLayer(
nullptr, &paint);
137 builder.Translate(500, 300);
141 draw_paint.setColor(DlColor::kBlue());
142 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
144 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
148 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
151 paint.setColor(DlColor::kBlue());
152 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
155 save_paint.setColor(DlColor::kBlack().withAlpha(128));
156 builder.SaveLayer(
nullptr, &save_paint);
157 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), paint);
160 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
164 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
167 paint.setColor(DlColor::kBlue());
168 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
171 paint.setColor(DlColor::kBlack().withAlpha(128));
172 paint.setColorFilter(
173 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver));
175 builder.ClipRect(SkRect::MakeXYWH(100, 500, 300, 300));
176 builder.SaveLayer(
nullptr, &paint);
179 draw_paint.setColor(DlColor::kBlue());
180 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
184 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
188 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
191 paint.setColor(DlColor::kBlue());
192 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
195 save_paint.setColor(DlColor::kBlack().withAlpha(128));
196 save_paint.setImageFilter(DlImageFilter::MakeColorFilter(
197 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver)));
199 builder.SaveLayer(
nullptr, &save_paint);
202 draw_paint.setColor(DlColor::kBlue());
203 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
206 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
210 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
213 paint.setColor(DlColor::kBlue());
214 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
217 save_paint.setColor(DlColor::kBlack().withAlpha(128));
218 save_paint.setColorFilter(
219 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver));
221 builder.ClipRect(SkRect::MakeXYWH(100, 500, 300, 300));
222 builder.SaveLayer(
nullptr, &save_paint);
225 draw_paint.setColor(DlColor::kBlue());
226 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
230 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
234 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
235 builder.Scale(GetContentScale().
x, GetContentScale().y);
238 save_paint.setImageFilter(
239 DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal));
240 builder.SaveLayer(
nullptr, &save_paint);
245 draw_paint.setColor(DlColor::kYellow());
246 builder.DrawPaint(draw_paint);
250 draw_rect.setColor(DlColor::kBlue());
251 builder.DrawRect(SkRect::MakeLTRB(125, 125, 175, 175), draw_rect);
255 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
259 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
262 builder.DrawImage(image, SkPoint{100, 100}, DlImageSampling::kMipmapLinear);
265 paint.setColor(DlColor::kBlack().withAlpha(128));
266 builder.SaveLayer(
nullptr, &paint);
267 builder.DrawImage(image, SkPoint{100, 500}, DlImageSampling::kMipmapLinear);
270 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
274 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
277 builder.DrawImage(image, SkPoint{100, 100}, {});
279 const float matrix[20] = {
286 paint.setColor(DlColor::kBlack().withAlpha(128));
287 paint.setColorFilter(DlColorFilter::MakeMatrix(matrix));
288 builder.SaveLayer(
nullptr, &paint);
289 builder.DrawImage(image, SkPoint{100, 500}, {});
292 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
296 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
299 builder.DrawImage(image, SkPoint{100, 100}, {});
301 const float matrix[20] = {
308 paint.setColor(DlColor::kBlack().withAlpha(128));
309 paint.setColorFilter(DlColorFilter::MakeMatrix(matrix));
310 builder.SaveLayer(
nullptr, &paint);
311 builder.DrawImage(image, SkPoint{100, 500}, {});
314 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
318 TranslucentSaveLayerWithColorFilterAndImageFilterDrawsCorrectly) {
319 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
322 builder.DrawImage(image, SkPoint{100, 100}, {});
324 const float matrix[20] = {
331 paint.setColor(DlColor::kBlack().withAlpha(128));
332 paint.setImageFilter(
333 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix)));
334 paint.setColorFilter(
335 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kModulate));
336 builder.SaveLayer(
nullptr, &paint);
337 builder.DrawImage(image, SkPoint{100, 500}, {});
340 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
344 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
347 paint.setColor(DlColor::kRed());
348 builder.DrawRect(SkRect::MakeXYWH(0, 0, 400, 400), paint);
351 save_paint.setAlpha(128);
352 save_paint.setBlendMode(DlBlendMode::kLighten);
353 builder.SaveLayer(
nullptr, &save_paint);
356 draw_paint.setColor(DlColor::kGreen());
357 builder.DrawCircle(SkPoint{200, 200}, 100, draw_paint);
360 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
367 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
370 paint.setColor(DlColor::kRed());
371 builder.DrawPaint(paint);
374 builder.SaveLayer({});
376 DlPaint yellow_paint;
377 yellow_paint.setColor(DlColor::kYellow());
378 builder.DrawCircle(SkPoint{100, 100}, 0.1, yellow_paint);
380 builder.SaveLayer({});
381 builder.DrawCircle(SkPoint{100, 100}, 0.1, yellow_paint);
385 draw_paint.setColor(DlColor::kGreen());
386 builder.DrawPaint(draw_paint);
388 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
392 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
395 paint.setColor(DlColor::kRed());
396 builder.DrawPaint(paint);
402 save_paint.setBlendMode(DlBlendMode::kSrc);
403 builder.SaveLayer(
nullptr, &save_paint);
406 draw_paint.setColor(DlColor::kGreen());
407 builder.DrawCircle(SkPoint{300, 300}, 100, draw_paint);
410 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
414 std::vector<SkPoint> points = {
424 paint_round.setColor(DlColor::kYellow().withAlpha(128));
425 paint_round.setStrokeCap(DlStrokeCap::kRound);
426 paint_round.setStrokeWidth(20);
428 DlPaint paint_square;
429 paint_square.setColor(DlColor::kYellow().withAlpha(128));
430 paint_square.setStrokeCap(DlStrokeCap::kSquare);
431 paint_square.setStrokeWidth(20);
434 background.setColor(DlColor::kBlack());
436 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
437 builder.DrawPaint(background);
438 builder.Translate(200, 200);
440 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
442 builder.Translate(150, 0);
443 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
446 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
451 CreateTextureForFixture(
"table_mountain_nx.png",
454 std::vector<SkPoint> points = {
465 DlColorSource::MakeImage(texture, DlTileMode::kClamp, DlTileMode::kClamp);
468 paint_round.setStrokeCap(DlStrokeCap::kRound);
469 paint_round.setColorSource(image_src);
470 paint_round.setStrokeWidth(200);
472 DlPaint paint_square;
473 paint_square.setStrokeCap(DlStrokeCap::kSquare);
474 paint_square.setColorSource(image_src);
475 paint_square.setStrokeWidth(200);
477 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
478 builder.Translate(200, 200);
480 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
482 builder.Translate(150, 0);
483 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
486 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
491 texture_descriptor.
size =
ISize{1024, 1024};
496 std::vector<uint8_t> bytes(4194304);
497 bool alternate =
false;
498 for (
auto i = 0u; i < 4194304; i += 4) {
510 alternate = !alternate;
514 auto mapping = std::make_shared<fml::NonOwnedMapping>(
519 GetContext()->GetResourceAllocator()->CreateTexture(texture_descriptor);
522 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
523 auto command_buffer = GetContext()->CreateCommandBuffer();
524 auto blit_pass = command_buffer->CreateBlitPass();
528 blit_pass->GenerateMipmap(texture);
529 EXPECT_TRUE(blit_pass->EncodeCommands());
530 EXPECT_TRUE(GetContext()->GetCommandQueue()->Submit({command_buffer}).ok());
534 DisplayListBuilder builder;
535 builder.DrawImageRect(
538 SkSize::Make(texture->GetSize().width, texture->GetSize().height)),
539 SkRect::MakeLTRB(0, 0, 100, 100), DlImageSampling::kMipmapLinear);
541 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
555 DisplayListBuilder builder;
556 builder.Translate(50, 50);
559 paint.setColor(DlColor::kBlue());
560 paint.setStrokeCap(DlStrokeCap::kRound);
561 paint.setStrokeWidth(10);
562 paint.setDrawStyle(DlDrawStyle::kStroke);
563 builder.DrawPath(path, paint);
565 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
569 auto bridge = CreateTextureForFixture(
"bay_bridge.jpg");
572 std::vector<uint8_t> bytes(100 * 100 * 4);
573 for (
auto i = 0u; i < bytes.size(); i += 4) {
580 std::make_shared<fml::NonOwnedMapping>(bytes.data(), bytes.size());
582 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
583 auto cmd_buffer = GetContext()->CreateCommandBuffer();
584 auto blit_pass = cmd_buffer->CreateBlitPass();
589 blit_pass->EncodeCommands() &&
590 GetContext()->GetCommandQueue()->Submit({std::move(cmd_buffer)}).ok();
591 ASSERT_TRUE(did_submit);
595 DisplayListBuilder builder;
596 builder.DrawImage(image, SkPoint{0, 0}, {});
598 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
603 auto context = MakeContext();
604 std::weak_ptr<Texture> weak_texture;
607 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
608 weak_texture = texture;
610 DisplayListBuilder builder;
611 builder.Scale(GetContentScale().
x, GetContentScale().y);
612 builder.Translate(100.0f, 100.0f);
615 paint.setColorSource(DlColorSource::MakeImage(
617 DlImageSampling::kLinear,
nullptr));
619 builder.DrawRect(SkRect::MakeXYWH(0, 0, 600, 600), paint);
621 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
632 ASSERT_TRUE(weak_texture.expired()) <<
"When the texture is no longer in use "
633 "by the backend, it should be "
639 auto callback = [&]() -> sk_sp<DisplayList> {
641 ImGuiWindowFlags_AlwaysAutoResize)) {
642 ImGui::SliderFloat(
"Scale", &
scale, 1, 2);
645 DisplayListBuilder builder;
646 builder.Scale(GetContentScale().
x, GetContentScale().y);
649 builder.Translate(600, -200);
651 DlMatrix matrix = DlMatrix::MakeScale({
scale,
scale, 1});
653 paint.setImageFilter(
654 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear));
655 builder.SaveLayer(
nullptr, &paint);
658 rect_paint.setAlpha(0.5 * 255);
659 builder.DrawImage(image, SkPoint{0, 0}, DlImageSampling::kLinear,
663 return builder.Build();
666 ASSERT_TRUE(OpenPlaygroundHere(callback));
670 DisplayListBuilder builder;
671 builder.Scale(GetContentScale().
x, GetContentScale().y);
673 auto test = [&builder](
const std::shared_ptr<DlImageFilter>& filter) {
674 auto DrawLine = [&builder](
const SkPoint& p0,
const SkPoint& p1,
677 paint.setDrawStyle(DlDrawStyle::kStroke);
678 builder.DrawPath(SkPath::Line(p0, p1), paint);
682 paint.setColor(DlColor::kWhite());
683 DrawLine(SkPoint::Make(75, 100), SkPoint::Make(225, 100), paint);
684 DrawLine(SkPoint::Make(75, 200), SkPoint::Make(225, 200), paint);
685 DrawLine(SkPoint::Make(100, 75), SkPoint::Make(100, 225), paint);
686 DrawLine(SkPoint::Make(200, 75), SkPoint::Make(200, 225), paint);
689 save_paint.setImageFilter(filter);
690 SkRect bounds = SkRect::MakeLTRB(100, 100, 200, 200);
691 builder.SaveLayer(&bounds, &save_paint);
696 paint.setColor(DlColor::kYellow());
697 builder.DrawPaint(paint);
700 paint.setColor(DlColor::kBlue());
701 builder.DrawRect(SkRect::MakeLTRB(125, 125, 175, 175), paint);
706 test(DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal));
708 builder.Translate(200.0, 0.0);
710 test(DlImageFilter::MakeDilate(10.0, 10.0));
712 builder.Translate(200.0, 0.0);
714 test(DlImageFilter::MakeErode(10.0, 10.0));
716 builder.Translate(-400.0, 200.0);
718 DlMatrix matrix = DlMatrix::MakeRotationZ(DlDegrees(10));
721 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear);
724 builder.Translate(200.0, 0.0);
726 const float m[20] = {
732 auto rgb_swap_filter =
733 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(m));
734 test(rgb_swap_filter);
736 builder.Translate(200.0, 0.0);
738 test(DlImageFilter::MakeCompose(rotate_filter, rgb_swap_filter));
740 builder.Translate(-400.0, 200.0);
742 test(rotate_filter->makeWithLocalMatrix(
743 DlMatrix::MakeTranslation({25.0, 25.0})));
745 builder.Translate(200.0, 0.0);
747 test(rgb_swap_filter->makeWithLocalMatrix(
748 DlMatrix::MakeTranslation({25.0, 25.0})));
750 builder.Translate(200.0, 0.0);
752 test(DlImageFilter::MakeCompose(rotate_filter, rgb_swap_filter)
753 ->makeWithLocalMatrix(DlMatrix::MakeTranslation({25.0, 25.0})));
755 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
759 DisplayListBuilder builder;
762 paint.setColor(DlColor::kBlack());
763 builder.DrawPaint(paint);
764 builder.SaveLayer(
nullptr,
nullptr);
767 paint.setColor(DlColor::kGreen().withAlpha(0.5 * 255));
768 paint.setBlendMode(DlBlendMode::kPlus);
771 rect_paint.setColor(DlColor::kRed());
772 rect_paint.setStrokeWidth(4);
773 rect_paint.setDrawStyle(DlDrawStyle::kStroke);
774 builder.DrawRect(SkRect::MakeLTRB(0, 0, 300, 300), rect_paint);
775 builder.DrawCircle(SkPoint::Make(200, 200), 100, paint);
778 DlMatrix matrix = DlMatrix::MakeTranslation({(100 + 100 *
k1OverSqrt2),
780 DlMatrix::MakeScale({0.5, 0.5, 1}) *
781 DlMatrix::MakeTranslation({-100, -100});
782 auto backdrop_filter =
783 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear);
784 builder.SaveLayer(
nullptr,
nullptr, backdrop_filter.get());
789 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
793 DisplayListBuilder builder;
796 paint.setColor(DlColor::kBlack());
797 builder.DrawPaint(paint);
798 builder.SaveLayer(
nullptr,
nullptr);
800 paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
801 paint.setBlendMode(DlBlendMode::kPlus);
802 builder.DrawCircle(SkPoint{200, 200}, 100, paint);
806 DlMatrix matrix = DlMatrix::MakeTranslation({(200 + 100 *
k1OverSqrt2),
808 DlMatrix::MakeScale({0.5, 0.5, 1}) *
809 DlMatrix::MakeTranslation({-200, -200});
811 save_paint.setImageFilter(
812 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear));
814 builder.SaveLayer(
nullptr, &save_paint);
816 DlPaint circle_paint;
817 circle_paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
818 circle_paint.setBlendMode(DlBlendMode::kPlus);
819 builder.DrawCircle(SkPoint{200, 200}, 100, circle_paint);
824 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
829 std::vector<SkPoint> point = {
834 paint.setStrokeCap(DlStrokeCap::kRound);
835 paint.setColor(DlColor::kRed());
836 paint.setStrokeWidth(100 * 1000000);
838 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
839 builder.Translate(200, 200);
840 builder.Scale(0.000001, 0.000001);
842 builder.DrawPoints(DlCanvas::PointMode::kPoints, point.size(), point.data(),
845 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
850 std::vector<SkPoint> point = {
855 paint.setStrokeCap(DlStrokeCap::kRound);
856 paint.setColor(DlColor::kRed());
857 paint.setStrokeWidth(100 * 0.000001);
859 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
860 builder.Translate(200, 200);
861 builder.Scale(1000000, 1000000);
863 builder.DrawPoints(DlCanvas::PointMode::kPoints, point.size(), point.data(),
865 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
869 DisplayListBuilder builder;
871 builder.Scale(1.618, 1.618);
872 SkPath path = SkPath{}.addRect(SkRect::MakeXYWH(0, 0, 200, 100));
874 builder.DrawShadow(path, flutter::DlColor::kTransparent(), 15,
false, 1);
877 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
882 flutter::DisplayListBuilder sub_builder(
true);
883 sub_builder.DrawRect(SkRect::MakeXYWH(0, 0, 50, 50),
884 flutter::DlPaint(flutter::DlColor::kRed()));
885 auto display_list = sub_builder.Build();
892 DisplayListBuilder builder;
894 builder.Scale(2.0, 2.0);
895 builder.Translate(-93.0, 0.0);
898 builder.TransformFullPerspective(
899 0.8, -0.2, -0.1, -0.0,
902 63.2, 65.3, 48.6, 1.1
905 builder.Translate(35.0, 75.0);
906 builder.DrawDisplayList(display_list, 1.0f);
908 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
913 DisplayListBuilder builder;
917 builder.ClipRect(SkRect::MakeLTRB(50, 50, 100, 100),
918 DlCanvas::ClipOp::kDifference);
921 paint.setColor(DlColor::kRed());
922 builder.DrawRect(SkRect::MakeLTRB(0, 0, 100, 100), paint);
925 auto count = builder.GetSaveCount();
928 builder.ClipRect(SkRect::MakeLTRB(0, 0, 100, 100));
931 auto backdrop_filter =
932 DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal);
933 builder.SaveLayer(
nullptr,
nullptr, backdrop_filter.get());
936 builder.RestoreToCount(count);
939 paint.setColor(DlColor::kGreen());
940 builder.DrawRect(SkRect::MakeLTRB(0, 0, 100, 100), paint);
942 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
946 DisplayListBuilder recorder_canvas;
948 paint.setColor(DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0));
949 recorder_canvas.DrawRect(SkRect::MakeXYWH(100.0, 100.0, 600, 600), paint);
950 paint.setColor(DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0));
951 recorder_canvas.DrawRect(SkRect::MakeXYWH(200.0, 200.0, 600, 600), paint);
953 DisplayListBuilder canvas;
955 paint.setColor(DlColor::kTransparent());
956 canvas.DrawPaint(paint);
962 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
963 canvas.DrawRect(SkRect::MakeSize({1000, 1000}), paint);
966 ASSERT_TRUE(OpenPlaygroundHere(canvas.Build()));
973 DisplayListBuilder recorder_builder;
975 DisplayListBuilder builder;
979 paint.setColor(DlColor::kTransparent());
980 builder.DrawPaint(paint);
988 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
989 recorder_builder.DrawRect(SkRect::MakeSize({1000, 1000}), paint);
992 ASSERT_TRUE(OpenPlaygroundHere(recorder_builder.Build()));
998 DisplayListBuilder builder;
1000 SkPath path = SkPath::Circle(100, 100, 100);
1002 builder.DrawPath(path, DlPaint()
1003 .setColor(DlColor::kRed())
1004 .setDrawStyle(DlDrawStyle::kStroke)
1005 .setStrokeWidth(5));
1007 builder.ClipPath(path);
1009 std::vector<DlPoint> points = {
1010 DlPoint::MakeXY(0, -200), DlPoint::MakeXY(400, 200),
1011 DlPoint::MakeXY(0, -100), DlPoint::MakeXY(400, 300),
1012 DlPoint::MakeXY(0, 0), DlPoint::MakeXY(400, 400),
1013 DlPoint::MakeXY(0, 100), DlPoint::MakeXY(400, 500),
1014 DlPoint::MakeXY(0, 150), DlPoint::MakeXY(400, 600)};
1016 builder.DrawPoints(DisplayListBuilder::PointMode::kLines, points.size(),
1018 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1021 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1027 DisplayListBuilder builder;
1029 SkPath path = SkPath::Circle(100, 100, 100);
1031 builder.DrawPath(path, DlPaint()
1032 .setColor(DlColor::kRed())
1033 .setDrawStyle(DlDrawStyle::kStroke)
1034 .setStrokeWidth(5));
1036 builder.ClipPath(path);
1038 std::vector<DlPoint> points = {
1039 DlPoint::MakeXY(0, -200), DlPoint::MakeXY(400, 200),
1040 DlPoint::MakeXY(0, -100), DlPoint::MakeXY(400, 300),
1041 DlPoint::MakeXY(0, 0), DlPoint::MakeXY(400, 400),
1042 DlPoint::MakeXY(0, 100), DlPoint::MakeXY(400, 500),
1043 DlPoint::MakeXY(0, 150), DlPoint::MakeXY(400, 600)};
1045 builder.DrawPoints(DisplayListBuilder::PointMode::kPolygon, points.size(),
1047 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1050 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1056 DisplayListBuilder builder;
1063 builder.DrawPath(path, DlPaint().setColor(DlColor::kRed()));
1071 desc.
size = texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel();
1075 auto device_buffer = GetContext()->GetResourceAllocator()->CreateBuffer(desc);
1077 auto cmd_buffer = GetContext()->CreateCommandBuffer();
1078 auto blit_pass = cmd_buffer->CreateBlitPass();
1080 blit_pass->AddCopy(texture, device_buffer);
1081 blit_pass->EncodeCommands();
1083 auto latch = std::make_shared<fml::CountDownLatch>(1u);
1084 GetContext()->GetCommandQueue()->Submit(
1091 auto reupload_texture =
1092 GetContext()->GetResourceAllocator()->CreateTexture(tex_desc);
1096 auto cmd_buffer = GetContext()->CreateCommandBuffer();
1097 auto blit_pass = cmd_buffer->CreateBlitPass();
1100 blit_pass->ConvertTextureToShaderRead(texture);
1101 blit_pass->EncodeCommands();
1103 auto latch = std::make_shared<fml::CountDownLatch>(1u);
1104 GetContext()->GetCommandQueue()->Submit(
1111 DisplayListBuilder canvas;
1112 DlPaint paint = DlPaint();
1114 DlRect::MakeLTRB(0, 0, 100, 100),
1115 DlPaint().setColor(DlColor::kBlue()).setDrawStyle(DlDrawStyle::kStroke));
1117 DlImageSampling::kNearestNeighbor, &paint);
1120 DlRect::MakeLTRB(0, 100, 100, 200),
1121 DlPaint().setColor(DlColor::kRed()).setDrawStyle(DlDrawStyle::kStroke));
1123 DlImageSampling::kNearestNeighbor, &paint);
1124 OpenPlaygroundHere(canvas.Build());
1129 DisplayListBuilder builder;
1137 EXPECT_EQ(texture,
nullptr);
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)
Path TakePath(FillType fill=FillType::kNonZero)
PathBuilder & AddArc(const Rect &oval_bounds, Radians start, Radians sweep, bool use_center=false)
Paths are lightweight objects that describe a collection of linear, quadratic, or cubic segments....
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
A lightweight object that describes the attributes of a texture that can then used an allocator to cr...
constexpr size_t GetByteSizeOfBaseMipLevel() const