6 #include "display_list/dl_sampling_options.h"
7 #include "display_list/dl_tile_mode.h"
8 #include "display_list/effects/dl_color_filter.h"
9 #include "display_list/effects/dl_color_source.h"
10 #include "display_list/effects/dl_image_filter.h"
11 #include "display_list/geometry/dl_geometry_types.h"
12 #include "display_list/image/dl_image.h"
15 #include "flutter/display_list/dl_blend_mode.h"
16 #include "flutter/display_list/dl_builder.h"
17 #include "flutter/display_list/dl_color.h"
18 #include "flutter/display_list/dl_paint.h"
19 #include "flutter/testing/testing.h"
24 #include "include/core/SkMatrix.h"
25 #include "include/core/SkRSXform.h"
26 #include "include/core/SkRefCnt.h"
34 SkRect GetCullRect(
ISize window_size) {
35 return SkRect::MakeSize(SkSize::Make(window_size.width, window_size.height));
40 DisplayListBuilder builder;
43 paint.setColor(DlColor::kYellow());
44 paint.setBlendMode(DlBlendMode::kSrc);
45 builder.DrawPaint(paint);
48 save_paint.setBlendMode(DlBlendMode::kMultiply);
49 builder.SaveLayer(
nullptr, &save_paint);
52 draw_paint.setColor(DlColor::kCornflowerBlue().modulateOpacity(0.75f));
53 builder.DrawPaint(draw_paint);
55 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
60 DisplayListBuilder builder;
63 paint.setColor(DlColor::kYellow());
64 paint.setBlendMode(DlBlendMode::kSrc);
65 builder.DrawPaint(paint);
67 auto filter = DlBlurImageFilter::Make(20.0, 20.0, DlTileMode::kDecal);
68 builder.SaveLayer(
nullptr,
nullptr, filter.get());
71 draw_paint.setColor(DlColor::kCornflowerBlue());
72 builder.DrawPaint(draw_paint);
74 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
78 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
80 const float matrix[20] = {
86 auto filter = DlMatrixColorFilter::Make(matrix);
89 paint.setColorFilter(filter);
90 builder.SaveLayer(
nullptr, &paint);
92 builder.Translate(500, 300);
96 draw_paint.setColor(DlColor::kBlue());
97 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
99 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
103 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
106 paint.setColorFilter(DlLinearToSrgbGammaColorFilter::kInstance);
107 builder.SaveLayer(
nullptr, &paint);
109 builder.Translate(500, 300);
113 draw_paint.setColor(DlColor::kBlue());
114 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
116 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
120 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
123 paint.setColorFilter(DlLinearToSrgbGammaColorFilter::kInstance);
124 builder.SaveLayer(
nullptr, &paint);
126 builder.Translate(500, 300);
130 draw_paint.setColor(DlColor::kBlue());
131 builder.DrawRect(SkRect::MakeXYWH(100, 100, 200, 200), draw_paint);
133 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
137 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
140 paint.setColor(DlColor::kBlue());
141 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
144 save_paint.setColor(DlColor::kBlack().withAlpha(128));
145 builder.SaveLayer(
nullptr, &save_paint);
146 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), paint);
149 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
153 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
156 paint.setColor(DlColor::kBlue());
157 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
160 paint.setColor(DlColor::kBlack().withAlpha(128));
161 paint.setColorFilter(
162 DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kDstOver));
163 builder.SaveLayer(
nullptr, &paint);
166 draw_paint.setColor(DlColor::kBlue());
167 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
170 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
174 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
177 paint.setColor(DlColor::kBlue());
178 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
181 save_paint.setColor(DlColor::kBlack().withAlpha(128));
182 save_paint.setImageFilter(DlColorFilterImageFilter::Make(
183 DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kDstOver)));
185 builder.SaveLayer(
nullptr, &save_paint);
188 draw_paint.setColor(DlColor::kBlue());
189 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
192 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
196 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
199 paint.setColor(DlColor::kBlue());
200 builder.DrawRect(SkRect::MakeXYWH(100, 100, 300, 300), paint);
203 save_paint.setColor(DlColor::kBlack().withAlpha(128));
204 save_paint.setColorFilter(
205 DlBlendColorFilter::Make(DlColor::kRed(), DlBlendMode::kDstOver));
206 builder.SaveLayer(
nullptr, &save_paint);
209 draw_paint.setColor(DlColor::kBlue());
210 builder.DrawRect(SkRect::MakeXYWH(100, 500, 300, 300), draw_paint);
213 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
217 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
218 builder.Scale(GetContentScale().x, GetContentScale().y);
221 save_paint.setImageFilter(
222 DlBlurImageFilter::Make(10.0, 10.0, DlTileMode::kDecal));
223 builder.SaveLayer(
nullptr, &save_paint);
228 draw_paint.setColor(DlColor::kYellow());
229 builder.DrawPaint(draw_paint);
233 draw_rect.setColor(DlColor::kBlue());
234 builder.DrawRect(SkRect::MakeLTRB(125, 125, 175, 175), draw_rect);
238 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
242 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
245 builder.DrawImage(image, {100, 100}, DlImageSampling::kMipmapLinear);
248 paint.setColor(DlColor::kBlack().withAlpha(128));
249 builder.SaveLayer(
nullptr, &paint);
250 builder.DrawImage(image, {100, 500}, DlImageSampling::kMipmapLinear);
253 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
257 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
260 builder.DrawImage(image, {100, 100}, {});
262 const float matrix[20] = {
269 paint.setColor(DlColor::kBlack().withAlpha(128));
270 paint.setColorFilter(DlMatrixColorFilter::Make(matrix));
271 builder.SaveLayer(
nullptr, &paint);
272 builder.DrawImage(image, {100, 500}, {});
275 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
279 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
282 builder.DrawImage(image, {100, 100}, {});
284 const float matrix[20] = {
291 paint.setColor(DlColor::kBlack().withAlpha(128));
292 paint.setColorFilter(DlMatrixColorFilter::Make(matrix));
293 builder.SaveLayer(
nullptr, &paint);
294 builder.DrawImage(image, {100, 500}, {});
297 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
301 TranslucentSaveLayerWithColorFilterAndImageFilterDrawsCorrectly) {
302 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
305 builder.DrawImage(image, {100, 100}, {});
307 const float matrix[20] = {
314 paint.setColor(DlColor::kBlack().withAlpha(128));
315 paint.setImageFilter(
316 DlColorFilterImageFilter::Make(DlMatrixColorFilter::Make(matrix)));
317 paint.setColorFilter(
318 DlBlendColorFilter::Make(DlColor::kGreen(), DlBlendMode::kModulate));
319 builder.SaveLayer(
nullptr, &paint);
320 builder.DrawImage(image, {100, 500}, {});
323 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
327 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
330 paint.setColor(DlColor::kRed());
331 builder.DrawRect(SkRect::MakeXYWH(0, 0, 400, 400), paint);
334 save_paint.setAlpha(128);
335 save_paint.setBlendMode(DlBlendMode::kLighten);
336 builder.SaveLayer(
nullptr, &save_paint);
339 draw_paint.setColor(DlColor::kGreen());
340 builder.DrawCircle({200, 200}, 100, draw_paint);
343 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
350 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
353 paint.setColor(DlColor::kRed());
354 builder.DrawPaint(paint);
357 builder.SaveLayer({});
359 DlPaint yellow_paint;
360 yellow_paint.setColor(DlColor::kYellow());
361 builder.DrawCircle({100, 100}, 0.1, yellow_paint);
363 builder.SaveLayer({});
364 builder.DrawCircle({100, 100}, 0.1, yellow_paint);
368 draw_paint.setColor(DlColor::kGreen());
369 builder.DrawPaint(draw_paint);
371 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
375 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
378 paint.setColor(DlColor::kRed());
379 builder.DrawPaint(paint);
385 save_paint.setBlendMode(DlBlendMode::kSrc);
386 builder.SaveLayer(
nullptr, &save_paint);
389 draw_paint.setColor(DlColor::kGreen());
390 builder.DrawCircle({300, 300}, 100, draw_paint);
393 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
397 std::vector<SkPoint> points = {
407 paint_round.setColor(DlColor::kYellow().withAlpha(128));
408 paint_round.setStrokeCap(DlStrokeCap::kRound);
409 paint_round.setStrokeWidth(20);
411 DlPaint paint_square;
412 paint_square.setColor(DlColor::kYellow().withAlpha(128));
413 paint_square.setStrokeCap(DlStrokeCap::kSquare);
414 paint_square.setStrokeWidth(20);
417 background.setColor(DlColor::kBlack());
419 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
420 builder.DrawPaint(background);
421 builder.Translate(200, 200);
423 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
425 builder.Translate(150, 0);
426 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
429 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
434 CreateTextureForFixture(
"table_mountain_nx.png",
437 std::vector<SkPoint> points = {
447 auto image_src = std::make_shared<DlImageColorSource>(
448 texture, DlTileMode::kClamp, DlTileMode::kClamp);
451 paint_round.setStrokeCap(DlStrokeCap::kRound);
452 paint_round.setColorSource(image_src);
453 paint_round.setStrokeWidth(200);
455 DlPaint paint_square;
456 paint_square.setStrokeCap(DlStrokeCap::kSquare);
457 paint_square.setColorSource(image_src);
458 paint_square.setStrokeWidth(200);
460 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
461 builder.Translate(200, 200);
463 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
465 builder.Translate(150, 0);
466 builder.DrawPoints(DlCanvas::PointMode::kPoints, points.size(), points.data(),
469 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
474 texture_descriptor.
size =
ISize{1024, 1024};
479 std::vector<uint8_t> bytes(4194304);
480 bool alternate =
false;
481 for (
auto i = 0u; i < 4194304; i += 4) {
493 alternate = !alternate;
497 auto mapping = std::make_shared<fml::NonOwnedMapping>(
502 GetContext()->GetResourceAllocator()->CreateTexture(texture_descriptor);
505 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
506 auto command_buffer = GetContext()->CreateCommandBuffer();
507 auto blit_pass = command_buffer->CreateBlitPass();
511 blit_pass->GenerateMipmap(texture);
512 EXPECT_TRUE(blit_pass->EncodeCommands(GetContext()->GetResourceAllocator()));
513 EXPECT_TRUE(GetContext()->GetCommandQueue()->Submit({command_buffer}).ok());
517 DisplayListBuilder builder;
518 builder.DrawImageRect(
521 SkSize::Make(texture->GetSize().width, texture->GetSize().height)),
522 SkRect::MakeLTRB(0, 0, 100, 100), DlImageSampling::kMipmapLinear);
524 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
538 DisplayListBuilder builder;
539 builder.Translate(50, 50);
542 paint.setColor(DlColor::kBlue());
543 paint.setStrokeCap(DlStrokeCap::kRound);
544 paint.setStrokeWidth(10);
545 paint.setDrawStyle(DlDrawStyle::kStroke);
546 builder.DrawPath(path, paint);
548 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
552 auto bridge = CreateTextureForFixture(
"bay_bridge.jpg");
555 std::vector<uint8_t> bytes(100 * 100 * 4);
556 for (
auto i = 0u; i < bytes.size(); i += 4) {
563 std::make_shared<fml::NonOwnedMapping>(bytes.data(), bytes.size());
565 GetContext()->GetResourceAllocator()->CreateBufferWithCopy(*mapping);
566 auto cmd_buffer = GetContext()->CreateCommandBuffer();
567 auto blit_pass = cmd_buffer->CreateBlitPass();
572 blit_pass->EncodeCommands(GetContext()->GetResourceAllocator()) &&
573 GetContext()->GetCommandQueue()->Submit({std::move(cmd_buffer)}).ok();
574 ASSERT_TRUE(did_submit);
578 DisplayListBuilder builder;
579 builder.DrawImage(image, {0, 0}, {});
581 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
586 auto context = MakeContext();
587 std::weak_ptr<Texture> weak_texture;
590 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
591 weak_texture = texture;
593 DisplayListBuilder builder;
594 builder.Scale(GetContentScale().x, GetContentScale().y);
595 builder.Translate(100.0f, 100.0f);
598 paint.setColorSource(std::make_shared<DlImageColorSource>(
600 DlImageSampling::kLinear,
nullptr));
602 builder.DrawRect(SkRect::MakeXYWH(0, 0, 600, 600), paint);
604 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
615 ASSERT_TRUE(weak_texture.expired()) <<
"When the texture is no longer in use "
616 "by the backend, it should be "
622 auto callback = [&]() -> sk_sp<DisplayList> {
624 ImGuiWindowFlags_AlwaysAutoResize)) {
625 ImGui::SliderFloat(
"Scale", &
scale, 1, 2);
628 DisplayListBuilder builder;
629 builder.Scale(GetContentScale().x, GetContentScale().y);
632 builder.Translate(600, -200);
634 SkMatrix matrix = SkMatrix::Scale(
scale,
scale);
636 paint.setImageFilter(
637 DlMatrixImageFilter::Make(matrix, DlImageSampling::kLinear));
638 builder.SaveLayer(
nullptr, &paint);
641 rect_paint.setAlpha(0.5 * 255);
642 builder.DrawImage(image, {0, 0}, DlImageSampling::kLinear, &rect_paint);
645 return builder.Build();
648 ASSERT_TRUE(OpenPlaygroundHere(callback));
652 DisplayListBuilder builder;
653 builder.Scale(GetContentScale().x, GetContentScale().y);
655 auto test = [&builder](
const std::shared_ptr<const DlImageFilter>& filter) {
656 auto DrawLine = [&builder](
const SkPoint& p0,
const SkPoint& p1,
659 paint.setDrawStyle(DlDrawStyle::kStroke);
660 builder.DrawPath(SkPath::Line(p0, p1), paint);
664 paint.setColor(DlColor::kWhite());
665 DrawLine(SkPoint::Make(75, 100), SkPoint::Make(225, 100), paint);
666 DrawLine(SkPoint::Make(75, 200), SkPoint::Make(225, 200), paint);
667 DrawLine(SkPoint::Make(100, 75), SkPoint::Make(100, 225), paint);
668 DrawLine(SkPoint::Make(200, 75), SkPoint::Make(200, 225), paint);
671 save_paint.setImageFilter(filter);
672 SkRect bounds = SkRect::MakeLTRB(100, 100, 200, 200);
673 builder.SaveLayer(&bounds, &save_paint);
678 paint.setColor(DlColor::kYellow());
679 builder.DrawPaint(paint);
682 paint.setColor(DlColor::kBlue());
683 builder.DrawRect(SkRect::MakeLTRB(125, 125, 175, 175), paint);
688 test(std::make_shared<DlBlurImageFilter>(10.0, 10.0, DlTileMode::kDecal));
690 builder.Translate(200.0, 0.0);
692 test(std::make_shared<DlDilateImageFilter>(10.0, 10.0));
694 builder.Translate(200.0, 0.0);
696 test(std::make_shared<DlErodeImageFilter>(10.0, 10.0));
698 builder.Translate(-400.0, 200.0);
700 SkMatrix sk_matrix = SkMatrix::RotateDeg(10);
702 auto rotate_filter = std::make_shared<DlMatrixImageFilter>(
703 sk_matrix, DlImageSampling::kLinear);
706 builder.Translate(200.0, 0.0);
708 const float m[20] = {
714 auto rgb_swap_filter = std::make_shared<DlColorFilterImageFilter>(
715 std::make_shared<DlMatrixColorFilter>(m));
716 test(rgb_swap_filter);
718 builder.Translate(200.0, 0.0);
720 test(DlComposeImageFilter::Make(rotate_filter, rgb_swap_filter));
722 builder.Translate(-400.0, 200.0);
724 test(std::make_shared<DlLocalMatrixImageFilter>(
725 SkMatrix::Translate(25.0, 25.0), rotate_filter));
727 builder.Translate(200.0, 0.0);
729 test(std::make_shared<DlLocalMatrixImageFilter>(
730 SkMatrix::Translate(25.0, 25.0), rgb_swap_filter));
732 builder.Translate(200.0, 0.0);
734 test(std::make_shared<DlLocalMatrixImageFilter>(
735 SkMatrix::Translate(25.0, 25.0),
736 DlComposeImageFilter::Make(rotate_filter, rgb_swap_filter)));
738 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
742 DisplayListBuilder builder;
745 paint.setColor(DlColor::kBlack());
746 builder.DrawPaint(paint);
747 builder.SaveLayer(
nullptr,
nullptr);
750 paint.setColor(DlColor::kGreen().withAlpha(0.5 * 255));
751 paint.setBlendMode(DlBlendMode::kPlus);
754 rect_paint.setColor(DlColor::kRed());
755 rect_paint.setStrokeWidth(4);
756 rect_paint.setDrawStyle(DlDrawStyle::kStroke);
757 builder.DrawRect(SkRect::MakeLTRB(0, 0, 300, 300), rect_paint);
758 builder.DrawCircle(SkPoint::Make(200, 200), 100, paint);
761 SkMatrix matrix = SkMatrix::Translate((100 + 100 *
k1OverSqrt2),
763 SkMatrix::Scale(0.5, 0.5) *
764 SkMatrix::Translate(-100, -100);
765 auto backdrop_filter =
766 DlMatrixImageFilter::Make(matrix, DlImageSampling::kLinear);
767 builder.SaveLayer(
nullptr,
nullptr, backdrop_filter.get());
772 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
776 DisplayListBuilder builder;
779 paint.setColor(DlColor::kBlack());
780 builder.DrawPaint(paint);
781 builder.SaveLayer(
nullptr,
nullptr);
783 paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
784 paint.setBlendMode(DlBlendMode::kPlus);
785 builder.DrawCircle({200, 200}, 100, paint);
789 SkMatrix matrix = SkMatrix::Translate((200 + 100 *
k1OverSqrt2),
791 SkMatrix::Scale(0.5, 0.5) *
792 SkMatrix::Translate(-200, -200);
794 save_paint.setImageFilter(
795 DlMatrixImageFilter::Make(matrix, DlImageSampling::kLinear));
797 builder.SaveLayer(
nullptr, &save_paint);
799 DlPaint circle_paint;
800 circle_paint.setColor(DlColor::kGreen().withAlpha(255 * 0.5));
801 circle_paint.setBlendMode(DlBlendMode::kPlus);
802 builder.DrawCircle({200, 200}, 100, circle_paint);
807 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
812 std::vector<SkPoint> point = {
817 paint.setStrokeCap(DlStrokeCap::kRound);
818 paint.setColor(DlColor::kRed());
819 paint.setStrokeWidth(100 * 1000000);
821 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
822 builder.Translate(200, 200);
823 builder.Scale(0.000001, 0.000001);
825 builder.DrawPoints(DlCanvas::PointMode::kPoints, point.size(), point.data(),
828 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
833 std::vector<SkPoint> point = {
838 paint.setStrokeCap(DlStrokeCap::kRound);
839 paint.setColor(DlColor::kRed());
840 paint.setStrokeWidth(100 * 0.000001);
842 DisplayListBuilder builder(GetCullRect(GetWindowSize()));
843 builder.Translate(200, 200);
844 builder.Scale(1000000, 1000000);
846 builder.DrawPoints(DlCanvas::PointMode::kPoints, point.size(), point.data(),
848 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
852 DisplayListBuilder builder;
854 builder.Scale(1.618, 1.618);
855 SkPath path = SkPath{}.addRect(SkRect::MakeXYWH(0, 0, 200, 100));
857 builder.DrawShadow(path, flutter::DlColor::kTransparent(), 15,
false, 1);
860 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
865 flutter::DisplayListBuilder sub_builder(
true);
866 sub_builder.DrawRect(SkRect::MakeXYWH(0, 0, 50, 50),
867 flutter::DlPaint(flutter::DlColor::kRed()));
868 auto display_list = sub_builder.Build();
875 DisplayListBuilder builder;
877 builder.Scale(2.0, 2.0);
878 builder.Translate(-93.0, 0.0);
881 builder.TransformFullPerspective(
882 0.8, -0.2, -0.1, -0.0,
885 63.2, 65.3, 48.6, 1.1
888 builder.Translate(35.0, 75.0);
889 builder.DrawDisplayList(display_list, 1.0f);
891 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
896 DisplayListBuilder builder;
900 builder.ClipRect(SkRect::MakeLTRB(50, 50, 100, 100),
901 DlCanvas::ClipOp::kDifference);
904 paint.setColor(DlColor::kRed());
905 builder.DrawRect(SkRect::MakeLTRB(0, 0, 100, 100), paint);
908 auto count = builder.GetSaveCount();
911 builder.ClipRect(SkRect::MakeLTRB(0, 0, 100, 100));
914 auto backdrop_filter =
915 DlBlurImageFilter::Make(10.0, 10.0, DlTileMode::kDecal);
916 builder.SaveLayer(
nullptr,
nullptr, backdrop_filter.get());
919 builder.RestoreToCount(count);
922 paint.setColor(DlColor::kGreen());
923 builder.DrawRect(SkRect::MakeLTRB(0, 0, 100, 100), paint);
925 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
929 DisplayListBuilder recorder_canvas;
931 paint.setColor(DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0));
932 recorder_canvas.DrawRect(SkRect::MakeXYWH(100.0, 100.0, 600, 600), paint);
933 paint.setColor(DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0));
934 recorder_canvas.DrawRect(SkRect::MakeXYWH(200.0, 200.0, 600, 600), paint);
936 DisplayListBuilder canvas;
938 paint.setColor(DlColor::kTransparent());
939 canvas.DrawPaint(paint);
945 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
946 canvas.DrawRect(SkRect::MakeSize({1000, 1000}), paint);
949 ASSERT_TRUE(OpenPlaygroundHere(canvas.Build()));
956 DisplayListBuilder recorder_builder;
958 DisplayListBuilder builder;
962 paint.setColor(DlColor::kTransparent());
963 builder.DrawPaint(paint);
970 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 0.2));
971 recorder_builder.DrawRect(SkRect::MakeSize({1000, 1000}), paint);
974 ASSERT_TRUE(OpenPlaygroundHere(recorder_builder.Build()));