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"
23 #include "gtest/gtest.h"
36 #include "include/core/SkCanvas.h"
37 #include "include/core/SkMatrix.h"
38 #include "include/core/SkPath.h"
39 #include "include/core/SkRefCnt.h"
47 SkRect GetCullRect(
ISize window_size) {
48 return SkRect::MakeSize(SkSize::Make(window_size.width, window_size.height));
53 DisplayListBuilder builder;
56 paint.setColor(DlColor::kYellow());
57 paint.setBlendMode(DlBlendMode::kSrc);
58 builder.DrawPaint(paint);
61 save_paint.setBlendMode(DlBlendMode::kMultiply);
62 builder.SaveLayer(
nullptr, &save_paint);
65 draw_paint.setColor(DlColor::kCornflowerBlue().modulateOpacity(0.75f));
66 builder.DrawPaint(draw_paint);
68 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
73 DisplayListBuilder builder;
76 paint.setColor(DlColor::kYellow());
77 paint.setBlendMode(DlBlendMode::kSrc);
78 builder.DrawPaint(paint);
80 auto filter = DlImageFilter::MakeBlur(20.0, 20.0, DlTileMode::kDecal);
81 builder.SaveLayer(
nullptr,
nullptr, filter.get());
84 draw_paint.setColor(DlColor::kCornflowerBlue());
85 builder.DrawPaint(draw_paint);
87 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
91 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
93 const float matrix[20] = {
99 auto filter = DlColorFilter::MakeMatrix(matrix);
102 paint.setColorFilter(filter);
103 builder.SaveLayer(
nullptr, &paint);
105 builder.Translate(500, 300);
109 draw_paint.setColor(DlColor::kBlue());
110 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
112 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
116 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
119 paint.setColorFilter(DlColorFilter::MakeLinearToSrgbGamma());
120 builder.SaveLayer(
nullptr, &paint);
122 builder.Translate(500, 300);
126 draw_paint.setColor(DlColor::kBlue());
127 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
129 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
133 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
136 paint.setColorFilter(DlColorFilter::MakeLinearToSrgbGamma());
137 builder.SaveLayer(
nullptr, &paint);
139 builder.Translate(500, 300);
143 draw_paint.setColor(DlColor::kBlue());
144 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
146 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
150 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
153 paint.setColor(DlColor::kBlue());
154 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
157 save_paint.setColor(DlColor::kBlack().withAlpha(128));
158 builder.SaveLayer(
nullptr, &save_paint);
159 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), paint);
162 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
166 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
169 paint.setColor(DlColor::kBlue());
170 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
173 paint.setColor(DlColor::kBlack().withAlpha(128));
174 paint.setColorFilter(
175 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver));
177 builder.ClipRect(SkRect::MakeXYWH(100, 500, 300, 300));
178 builder.SaveLayer(
nullptr, &paint);
181 draw_paint.setColor(DlColor::kBlue());
182 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
186 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
190 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
193 paint.setColor(DlColor::kBlue());
194 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
197 save_paint.setColor(DlColor::kBlack().withAlpha(128));
198 save_paint.setImageFilter(DlImageFilter::MakeColorFilter(
199 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver)));
201 builder.SaveLayer(
nullptr, &save_paint);
204 draw_paint.setColor(DlColor::kBlue());
205 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
208 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
212 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
215 paint.setColor(DlColor::kBlue());
216 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
219 save_paint.setColor(DlColor::kBlack().withAlpha(128));
220 save_paint.setColorFilter(
221 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kDstOver));
223 builder.ClipRect(SkRect::MakeXYWH(100, 500, 300, 300));
224 builder.SaveLayer(
nullptr, &save_paint);
227 draw_paint.setColor(DlColor::kBlue());
228 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
232 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
236 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
237 builder.Scale(GetContentScale().
x, GetContentScale().y);
240 save_paint.setImageFilter(
241 DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal));
242 builder.SaveLayer(
nullptr, &save_paint);
247 draw_paint.setColor(DlColor::kYellow());
248 builder.DrawPaint(draw_paint);
252 draw_rect.setColor(DlColor::kBlue());
253 builder.DrawRect(SkRect::MakeLTRB(125, 125, 175, 175), draw_rect);
257 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
261 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
264 builder.DrawImage(image, SkPoint{100, 100}, DlImageSampling::kMipmapLinear);
267 paint.setColor(DlColor::kBlack().withAlpha(128));
268 builder.SaveLayer(
nullptr, &paint);
269 builder.DrawImage(image, SkPoint{100, 500}, DlImageSampling::kMipmapLinear);
272 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
276 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
279 builder.DrawImage(image, SkPoint{100, 100}, {});
281 const float matrix[20] = {
288 paint.setColor(DlColor::kBlack().withAlpha(128));
289 paint.setColorFilter(DlColorFilter::MakeMatrix(matrix));
290 builder.SaveLayer(
nullptr, &paint);
291 builder.DrawImage(image, SkPoint{100, 500}, {});
294 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
298 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
301 builder.DrawImage(image, SkPoint{100, 100}, {});
303 const float matrix[20] = {
310 paint.setColor(DlColor::kBlack().withAlpha(128));
311 paint.setColorFilter(DlColorFilter::MakeMatrix(matrix));
312 builder.SaveLayer(
nullptr, &paint);
313 builder.DrawImage(image, SkPoint{100, 500}, {});
316 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
320 TranslucentSaveLayerWithColorFilterAndImageFilterDrawsCorrectly) {
321 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
324 builder.DrawImage(image, SkPoint{100, 100}, {});
326 const float matrix[20] = {
333 paint.setColor(DlColor::kBlack().withAlpha(128));
334 paint.setImageFilter(
335 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix)));
336 paint.setColorFilter(
337 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kModulate));
338 builder.SaveLayer(
nullptr, &paint);
339 builder.DrawImage(image, SkPoint{100, 500}, {});
342 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
346 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
349 paint.setColor(DlColor::kRed());
350 builder.DrawRect(SkRect::MakeXYWH(0, 0, 400, 400), paint);
353 save_paint.setAlpha(128);
354 save_paint.setBlendMode(DlBlendMode::kLighten);
355 builder.SaveLayer(
nullptr, &save_paint);
358 draw_paint.setColor(DlColor::kGreen());
359 builder.DrawCircle(SkPoint{200, 200}, 100, draw_paint);
362 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
369 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
372 paint.setColor(DlColor::kRed());
373 builder.DrawPaint(paint);
376 builder.SaveLayer({});
378 DlPaint yellow_paint;
379 yellow_paint.setColor(DlColor::kYellow());
380 builder.DrawCircle(SkPoint{100, 100}, 0.1, yellow_paint);
382 builder.SaveLayer({});
383 builder.DrawCircle(SkPoint{100, 100}, 0.1, yellow_paint);
387 draw_paint.setColor(DlColor::kGreen());
388 builder.DrawPaint(draw_paint);
390 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
394 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
397 paint.setColor(DlColor::kRed());
398 builder.DrawPaint(paint);
404 save_paint.setBlendMode(DlBlendMode::kSrc);
405 builder.SaveLayer(
nullptr, &save_paint);
408 draw_paint.setColor(DlColor::kGreen());
409 builder.DrawCircle(SkPoint{300, 300}, 100, draw_paint);
412 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
416 std::vector<SkPoint> points = {
426 paint_round.setColor(DlColor::kYellow().withAlpha(128));
427 paint_round.setStrokeCap(DlStrokeCap::kRound);
428 paint_round.setStrokeWidth(20);
430 DlPaint paint_square;
431 paint_square.setColor(DlColor::kYellow().withAlpha(128));
432 paint_square.setStrokeCap(DlStrokeCap::kSquare);
433 paint_square.setStrokeWidth(20);
436 background.setColor(DlColor::kBlack());
438 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
439 builder.DrawPaint(background);
440 builder.Translate(200, 200);
442 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
444 builder.Translate(150, 0);
445 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
448 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
453 CreateTextureForFixture(
"table_mountain_nx.png",
456 std::vector<SkPoint> points = {
467 DlColorSource::MakeImage(texture, DlTileMode::kClamp, DlTileMode::kClamp);
470 paint_round.setStrokeCap(DlStrokeCap::kRound);
471 paint_round.setColorSource(image_src);
472 paint_round.setStrokeWidth(200);
474 DlPaint paint_square;
475 paint_square.setStrokeCap(DlStrokeCap::kSquare);
476 paint_square.setColorSource(image_src);
477 paint_square.setStrokeWidth(200);
479 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
480 builder.Translate(200, 200);
482 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
484 builder.Translate(150, 0);
485 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
488 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
493 texture_descriptor.
size =
ISize{1024, 1024};
498 std::vector<uint8_t> bytes(4194304);
499 bool alternate =
false;
500 for (
auto i = 0u; i < 4194304; i += 4) {
512 alternate = !alternate;
516 auto mapping = std::make_shared<fml::NonOwnedMapping>(
521 GetContext()->GetResourceAllocator()->CreateTexture(texture_descriptor);
524 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
525 auto command_buffer = GetContext()->CreateCommandBuffer();
526 auto blit_pass = command_buffer->CreateBlitPass();
530 blit_pass->GenerateMipmap(texture);
531 EXPECT_TRUE(blit_pass->EncodeCommands());
532 EXPECT_TRUE(GetContext()->GetCommandQueue()->Submit({command_buffer}).ok());
536 DisplayListBuilder builder;
537 builder.DrawImageRect(
540 SkSize::Make(texture->GetSize().width, texture->GetSize().height)),
541 SkRect::MakeLTRB(0, 0, 100, 100), DlImageSampling::kMipmapLinear);
543 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
557 DisplayListBuilder builder;
558 builder.Translate(50, 50);
561 paint.setColor(DlColor::kBlue());
562 paint.setStrokeCap(DlStrokeCap::kRound);
563 paint.setStrokeWidth(10);
564 paint.setDrawStyle(DlDrawStyle::kStroke);
565 builder.DrawPath(path, paint);
567 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
571 auto bridge = CreateTextureForFixture(
"bay_bridge.jpg");
574 std::vector<uint8_t> bytes(100 * 100 * 4);
575 for (
auto i = 0u; i < bytes.size(); i += 4) {
582 std::make_shared<fml::NonOwnedMapping>(bytes.data(), bytes.size());
584 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
585 auto cmd_buffer = GetContext()->CreateCommandBuffer();
586 auto blit_pass = cmd_buffer->CreateBlitPass();
591 blit_pass->EncodeCommands() &&
592 GetContext()->GetCommandQueue()->Submit({std::move(cmd_buffer)}).ok();
593 ASSERT_TRUE(did_submit);
597 DisplayListBuilder builder;
598 builder.DrawImage(image, SkPoint{0, 0}, {});
600 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
605 auto context = MakeContext();
606 std::weak_ptr<Texture> weak_texture;
609 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
610 weak_texture = texture;
612 DisplayListBuilder builder;
613 builder.Scale(GetContentScale().
x, GetContentScale().y);
614 builder.Translate(100.0f, 100.0f);
617 paint.setColorSource(DlColorSource::MakeImage(
619 DlImageSampling::kLinear,
nullptr));
621 builder.DrawRect(SkRect::MakeXYWH(0, 0, 600, 600), paint);
623 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
634 ASSERT_TRUE(weak_texture.expired()) <<
"When the texture is no longer in use "
635 "by the backend, it should be "
641 auto callback = [&]() -> sk_sp<DisplayList> {
643 ImGuiWindowFlags_AlwaysAutoResize)) {
644 ImGui::SliderFloat(
"Scale", &
scale, 1, 2);
647 DisplayListBuilder builder;
648 builder.Scale(GetContentScale().
x, GetContentScale().y);
651 builder.Translate(600, -200);
653 DlMatrix matrix = DlMatrix::MakeScale({
scale,
scale, 1});
655 paint.setImageFilter(
656 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear));
657 builder.SaveLayer(
nullptr, &paint);
660 rect_paint.setAlpha(0.5 * 255);
661 builder.DrawImage(image, SkPoint{0, 0}, DlImageSampling::kLinear,
665 return builder.Build();
668 ASSERT_TRUE(OpenPlaygroundHere(callback));
672 DisplayListBuilder builder;
673 builder.Scale(GetContentScale().
x, GetContentScale().y);
675 auto test = [&builder](
const std::shared_ptr<DlImageFilter>& filter) {
676 auto DrawLine = [&builder](
const SkPoint& p0,
const SkPoint& p1,
679 paint.setDrawStyle(DlDrawStyle::kStroke);
680 builder.DrawPath(SkPath::Line(p0, p1), paint);
684 paint.setColor(DlColor::kWhite());
685 DrawLine(SkPoint::Make(75, 100), SkPoint::Make(225, 100), paint);
686 DrawLine(SkPoint::Make(75, 200), SkPoint::Make(225, 200), paint);
687 DrawLine(SkPoint::Make(100, 75), SkPoint::Make(100, 225), paint);
688 DrawLine(SkPoint::Make(200, 75), SkPoint::Make(200, 225), paint);
691 save_paint.setImageFilter(filter);
692 SkRect bounds = SkRect::MakeLTRB(100, 100, 200, 200);
693 builder.SaveLayer(&bounds, &save_paint);
698 paint.setColor(DlColor::kYellow());
699 builder.DrawPaint(paint);
702 paint.setColor(DlColor::kBlue());
703 builder.DrawRect(SkRect::MakeLTRB(125, 125, 175, 175), paint);
708 test(DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal));
710 builder.Translate(200.0, 0.0);
712 test(DlImageFilter::MakeDilate(10.0, 10.0));
714 builder.Translate(200.0, 0.0);
716 test(DlImageFilter::MakeErode(10.0, 10.0));
718 builder.Translate(-400.0, 200.0);
720 DlMatrix matrix = DlMatrix::MakeRotationZ(DlDegrees(10));
723 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear);
726 builder.Translate(200.0, 0.0);
728 const float m[20] = {
734 auto rgb_swap_filter =
735 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(m));
736 test(rgb_swap_filter);
738 builder.Translate(200.0, 0.0);
740 test(DlImageFilter::MakeCompose(rotate_filter, rgb_swap_filter));
742 builder.Translate(-400.0, 200.0);
744 test(rotate_filter->makeWithLocalMatrix(
745 DlMatrix::MakeTranslation({25.0, 25.0})));
747 builder.Translate(200.0, 0.0);
749 test(rgb_swap_filter->makeWithLocalMatrix(
750 DlMatrix::MakeTranslation({25.0, 25.0})));
752 builder.Translate(200.0, 0.0);
754 test(DlImageFilter::MakeCompose(rotate_filter, rgb_swap_filter)
755 ->makeWithLocalMatrix(DlMatrix::MakeTranslation({25.0, 25.0})));
757 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
761 DisplayListBuilder builder;
764 paint.setColor(DlColor::kBlack());
765 builder.DrawPaint(paint);
766 builder.SaveLayer(
nullptr,
nullptr);
769 paint.setColor(DlColor::kGreen().withAlpha(0.5 * 255));
770 paint.setBlendMode(DlBlendMode::kPlus);
773 rect_paint.setColor(DlColor::kRed());
774 rect_paint.setStrokeWidth(4);
775 rect_paint.setDrawStyle(DlDrawStyle::kStroke);
776 builder.DrawRect(SkRect::MakeLTRB(0, 0, 300, 300), rect_paint);
777 builder.DrawCircle(SkPoint::Make(200, 200), 100, paint);
780 DlMatrix matrix = DlMatrix::MakeTranslation({(100 + 100 *
k1OverSqrt2),
782 DlMatrix::MakeScale({0.5, 0.5, 1}) *
783 DlMatrix::MakeTranslation({-100, -100});
784 auto backdrop_filter =
785 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear);
786 builder.SaveLayer(
nullptr,
nullptr, backdrop_filter.get());
791 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
795 DisplayListBuilder builder;
798 paint.setColor(DlColor::kBlack());
799 builder.DrawPaint(paint);
800 builder.SaveLayer(
nullptr,
nullptr);
802 paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
803 paint.setBlendMode(DlBlendMode::kPlus);
804 builder.DrawCircle(SkPoint{200, 200}, 100, paint);
808 DlMatrix matrix = DlMatrix::MakeTranslation({(200 + 100 *
k1OverSqrt2),
810 DlMatrix::MakeScale({0.5, 0.5, 1}) *
811 DlMatrix::MakeTranslation({-200, -200});
813 save_paint.setImageFilter(
814 DlImageFilter::MakeMatrix(matrix, DlImageSampling::kLinear));
816 builder.SaveLayer(
nullptr, &save_paint);
818 DlPaint circle_paint;
819 circle_paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
820 circle_paint.setBlendMode(DlBlendMode::kPlus);
821 builder.DrawCircle(SkPoint{200, 200}, 100, circle_paint);
826 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
831 std::vector<SkPoint> point = {
836 paint.setStrokeCap(DlStrokeCap::kRound);
837 paint.setColor(DlColor::kRed());
838 paint.setStrokeWidth(100 * 1000000);
840 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
841 builder.Translate(200, 200);
842 builder.Scale(0.000001, 0.000001);
844 builder.DrawPoints(DlCanvas::PointMode::kPoints, point.size(), point.data(),
847 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
852 std::vector<SkPoint> point = {
857 paint.setStrokeCap(DlStrokeCap::kRound);
858 paint.setColor(DlColor::kRed());
859 paint.setStrokeWidth(100 * 0.000001);
861 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
862 builder.Translate(200, 200);
863 builder.Scale(1000000, 1000000);
865 builder.DrawPoints(DlCanvas::PointMode::kPoints, point.size(), point.data(),
867 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
871 DisplayListBuilder builder;
873 builder.Scale(1.618, 1.618);
874 SkPath path = SkPath{}.addRect(SkRect::MakeXYWH(0, 0, 200, 100));
876 builder.DrawShadow(path, flutter::DlColor::kTransparent(), 15,
false, 1);
879 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
884 flutter::DisplayListBuilder sub_builder(
true);
885 sub_builder.DrawRect(SkRect::MakeXYWH(0, 0, 50, 50),
886 flutter::DlPaint(flutter::DlColor::kRed()));
887 auto display_list = sub_builder.Build();
894 DisplayListBuilder builder;
896 builder.Scale(2.0, 2.0);
897 builder.Translate(-93.0, 0.0);
900 builder.TransformFullPerspective(
901 0.8, -0.2, -0.1, -0.0,
904 63.2, 65.3, 48.6, 1.1
907 builder.Translate(35.0, 75.0);
908 builder.DrawDisplayList(display_list, 1.0f);
910 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
915 DisplayListBuilder builder;
919 builder.ClipRect(SkRect::MakeLTRB(50, 50, 100, 100),
920 DlCanvas::ClipOp::kDifference);
923 paint.setColor(DlColor::kRed());
924 builder.DrawRect(SkRect::MakeLTRB(0, 0, 100, 100), paint);
927 auto count = builder.GetSaveCount();
930 builder.ClipRect(SkRect::MakeLTRB(0, 0, 100, 100));
933 auto backdrop_filter =
934 DlImageFilter::MakeBlur(10.0, 10.0, DlTileMode::kDecal);
935 builder.SaveLayer(
nullptr,
nullptr, backdrop_filter.get());
938 builder.RestoreToCount(count);
941 paint.setColor(DlColor::kGreen());
942 builder.DrawRect(SkRect::MakeLTRB(0, 0, 100, 100), paint);
944 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
948 DisplayListBuilder recorder_canvas;
950 paint.setColor(DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0));
951 recorder_canvas.DrawRect(SkRect::MakeXYWH(100.0, 100.0, 600, 600), paint);
952 paint.setColor(DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0));
953 recorder_canvas.DrawRect(SkRect::MakeXYWH(200.0, 200.0, 600, 600), paint);
955 DisplayListBuilder canvas;
957 paint.setColor(DlColor::kTransparent());
958 canvas.DrawPaint(paint);
964 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
965 canvas.DrawRect(SkRect::MakeSize({1000, 1000}), paint);
968 ASSERT_TRUE(OpenPlaygroundHere(canvas.Build()));
975 DisplayListBuilder recorder_builder;
977 DisplayListBuilder builder;
981 paint.setColor(DlColor::kTransparent());
982 builder.DrawPaint(paint);
990 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
991 recorder_builder.DrawRect(SkRect::MakeSize({1000, 1000}), paint);
994 ASSERT_TRUE(OpenPlaygroundHere(recorder_builder.Build()));
1000 DisplayListBuilder builder;
1002 SkPath path = SkPath::Circle(100, 100, 100);
1004 builder.DrawPath(path, DlPaint()
1005 .setColor(DlColor::kRed())
1006 .setDrawStyle(DlDrawStyle::kStroke)
1007 .setStrokeWidth(5));
1009 builder.ClipPath(path);
1011 std::vector<DlPoint> points = {
1012 DlPoint::MakeXY(0, -200), DlPoint::MakeXY(400, 200),
1013 DlPoint::MakeXY(0, -100), DlPoint::MakeXY(400, 300),
1014 DlPoint::MakeXY(0, 0), DlPoint::MakeXY(400, 400),
1015 DlPoint::MakeXY(0, 100), DlPoint::MakeXY(400, 500),
1016 DlPoint::MakeXY(0, 150), DlPoint::MakeXY(400, 600)};
1018 builder.DrawPoints(DisplayListBuilder::PointMode::kLines, points.size(),
1020 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1023 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1029 DisplayListBuilder builder;
1031 SkPath path = SkPath::Circle(100, 100, 100);
1033 builder.DrawPath(path, DlPaint()
1034 .setColor(DlColor::kRed())
1035 .setDrawStyle(DlDrawStyle::kStroke)
1036 .setStrokeWidth(5));
1038 builder.ClipPath(path);
1040 std::vector<DlPoint> points = {
1041 DlPoint::MakeXY(0, -200), DlPoint::MakeXY(400, 200),
1042 DlPoint::MakeXY(0, -100), DlPoint::MakeXY(400, 300),
1043 DlPoint::MakeXY(0, 0), DlPoint::MakeXY(400, 400),
1044 DlPoint::MakeXY(0, 100), DlPoint::MakeXY(400, 500),
1045 DlPoint::MakeXY(0, 150), DlPoint::MakeXY(400, 600)};
1047 builder.DrawPoints(DisplayListBuilder::PointMode::kPolygon, points.size(),
1049 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1052 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1058 DisplayListBuilder builder;
1065 builder.DrawPath(path, DlPaint().setColor(DlColor::kRed()));
1073 desc.
size = texture->GetTextureDescriptor().GetByteSizeOfBaseMipLevel();
1077 auto device_buffer = GetContext()->GetResourceAllocator()->CreateBuffer(desc);
1079 auto cmd_buffer = GetContext()->CreateCommandBuffer();
1080 auto blit_pass = cmd_buffer->CreateBlitPass();
1082 blit_pass->AddCopy(texture, device_buffer);
1083 blit_pass->EncodeCommands();
1085 auto latch = std::make_shared<fml::CountDownLatch>(1u);
1086 GetContext()->GetCommandQueue()->Submit(
1093 auto reupload_texture =
1094 GetContext()->GetResourceAllocator()->CreateTexture(tex_desc);
1098 auto cmd_buffer = GetContext()->CreateCommandBuffer();
1099 auto blit_pass = cmd_buffer->CreateBlitPass();
1102 blit_pass->ConvertTextureToShaderRead(texture);
1103 blit_pass->EncodeCommands();
1105 auto latch = std::make_shared<fml::CountDownLatch>(1u);
1106 GetContext()->GetCommandQueue()->Submit(
1113 DisplayListBuilder canvas;
1114 DlPaint paint = DlPaint();
1116 DlRect::MakeLTRB(0, 0, 100, 100),
1117 DlPaint().setColor(DlColor::kBlue()).setDrawStyle(DlDrawStyle::kStroke));
1119 DlImageSampling::kNearestNeighbor, &paint);
1122 DlRect::MakeLTRB(0, 100, 100, 200),
1123 DlPaint().setColor(DlColor::kRed()).setDrawStyle(DlDrawStyle::kStroke));
1125 DlImageSampling::kNearestNeighbor, &paint);
1126 OpenPlaygroundHere(canvas.Build());
1131 DisplayListBuilder builder;
1139 EXPECT_EQ(texture,
nullptr);
1144 GTEST_SKIP() <<
"Only relevant for GLES";
1146 DisplayListBuilder builder;
1148 std::shared_ptr<DlImageFilter> filter =
1149 DlImageFilter::MakeBlur(8, 8, DlTileMode::kClamp);
1150 builder.SaveLayer(std::nullopt,
nullptr, filter.get());
1160 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)
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