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"
26 #include "include/core/SkCanvas.h"
27 #include "include/core/SkMatrix.h"
28 #include "include/core/SkPath.h"
29 #include "include/core/SkRSXform.h"
30 #include "include/core/SkRefCnt.h"
38 SkRect GetCullRect(
ISize window_size) {
39 return SkRect::MakeSize(SkSize::Make(window_size.width, window_size.height));
44 DisplayListBuilder builder;
47 paint.setColor(DlColor::kYellow());
48 paint.setBlendMode(DlBlendMode::kSrc);
49 builder.DrawPaint(paint);
52 save_paint.setBlendMode(DlBlendMode::kMultiply);
53 builder.SaveLayer(
nullptr, &save_paint);
56 draw_paint.setColor(DlColor::kCornflowerBlue().modulateOpacity(0.75f));
57 builder.DrawPaint(draw_paint);
59 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
64 DisplayListBuilder builder;
67 paint.setColor(DlColor::kYellow());
68 paint.setBlendMode(DlBlendMode::kSrc);
69 builder.DrawPaint(paint);
71 auto filter = DlBlurImageFilter::Make(20.0, 20.0, DlTileMode::kDecal);
72 builder.SaveLayer(
nullptr,
nullptr, filter.get());
75 draw_paint.setColor(DlColor::kCornflowerBlue());
76 builder.DrawPaint(draw_paint);
78 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
82 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
84 const float matrix[20] = {
90 auto filter = DlMatrixColorFilter::Make(matrix);
93 paint.setColorFilter(filter);
94 builder.SaveLayer(
nullptr, &paint);
96 builder.Translate(500, 300);
100 draw_paint.setColor(DlColor::kBlue());
101 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
103 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
107 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
110 paint.setColorFilter(DlLinearToSrgbGammaColorFilter::kInstance);
111 builder.SaveLayer(
nullptr, &paint);
113 builder.Translate(500, 300);
117 draw_paint.setColor(DlColor::kBlue());
118 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
120 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
124 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
127 paint.setColorFilter(DlLinearToSrgbGammaColorFilter::kInstance);
128 builder.SaveLayer(
nullptr, &paint);
130 builder.Translate(500, 300);
134 draw_paint.setColor(DlColor::kBlue());
135 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
137 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
141 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
144 paint.setColor(DlColor::kBlue());
145 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
148 save_paint.setColor(DlColor::kBlack().withAlpha(128));
149 builder.SaveLayer(
nullptr, &save_paint);
150 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), paint);
153 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
157 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
160 paint.setColor(DlColor::kBlue());
161 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
164 paint.setColor(DlColor::kBlack().withAlpha(128));
165 paint.setColorFilter(
166 DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kDstOver));
167 builder.SaveLayer(
nullptr, &paint);
170 draw_paint.setColor(DlColor::kBlue());
171 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
174 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
178 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
181 paint.setColor(DlColor::kBlue());
182 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
185 save_paint.setColor(DlColor::kBlack().withAlpha(128));
186 save_paint.setImageFilter(DlColorFilterImageFilter::Make(
187 DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kDstOver)));
189 builder.SaveLayer(
nullptr, &save_paint);
192 draw_paint.setColor(DlColor::kBlue());
193 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
196 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
200 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
203 paint.setColor(DlColor::kBlue());
204 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
207 save_paint.setColor(DlColor::kBlack().withAlpha(128));
208 save_paint.setColorFilter(
209 DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kDstOver));
210 builder.SaveLayer(
nullptr, &save_paint);
213 draw_paint.setColor(DlColor::kBlue());
214 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
217 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
221 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
222 builder.Scale(GetContentScale().x, GetContentScale().y);
225 save_paint.setImageFilter(
226 DlBlurImageFilter::Make(10.0, 10.0, DlTileMode::kDecal));
227 builder.SaveLayer(
nullptr, &save_paint);
232 draw_paint.setColor(DlColor::kYellow());
233 builder.DrawPaint(draw_paint);
237 draw_rect.setColor(DlColor::kBlue());
238 builder.DrawRect(SkRect::MakeLTRB(125, 125, 175, 175), draw_rect);
242 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
246 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
249 builder.DrawImage(image, {100, 100}, DlImageSampling::kMipmapLinear);
252 paint.setColor(DlColor::kBlack().withAlpha(128));
253 builder.SaveLayer(
nullptr, &paint);
254 builder.DrawImage(image, {100, 500}, DlImageSampling::kMipmapLinear);
257 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
261 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
264 builder.DrawImage(image, {100, 100}, {});
266 const float matrix[20] = {
273 paint.setColor(DlColor::kBlack().withAlpha(128));
274 paint.setColorFilter(DlMatrixColorFilter::Make(matrix));
275 builder.SaveLayer(
nullptr, &paint);
276 builder.DrawImage(image, {100, 500}, {});
279 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
283 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
286 builder.DrawImage(image, {100, 100}, {});
288 const float matrix[20] = {
295 paint.setColor(DlColor::kBlack().withAlpha(128));
296 paint.setColorFilter(DlMatrixColorFilter::Make(matrix));
297 builder.SaveLayer(
nullptr, &paint);
298 builder.DrawImage(image, {100, 500}, {});
301 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
305 TranslucentSaveLayerWithColorFilterAndImageFilterDrawsCorrectly) {
306 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
309 builder.DrawImage(image, {100, 100}, {});
311 const float matrix[20] = {
318 paint.setColor(DlColor::kBlack().withAlpha(128));
319 paint.setImageFilter(
320 DlColorFilterImageFilter::Make(DlMatrixColorFilter::Make(matrix)));
321 paint.setColorFilter(
322 DlBlendColorFilter::Make(DlColor::kGreen(), DlBlendMode::kModulate));
323 builder.SaveLayer(
nullptr, &paint);
324 builder.DrawImage(image, {100, 500}, {});
327 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
331 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
334 paint.setColor(DlColor::kRed());
335 builder.DrawRect(SkRect::MakeXYWH(0, 0, 400, 400), paint);
338 save_paint.setAlpha(128);
339 save_paint.setBlendMode(DlBlendMode::kLighten);
340 builder.SaveLayer(
nullptr, &save_paint);
343 draw_paint.setColor(DlColor::kGreen());
344 builder.DrawCircle({200, 200}, 100, draw_paint);
347 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
354 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
357 paint.setColor(DlColor::kRed());
358 builder.DrawPaint(paint);
361 builder.SaveLayer({});
363 DlPaint yellow_paint;
364 yellow_paint.setColor(DlColor::kYellow());
365 builder.DrawCircle({100, 100}, 0.1, yellow_paint);
367 builder.SaveLayer({});
368 builder.DrawCircle({100, 100}, 0.1, yellow_paint);
372 draw_paint.setColor(DlColor::kGreen());
373 builder.DrawPaint(draw_paint);
375 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
379 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
382 paint.setColor(DlColor::kRed());
383 builder.DrawPaint(paint);
389 save_paint.setBlendMode(DlBlendMode::kSrc);
390 builder.SaveLayer(
nullptr, &save_paint);
393 draw_paint.setColor(DlColor::kGreen());
394 builder.DrawCircle({300, 300}, 100, draw_paint);
397 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
401 std::vector<SkPoint> points = {
411 paint_round.setColor(DlColor::kYellow().withAlpha(128));
412 paint_round.setStrokeCap(DlStrokeCap::kRound);
413 paint_round.setStrokeWidth(20);
415 DlPaint paint_square;
416 paint_square.setColor(DlColor::kYellow().withAlpha(128));
417 paint_square.setStrokeCap(DlStrokeCap::kSquare);
418 paint_square.setStrokeWidth(20);
421 background.setColor(DlColor::kBlack());
423 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
424 builder.DrawPaint(background);
425 builder.Translate(200, 200);
427 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
429 builder.Translate(150, 0);
430 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
433 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
438 CreateTextureForFixture(
"table_mountain_nx.png",
441 std::vector<SkPoint> points = {
451 auto image_src = std::make_shared<DlImageColorSource>(
452 texture, DlTileMode::kClamp, DlTileMode::kClamp);
455 paint_round.setStrokeCap(DlStrokeCap::kRound);
456 paint_round.setColorSource(image_src);
457 paint_round.setStrokeWidth(200);
459 DlPaint paint_square;
460 paint_square.setStrokeCap(DlStrokeCap::kSquare);
461 paint_square.setColorSource(image_src);
462 paint_square.setStrokeWidth(200);
464 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
465 builder.Translate(200, 200);
467 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
469 builder.Translate(150, 0);
470 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
473 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
478 texture_descriptor.
size =
ISize{1024, 1024};
483 std::vector<uint8_t> bytes(4194304);
484 bool alternate =
false;
485 for (
auto i = 0u; i < 4194304; i += 4) {
497 alternate = !alternate;
501 auto mapping = std::make_shared<fml::NonOwnedMapping>(
506 GetContext()->GetResourceAllocator()->CreateTexture(texture_descriptor);
509 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
510 auto command_buffer = GetContext()->CreateCommandBuffer();
511 auto blit_pass = command_buffer->CreateBlitPass();
515 blit_pass->GenerateMipmap(texture);
516 EXPECT_TRUE(blit_pass->EncodeCommands(GetContext()->GetResourceAllocator()));
517 EXPECT_TRUE(GetContext()->GetCommandQueue()->Submit({command_buffer}).ok());
521 DisplayListBuilder builder;
522 builder.DrawImageRect(
525 SkSize::Make(texture->GetSize().width, texture->GetSize().height)),
526 SkRect::MakeLTRB(0, 0, 100, 100), DlImageSampling::kMipmapLinear);
528 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
542 DisplayListBuilder builder;
543 builder.Translate(50, 50);
546 paint.setColor(DlColor::kBlue());
547 paint.setStrokeCap(DlStrokeCap::kRound);
548 paint.setStrokeWidth(10);
549 paint.setDrawStyle(DlDrawStyle::kStroke);
550 builder.DrawPath(path, paint);
552 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
556 auto bridge = CreateTextureForFixture(
"bay_bridge.jpg");
559 std::vector<uint8_t> bytes(100 * 100 * 4);
560 for (
auto i = 0u; i < bytes.size(); i += 4) {
567 std::make_shared<fml::NonOwnedMapping>(bytes.data(), bytes.size());
569 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
570 auto cmd_buffer = GetContext()->CreateCommandBuffer();
571 auto blit_pass = cmd_buffer->CreateBlitPass();
576 blit_pass->EncodeCommands(GetContext()->GetResourceAllocator()) &&
577 GetContext()->GetCommandQueue()->Submit({std::move(cmd_buffer)}).ok();
578 ASSERT_TRUE(did_submit);
582 DisplayListBuilder builder;
583 builder.DrawImage(image, {0, 0}, {});
585 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
590 auto context = MakeContext();
591 std::weak_ptr<Texture> weak_texture;
594 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
595 weak_texture = texture;
597 DisplayListBuilder builder;
598 builder.Scale(GetContentScale().x, GetContentScale().y);
599 builder.Translate(100.0f, 100.0f);
602 paint.setColorSource(std::make_shared<DlImageColorSource>(
604 DlImageSampling::kLinear,
nullptr));
606 builder.DrawRect(SkRect::MakeXYWH(0, 0, 600, 600), paint);
608 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
619 ASSERT_TRUE(weak_texture.expired()) <<
"When the texture is no longer in use "
620 "by the backend, it should be "
626 auto callback = [&]() -> sk_sp<DisplayList> {
628 ImGuiWindowFlags_AlwaysAutoResize)) {
629 ImGui::SliderFloat(
"Scale", &
scale, 1, 2);
632 DisplayListBuilder builder;
633 builder.Scale(GetContentScale().x, GetContentScale().y);
636 builder.Translate(600, -200);
638 SkMatrix matrix = SkMatrix::Scale(
scale,
scale);
640 paint.setImageFilter(
641 DlMatrixImageFilter::Make(matrix, DlImageSampling::kLinear));
642 builder.SaveLayer(
nullptr, &paint);
645 rect_paint.setAlpha(0.5 * 255);
646 builder.DrawImage(image, {0, 0}, DlImageSampling::kLinear, &rect_paint);
649 return builder.Build();
652 ASSERT_TRUE(OpenPlaygroundHere(callback));
656 DisplayListBuilder builder;
657 builder.Scale(GetContentScale().x, GetContentScale().y);
659 auto test = [&builder](
const std::shared_ptr<const DlImageFilter>& filter) {
660 auto DrawLine = [&builder](
const SkPoint& p0,
const SkPoint& p1,
663 paint.setDrawStyle(DlDrawStyle::kStroke);
664 builder.DrawPath(SkPath::Line(p0, p1), paint);
668 paint.setColor(DlColor::kWhite());
669 DrawLine(SkPoint::Make(75, 100), SkPoint::Make(225, 100), paint);
670 DrawLine(SkPoint::Make(75, 200), SkPoint::Make(225, 200), paint);
671 DrawLine(SkPoint::Make(100, 75), SkPoint::Make(100, 225), paint);
672 DrawLine(SkPoint::Make(200, 75), SkPoint::Make(200, 225), paint);
675 save_paint.setImageFilter(filter);
676 SkRect bounds = SkRect::MakeLTRB(100, 100, 200, 200);
677 builder.SaveLayer(&bounds, &save_paint);
682 paint.setColor(DlColor::kYellow());
683 builder.DrawPaint(paint);
686 paint.setColor(DlColor::kBlue());
687 builder.DrawRect(SkRect::MakeLTRB(125, 125, 175, 175), paint);
692 test(std::make_shared<DlBlurImageFilter>(10.0, 10.0, DlTileMode::kDecal));
694 builder.Translate(200.0, 0.0);
696 test(std::make_shared<DlDilateImageFilter>(10.0, 10.0));
698 builder.Translate(200.0, 0.0);
700 test(std::make_shared<DlErodeImageFilter>(10.0, 10.0));
702 builder.Translate(-400.0, 200.0);
704 SkMatrix sk_matrix = SkMatrix::RotateDeg(10);
706 auto rotate_filter = std::make_shared<DlMatrixImageFilter>(
707 sk_matrix, DlImageSampling::kLinear);
710 builder.Translate(200.0, 0.0);
712 const float m[20] = {
718 auto rgb_swap_filter = std::make_shared<DlColorFilterImageFilter>(
719 std::make_shared<DlMatrixColorFilter>(m));
720 test(rgb_swap_filter);
722 builder.Translate(200.0, 0.0);
724 test(DlComposeImageFilter::Make(rotate_filter, rgb_swap_filter));
726 builder.Translate(-400.0, 200.0);
728 test(std::make_shared<DlLocalMatrixImageFilter>(
729 SkMatrix::Translate(25.0, 25.0), rotate_filter));
731 builder.Translate(200.0, 0.0);
733 test(std::make_shared<DlLocalMatrixImageFilter>(
734 SkMatrix::Translate(25.0, 25.0), rgb_swap_filter));
736 builder.Translate(200.0, 0.0);
738 test(std::make_shared<DlLocalMatrixImageFilter>(
739 SkMatrix::Translate(25.0, 25.0),
740 DlComposeImageFilter::Make(rotate_filter, rgb_swap_filter)));
742 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
746 DisplayListBuilder builder;
749 paint.setColor(DlColor::kBlack());
750 builder.DrawPaint(paint);
751 builder.SaveLayer(
nullptr,
nullptr);
754 paint.setColor(DlColor::kGreen().withAlpha(0.5 * 255));
755 paint.setBlendMode(DlBlendMode::kPlus);
758 rect_paint.setColor(DlColor::kRed());
759 rect_paint.setStrokeWidth(4);
760 rect_paint.setDrawStyle(DlDrawStyle::kStroke);
761 builder.DrawRect(SkRect::MakeLTRB(0, 0, 300, 300), rect_paint);
762 builder.DrawCircle(SkPoint::Make(200, 200), 100, paint);
765 SkMatrix matrix = SkMatrix::Translate((100 + 100 *
k1OverSqrt2),
767 SkMatrix::Scale(0.5, 0.5) *
768 SkMatrix::Translate(-100, -100);
769 auto backdrop_filter =
770 DlMatrixImageFilter::Make(matrix, DlImageSampling::kLinear);
771 builder.SaveLayer(
nullptr,
nullptr, backdrop_filter.get());
776 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
780 DisplayListBuilder builder;
783 paint.setColor(DlColor::kBlack());
784 builder.DrawPaint(paint);
785 builder.SaveLayer(
nullptr,
nullptr);
787 paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
788 paint.setBlendMode(DlBlendMode::kPlus);
789 builder.DrawCircle({200, 200}, 100, paint);
793 SkMatrix matrix = SkMatrix::Translate((200 + 100 *
k1OverSqrt2),
795 SkMatrix::Scale(0.5, 0.5) *
796 SkMatrix::Translate(-200, -200);
798 save_paint.setImageFilter(
799 DlMatrixImageFilter::Make(matrix, DlImageSampling::kLinear));
801 builder.SaveLayer(
nullptr, &save_paint);
803 DlPaint circle_paint;
804 circle_paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
805 circle_paint.setBlendMode(DlBlendMode::kPlus);
806 builder.DrawCircle({200, 200}, 100, circle_paint);
811 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
816 std::vector<SkPoint> point = {
821 paint.setStrokeCap(DlStrokeCap::kRound);
822 paint.setColor(DlColor::kRed());
823 paint.setStrokeWidth(100 * 1000000);
825 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
826 builder.Translate(200, 200);
827 builder.Scale(0.000001, 0.000001);
829 builder.DrawPoints(DlCanvas::PointMode::kPoints, point.size(), point.data(),
832 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
837 std::vector<SkPoint> point = {
842 paint.setStrokeCap(DlStrokeCap::kRound);
843 paint.setColor(DlColor::kRed());
844 paint.setStrokeWidth(100 * 0.000001);
846 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
847 builder.Translate(200, 200);
848 builder.Scale(1000000, 1000000);
850 builder.DrawPoints(DlCanvas::PointMode::kPoints, point.size(), point.data(),
852 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
856 DisplayListBuilder builder;
858 builder.Scale(1.618, 1.618);
859 SkPath path = SkPath{}.addRect(SkRect::MakeXYWH(0, 0, 200, 100));
861 builder.DrawShadow(path, flutter::DlColor::kTransparent(), 15,
false, 1);
864 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
869 flutter::DisplayListBuilder sub_builder(
true);
870 sub_builder.DrawRect(SkRect::MakeXYWH(0, 0, 50, 50),
871 flutter::DlPaint(flutter::DlColor::kRed()));
872 auto display_list = sub_builder.Build();
879 DisplayListBuilder builder;
881 builder.Scale(2.0, 2.0);
882 builder.Translate(-93.0, 0.0);
885 builder.TransformFullPerspective(
886 0.8, -0.2, -0.1, -0.0,
889 63.2, 65.3, 48.6, 1.1
892 builder.Translate(35.0, 75.0);
893 builder.DrawDisplayList(display_list, 1.0f);
895 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
900 DisplayListBuilder builder;
904 builder.ClipRect(SkRect::MakeLTRB(50, 50, 100, 100),
905 DlCanvas::ClipOp::kDifference);
908 paint.setColor(DlColor::kRed());
909 builder.DrawRect(SkRect::MakeLTRB(0, 0, 100, 100), paint);
912 auto count = builder.GetSaveCount();
915 builder.ClipRect(SkRect::MakeLTRB(0, 0, 100, 100));
918 auto backdrop_filter =
919 DlBlurImageFilter::Make(10.0, 10.0, DlTileMode::kDecal);
920 builder.SaveLayer(
nullptr,
nullptr, backdrop_filter.get());
923 builder.RestoreToCount(count);
926 paint.setColor(DlColor::kGreen());
927 builder.DrawRect(SkRect::MakeLTRB(0, 0, 100, 100), paint);
929 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
933 DisplayListBuilder recorder_canvas;
935 paint.setColor(DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0));
936 recorder_canvas.DrawRect(SkRect::MakeXYWH(100.0, 100.0, 600, 600), paint);
937 paint.setColor(DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0));
938 recorder_canvas.DrawRect(SkRect::MakeXYWH(200.0, 200.0, 600, 600), paint);
940 DisplayListBuilder canvas;
942 paint.setColor(DlColor::kTransparent());
943 canvas.DrawPaint(paint);
949 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
950 canvas.DrawRect(SkRect::MakeSize({1000, 1000}), paint);
953 ASSERT_TRUE(OpenPlaygroundHere(canvas.Build()));
960 DisplayListBuilder recorder_builder;
962 DisplayListBuilder builder;
966 paint.setColor(DlColor::kTransparent());
967 builder.DrawPaint(paint);
974 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
975 recorder_builder.DrawRect(SkRect::MakeSize({1000, 1000}), paint);
978 ASSERT_TRUE(OpenPlaygroundHere(recorder_builder.Build()));
984 DisplayListBuilder builder;
986 SkPath path = SkPath::Circle(100, 100, 100);
988 builder.DrawPath(path, DlPaint()
989 .setColor(DlColor::kRed())
990 .setDrawStyle(DlDrawStyle::kStroke)
993 builder.ClipPath(path);
995 std::vector<SkPoint> points = {
996 SkPoint::Make(0, -200), SkPoint::Make(400, 200), SkPoint::Make(0, -100),
997 SkPoint::Make(400, 300), SkPoint::Make(0, 0), SkPoint::Make(400, 400),
998 SkPoint::Make(0, 100), SkPoint::Make(400, 500), SkPoint::Make(0, 150),
999 SkPoint::Make(400, 600)};
1001 builder.DrawPoints(DisplayListBuilder::PointMode::kLines, points.size(),
1003 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1006 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1012 DisplayListBuilder builder;
1014 SkPath path = SkPath::Circle(100, 100, 100);
1016 builder.DrawPath(path, DlPaint()
1017 .setColor(DlColor::kRed())
1018 .setDrawStyle(DlDrawStyle::kStroke)
1019 .setStrokeWidth(5));
1021 builder.ClipPath(path);
1023 std::vector<SkPoint> points = {
1024 SkPoint::Make(0, -200), SkPoint::Make(400, 200), SkPoint::Make(0, -100),
1025 SkPoint::Make(400, 300), SkPoint::Make(0, 0), SkPoint::Make(400, 400),
1026 SkPoint::Make(0, 100), SkPoint::Make(400, 500), SkPoint::Make(0, 150),
1027 SkPoint::Make(400, 600)};
1029 builder.DrawPoints(DisplayListBuilder::PointMode::kPolygon, points.size(),
1031 DlPaint().setColor(DlColor::kBlue()).setStrokeWidth(10));
1034 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));