5 #include "display_list/display_list.h"
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/effects/dl_mask_filter.h"
14 #include "flutter/display_list/dl_blend_mode.h"
15 #include "flutter/display_list/dl_builder.h"
16 #include "flutter/display_list/dl_color.h"
17 #include "flutter/display_list/dl_paint.h"
18 #include "flutter/display_list/geometry/dl_path_builder.h"
21 #include "flutter/testing/display_list_testing.h"
22 #include "flutter/testing/testing.h"
31 DisplayListBuilder builder;
33 paint.setColor(DlColor::kBlue());
34 builder.DrawPath(DlPath::MakeRectXYWH(100.0f, 100.0f, 100.0f, 100.0f), paint);
35 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
40 std::function<void(DisplayListBuilder&,
const DlRect&,
const DlPaint&)>;
42 sk_sp<DisplayList> MakeWideStrokedRects(
Point scale,
43 const DrawRectProc& draw_rect) {
44 DisplayListBuilder builder;
45 builder.Scale(scale.
x, scale.
y);
46 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
49 paint.setColor(DlColor::kBlue().withAlphaF(0.5));
50 paint.setDrawStyle(DlDrawStyle::kStroke);
51 paint.setStrokeWidth(30.0f);
57 paint.setStrokeJoin(DlStrokeJoin::kBevel);
58 draw_rect(builder, DlRect::MakeXYWH(100.0f, 100.0f, 100.0f, 100.0f), paint);
59 draw_rect(builder, DlRect::MakeXYWH(250.0f, 100.0f, 10.0f, 100.0f), paint);
60 draw_rect(builder, DlRect::MakeXYWH(100.0f, 250.0f, 100.0f, 10.0f), paint);
62 paint.setStrokeJoin(DlStrokeJoin::kRound);
63 draw_rect(builder, DlRect::MakeXYWH(350.0f, 100.0f, 100.0f, 100.0f), paint);
64 draw_rect(builder, DlRect::MakeXYWH(500.0f, 100.0f, 10.0f, 100.0f), paint);
65 draw_rect(builder, DlRect::MakeXYWH(350.0f, 250.0f, 100.0f, 10.0f), paint);
67 paint.setStrokeJoin(DlStrokeJoin::kMiter);
68 draw_rect(builder, DlRect::MakeXYWH(600.0f, 100.0f, 100.0f, 100.0f), paint);
69 draw_rect(builder, DlRect::MakeXYWH(750.0f, 100.0f, 10.0f, 100.0f), paint);
70 draw_rect(builder, DlRect::MakeXYWH(600.0f, 250.0f, 100.0f, 10.0f), paint);
74 paint.setStrokeWidth(110.0f);
76 paint.setStrokeJoin(DlStrokeJoin::kBevel);
77 draw_rect(builder, DlRect::MakeXYWH(100.0f, 400.0f, 100.0f, 100.0f), paint);
79 paint.setStrokeJoin(DlStrokeJoin::kRound);
80 draw_rect(builder, DlRect::MakeXYWH(350.0f, 400.0f, 100.0f, 100.0f), paint);
82 paint.setStrokeJoin(DlStrokeJoin::kMiter);
83 draw_rect(builder, DlRect::MakeXYWH(600.0f, 400.0f, 100.0f, 100.0f), paint);
85 return builder.Build();
90 ASSERT_TRUE(OpenPlaygroundHere(MakeWideStrokedRects(
91 GetContentScale(), [](DisplayListBuilder& builder,
const DlRect& rect,
92 const DlPaint& paint) {
94 builder.DrawRect(rect, paint);
99 ASSERT_TRUE(OpenPlaygroundHere(MakeWideStrokedRects(
100 GetContentScale(), [](DisplayListBuilder& builder,
const DlRect& rect,
101 const DlPaint& paint) {
103 builder.DrawPath(DlPath::MakeRect(rect), paint);
108 DisplayListBuilder builder;
110 paint.setColor(DlColor::kRed());
112 builder.DrawImage(image,
DlPoint(100.0, 100.0),
113 DlImageSampling::kNearestNeighbor, &paint);
114 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
118 DisplayListBuilder builder;
120 paint.setColor(DlColor::kRed());
121 paint.setColorFilter(
122 DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kSrcOver));
123 paint.setInvertColors(
true);
126 builder.DrawImage(image,
DlPoint(100.0, 100.0),
127 DlImageSampling::kNearestNeighbor, &paint);
128 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
132 DisplayListBuilder builder;
134 paint.setColor(DlColor::kRed());
135 paint.setColorFilter(
136 DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kSrcOver));
137 paint.setInvertColors(
true);
139 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100, 100), paint);
140 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
144 DisplayListBuilder builder;
146 paint.setColor(DlColor::kRed());
147 paint.setColorFilter(
148 DlColorFilter::MakeBlend(DlColor::kYellow(), DlBlendMode::kSrcOver));
149 paint.setInvertColors(
true);
151 builder.DrawPaint(paint);
152 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
156 bool GenerateMipmap(
const std::shared_ptr<Context>& context,
157 std::shared_ptr<Texture> texture,
158 std::string_view label) {
159 auto buffer = context->CreateCommandBuffer();
163 auto pass = buffer->CreateBlitPass();
167 pass->GenerateMipmap(std::move(texture), label);
169 pass->EncodeCommands();
170 return context->GetCommandQueue()->Submit({buffer}).ok();
173 void CanRenderTiledTexture(
AiksTest* aiks_test,
174 DlTileMode tile_mode,
175 Matrix local_matrix = {}) {
176 auto context = aiks_test->GetContext();
177 ASSERT_TRUE(context);
178 auto texture = aiks_test->CreateTextureForFixture(
"table_mountain_nx.png",
180 GenerateMipmap(context, texture,
"table_mountain_nx");
182 auto color_source = DlColorSource::MakeImage(
183 image, tile_mode, tile_mode, DlImageSampling::kNearestNeighbor,
186 DisplayListBuilder builder;
188 paint.setColor(DlColor::kWhite());
189 paint.setColorSource(color_source);
191 builder.Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
192 builder.Translate(100.0f, 100.0f);
193 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
196 constexpr
auto stroke_width = 64;
197 paint.setDrawStyle(DlDrawStyle::kStroke);
198 paint.setStrokeWidth(stroke_width);
199 if (tile_mode == DlTileMode::kDecal) {
200 builder.DrawRect(DlRect::MakeXYWH(stroke_width, stroke_width, 600, 600),
203 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
208 DlPathBuilder path_builder;
209 path_builder.AddCircle(
DlPoint(150, 150), 150);
210 path_builder.AddRoundRect(
212 DlPath path = path_builder.TakePath();
215 EXPECT_FALSE(path.IsRect(
nullptr));
216 EXPECT_FALSE(path.IsOval(
nullptr));
217 EXPECT_FALSE(path.IsRoundRect(
nullptr));
220 EXPECT_FALSE(path.IsConvex());
222 paint.setDrawStyle(DlDrawStyle::kFill);
223 builder.DrawPath(path, paint);
230 constexpr
float kConicWeight = 0.707106781f;
231 const DlPath path = DlPathBuilder()
233 .ConicCurveTo({300, 300}, {300, 450}, kConicWeight)
234 .ConicCurveTo({300, 600}, {150, 600}, kConicWeight)
235 .ConicCurveTo({0, 600}, {0, 450}, kConicWeight)
236 .ConicCurveTo({0, 300}, {150, 300}, kConicWeight)
241 EXPECT_FALSE(path.IsRect(
nullptr));
242 EXPECT_FALSE(path.IsOval(
nullptr));
243 EXPECT_FALSE(path.IsRoundRect(
nullptr));
246 EXPECT_TRUE(path.IsConvex());
248 paint.setDrawStyle(DlDrawStyle::kFill);
249 builder.DrawPath(path, paint);
252 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
257 CanRenderTiledTexture(
this, DlTileMode::kClamp);
261 CanRenderTiledTexture(
this, DlTileMode::kRepeat);
265 CanRenderTiledTexture(
this, DlTileMode::kMirror);
269 CanRenderTiledTexture(
this, DlTileMode::kDecal);
273 CanRenderTiledTexture(
this, DlTileMode::kClamp,
278 DisplayListBuilder builder;
281 DlISize image_half_size =
282 DlISize(image->GetSize().width * 0.5f, image->GetSize().height * 0.5f);
285 auto source_rect = DlRect::MakeSize(image_half_size);
287 source_rect.Shift(image_half_size.width, image_half_size.height);
289 builder.DrawImageRect(image, source_rect,
290 DlRect::MakeXYWH(100, 100, 600, 600),
291 DlImageSampling::kNearestNeighbor);
292 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
296 DisplayListBuilder builder;
300 auto source_rect = DlRect::MakeXYWH(
301 image->GetSize().width * 0.25f, image->GetSize().height * 0.4f,
302 image->GetSize().width, image->GetSize().height);
304 auto dest_rect = DlRect::MakeXYWH(100, 100, 600, 600);
307 paint.setColor(DlColor::kMidGrey());
308 builder.DrawRect(dest_rect, paint);
310 builder.DrawImageRect(image, source_rect, dest_rect,
311 DlImageSampling::kNearestNeighbor);
312 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
316 DisplayListBuilder builder;
317 builder.Scale(GetContentScale().
x, GetContentScale().y);
320 paint.setColor(DlColor::kWhite());
321 builder.DrawPaint(paint);
323 auto draw = [&builder](
const DlPaint& paint,
Scalar x,
Scalar y) {
325 builder.Translate(
x, y);
328 builder.ClipRect(DlRect::MakeLTRB(50, 50, 150, 150));
329 builder.DrawPaint(paint);
334 builder.ClipOval(DlRect::MakeLTRB(200, 50, 300, 150));
335 builder.DrawPaint(paint);
340 builder.ClipRoundRect(
341 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(50, 200, 150, 300), 20, 20));
342 builder.DrawPaint(paint);
347 builder.ClipRoundRect(DlRoundRect::MakeRectXY(
348 DlRect::MakeLTRB(200, 230, 300, 270), 20, 20));
349 builder.DrawPaint(paint);
354 builder.ClipRoundRect(DlRoundRect::MakeRectXY(
355 DlRect::MakeLTRB(230, 200, 270, 300), 20, 20));
356 builder.DrawPaint(paint);
362 paint.setColor(DlColor::kBlue());
365 DlColor gradient_colors[7] = {
366 DlColor::RGBA(0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0),
367 DlColor::RGBA(0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0),
368 DlColor::RGBA(0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0),
369 DlColor::RGBA(0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0),
370 DlColor::RGBA(0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0),
371 DlColor::RGBA(0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0),
372 DlColor::RGBA(0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0),
383 auto texture = CreateTextureForFixture(
"airplane.jpg",
387 paint.setColorSource(DlColorSource::MakeRadial(
388 DlPoint(500, 600), 75, 7, gradient_colors, stops, DlTileMode::kMirror));
391 paint.setColorSource(
392 DlColorSource::MakeImage(image, DlTileMode::kRepeat, DlTileMode::kRepeat,
393 DlImageSampling::kNearestNeighbor));
396 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
400 DisplayListBuilder builder;
403 red.setColor(DlColor::kRed());
406 alpha.setColor(DlColor::kRed().modulateOpacity(0.5));
408 builder.SaveLayer(std::nullopt, &alpha);
410 builder.DrawCircle(
DlPoint(125, 125), 125, red);
414 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
418 DisplayListBuilder builder;
421 DlColor colors[2] = {
422 DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
423 DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0),
430 paint.setColorSource(DlColorSource::MakeLinear(
440 builder.Translate(100, 100);
441 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
445 builder.Translate(100, 400);
446 builder.DrawCircle(
DlPoint(100, 100), 100, paint);
448 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
452 DisplayListBuilder builder;
454 paint.setColor(DlColor::kRed());
458 .top_right = DlSize(25, 50),
459 .bottom_left = DlSize(25, 50),
460 .bottom_right = DlSize(50, 25),
463 DlRoundRect::MakeRectRadii(DlRect::MakeXYWH(100, 100, 500, 500), radii);
465 builder.DrawRoundRect(rrect, paint);
467 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
471 auto medium_turquoise =
472 DlColor::RGBA(72.0f / 255.0f, 209.0f / 255.0f, 204.0f / 255.0f, 1.0f);
474 DisplayListBuilder builder;
475 builder.Scale(0.2, 0.2);
476 builder.DrawPaint(DlPaint().setColor(medium_turquoise));
477 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
481 auto medium_turquoise =
482 DlColor::RGBA(72.0f / 255.0f, 209.0f / 255.0f, 204.0f / 255.0f, 1.0f);
484 DlColor::RGBA(255.0f / 255.0f, 69.0f / 255.0f, 0.0f / 255.0f, 1.0f);
486 DisplayListBuilder builder;
487 builder.Scale(0.2, 0.2);
488 builder.DrawPaint(DlPaint().setColor(medium_turquoise));
489 builder.DrawPaint(DlPaint().setColor(orange_red.modulateOpacity(0.5f)));
490 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
494 DisplayListBuilder builder;
495 builder.Scale(GetContentScale().
x, GetContentScale().y);
498 paint.setColor(DlColor::kPurple());
499 paint.setDrawStyle(DlDrawStyle::kStroke);
500 paint.setStrokeWidth(20.0f);
502 DlPaint thin_paint = paint;
503 thin_paint.setColor(DlColor::kYellow());
504 thin_paint.setStrokeWidth(0.0f);
506 DlRect rect = DlRect::MakeLTRB(10, 10, 90, 90);
507 DlRect thin_tall_rect = DlRect::MakeLTRB(120, 10, 120, 90);
508 DlRect thin_wide_rect = DlRect::MakeLTRB(10, 120, 90, 120);
509 DlRect empty_rect = DlRect::MakeLTRB(120, 120, 120, 120);
539 paint.setStrokeJoin(DlStrokeJoin::kBevel);
540 builder.DrawRect(rect.Shift({100, 100}), paint);
541 builder.DrawRect(rect.Shift({100, 100}), thin_paint);
542 builder.DrawRect(thin_tall_rect.Shift({100, 100}), paint);
543 builder.DrawRect(thin_tall_rect.Shift({100, 100}), thin_paint);
544 builder.DrawRect(thin_wide_rect.Shift({100, 100}), paint);
545 builder.DrawRect(thin_wide_rect.Shift({100, 100}), thin_paint);
546 builder.DrawRect(empty_rect.Shift({100, 100}), paint);
547 builder.DrawRect(empty_rect.Shift({100, 100}), thin_paint);
550 paint.setStrokeJoin(DlStrokeJoin::kRound);
551 builder.DrawRect(rect.Shift({100, 300}), paint);
552 builder.DrawRect(rect.Shift({100, 300}), thin_paint);
553 builder.DrawRect(thin_tall_rect.Shift({100, 300}), paint);
554 builder.DrawRect(thin_tall_rect.Shift({100, 300}), thin_paint);
555 builder.DrawRect(thin_wide_rect.Shift({100, 300}), paint);
556 builder.DrawRect(thin_wide_rect.Shift({100, 300}), thin_paint);
557 builder.DrawRect(empty_rect.Shift({100, 300}), paint);
558 builder.DrawRect(empty_rect.Shift({100, 300}), thin_paint);
561 paint.setStrokeJoin(DlStrokeJoin::kMiter);
563 builder.DrawRect(rect.Shift({100, 500}), paint);
564 builder.DrawRect(rect.Shift({100, 500}), thin_paint);
565 builder.DrawRect(thin_tall_rect.Shift({100, 500}), paint);
566 builder.DrawRect(thin_tall_rect.Shift({100, 500}), thin_paint);
567 builder.DrawRect(thin_wide_rect.Shift({100, 500}), paint);
568 builder.DrawRect(thin_wide_rect.Shift({100, 500}), thin_paint);
569 builder.DrawRect(empty_rect.Shift({100, 500}), paint);
570 builder.DrawRect(empty_rect.Shift({100, 500}), thin_paint);
573 paint.setStrokeJoin(DlStrokeJoin::kMiter);
575 builder.DrawRect(rect.Shift({300, 500}), paint);
576 builder.DrawRect(rect.Shift({300, 500}), thin_paint);
577 builder.DrawRect(thin_tall_rect.Shift({300, 500}), paint);
578 builder.DrawRect(thin_tall_rect.Shift({300, 500}), thin_paint);
579 builder.DrawRect(thin_wide_rect.Shift({300, 500}), paint);
580 builder.DrawRect(thin_wide_rect.Shift({300, 500}), thin_paint);
581 builder.DrawRect(empty_rect.Shift({300, 500}), paint);
582 builder.DrawRect(empty_rect.Shift({300, 500}), thin_paint);
584 paint.setStrokeWidth(120.0f);
585 paint.setColor(DlColor::kBlue());
586 rect = rect.Expand(-20);
589 paint.setStrokeJoin(DlStrokeJoin::kBevel);
590 builder.DrawRect(rect.Shift({500, 100}), paint);
591 builder.DrawRect(rect.Shift({500, 100}), thin_paint);
594 paint.setStrokeJoin(DlStrokeJoin::kRound);
595 builder.DrawRect(rect.Shift({500, 300}), paint);
596 builder.DrawRect(rect.Shift({500, 300}), thin_paint);
599 paint.setStrokeJoin(DlStrokeJoin::kMiter);
601 builder.DrawRect(rect.Shift({500, 500}), paint);
602 builder.DrawRect(rect.Shift({500, 500}), thin_paint);
605 paint.setStrokeJoin(DlStrokeJoin::kMiter);
607 builder.DrawRect(rect.Shift({700, 500}), paint);
608 builder.DrawRect(rect.Shift({700, 500}), thin_paint);
610 DlPaint round_mock_paint;
611 round_mock_paint.setColor(DlColor::kGreen());
612 round_mock_paint.setDrawStyle(DlDrawStyle::kFill);
617 for (
int i = 0; i < 15; i++) {
618 paint.setStrokeWidth(i);
619 paint.setColor(DlColor::kOrange());
620 paint.setStrokeJoin(DlStrokeJoin::kRound);
621 builder.DrawRect(DlRect::MakeXYWH(
x, y, 30, 30), paint);
625 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
629 DisplayListBuilder builder;
630 builder.Scale(GetContentScale().
x, GetContentScale().y);
632 const int color_count = 3;
633 DlColor colors[color_count] = {
636 DlColor::RGBA(220.0f / 255.0f, 20.0f / 255.0f, 60.0f / 255.0f, 1.0f),
639 paint.setColor(DlColor::kWhite());
640 builder.DrawPaint(paint);
645 paint.setColor(colors[(c_index++) % color_count]);
646 builder.DrawCircle(
DlPoint(10, 10), radius, paint);
654 DlColor gradient_colors[7] = {
655 DlColor::RGBA(0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0),
656 DlColor::RGBA(0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0),
657 DlColor::RGBA(0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0),
658 DlColor::RGBA(0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0),
659 DlColor::RGBA(0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0),
660 DlColor::RGBA(0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0),
661 DlColor::RGBA(0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0),
672 auto texture = CreateTextureForFixture(
"airplane.jpg",
676 paint.setColorSource(DlColorSource::MakeRadial(
677 DlPoint(500, 600), 75, 7, gradient_colors, stops, DlTileMode::kMirror));
678 builder.DrawCircle(
DlPoint(500, 600), 100, paint);
680 DlMatrix local_matrix = DlMatrix::MakeTranslation({700, 200});
681 paint.setColorSource(DlColorSource::MakeImage(
682 image, DlTileMode::kRepeat, DlTileMode::kRepeat,
683 DlImageSampling::kNearestNeighbor, &local_matrix));
684 builder.DrawCircle(
DlPoint(800, 300), 100, paint);
686 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
690 DisplayListBuilder builder;
691 builder.Scale(GetContentScale().
x, GetContentScale().y);
693 const int color_count = 3;
694 DlColor colors[color_count] = {
697 DlColor::RGBA(220.0f / 255.0f, 20.0f / 255.0f, 60.0f / 255.0f, 1.0f),
700 paint.setColor(DlColor::kWhite());
701 builder.DrawPaint(paint);
705 auto draw = [&paint, &colors, &c_index](DlCanvas& canvas,
DlPoint center,
707 for (
int i = 0; i < n; i++) {
708 paint.setColor(colors[(c_index++) % color_count]);
709 canvas.DrawCircle(center, r, paint);
714 paint.setDrawStyle(DlDrawStyle::kStroke);
715 paint.setStrokeWidth(1);
716 draw(builder,
DlPoint(10, 10), 2, 2, 14);
717 paint.setStrokeWidth(5);
718 draw(builder,
DlPoint(10, 10), 35, 10, 56);
720 DlColor gradient_colors[7] = {
721 DlColor::RGBA(0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0),
722 DlColor::RGBA(0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0),
723 DlColor::RGBA(0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0),
724 DlColor::RGBA(0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0),
725 DlColor::RGBA(0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0),
726 DlColor::RGBA(0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0),
727 DlColor::RGBA(0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0),
738 auto texture = CreateTextureForFixture(
"airplane.jpg",
742 paint.setColorSource(DlColorSource::MakeRadial(
743 DlPoint(500, 600), 75, 7, gradient_colors, stops, DlTileMode::kMirror));
744 draw(builder,
DlPoint(500, 600), 5, 10, 10);
746 DlMatrix local_matrix = DlMatrix::MakeTranslation({700, 200});
747 paint.setColorSource(DlColorSource::MakeImage(
748 image, DlTileMode::kRepeat, DlTileMode::kRepeat,
749 DlImageSampling::kNearestNeighbor, &local_matrix));
750 draw(builder,
DlPoint(800, 300), 5, 10, 10);
752 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
756 DisplayListBuilder builder;
757 builder.Scale(GetContentScale().
x, GetContentScale().y);
759 const int color_count = 3;
760 DlColor colors[color_count] = {
763 DlColor::RGBA(220.0f / 255.0f, 20.0f / 255.0f, 60.0f / 255.0f, 1.0f),
766 paint.setColor(DlColor::kWhite());
767 builder.DrawPaint(paint);
770 int long_radius = 600;
771 int short_radius = 600;
772 while (long_radius > 0 && short_radius > 0) {
773 paint.setColor(colors[(c_index++) % color_count]);
774 builder.DrawOval(DlRect::MakeXYWH(10 - long_radius, 10 - short_radius,
775 long_radius * 2, short_radius * 2),
777 builder.DrawOval(DlRect::MakeXYWH(1000 - short_radius, 750 - long_radius,
778 short_radius * 2, long_radius * 2),
780 if (short_radius > 30) {
789 DlColor gradient_colors[7] = {
790 DlColor::RGBA(0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0),
791 DlColor::RGBA(0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0),
792 DlColor::RGBA(0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0),
793 DlColor::RGBA(0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0),
794 DlColor::RGBA(0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0),
795 DlColor::RGBA(0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0),
796 DlColor::RGBA(0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0),
807 auto texture = CreateTextureForFixture(
"airplane.jpg",
811 paint.setColor(DlColor::kWhite().modulateOpacity(0.5));
813 paint.setColorSource(DlColorSource::MakeRadial(
814 DlPoint(300, 650), 75, 7, gradient_colors, stops, DlTileMode::kMirror));
815 builder.DrawOval(DlRect::MakeXYWH(200, 625, 200, 50), paint);
816 builder.DrawOval(DlRect::MakeXYWH(275, 550, 50, 200), paint);
818 DlMatrix local_matrix = DlMatrix::MakeTranslation({610, 15});
819 paint.setColorSource(DlColorSource::MakeImage(
820 image, DlTileMode::kRepeat, DlTileMode::kRepeat,
821 DlImageSampling::kNearestNeighbor, &local_matrix));
822 builder.DrawOval(DlRect::MakeXYWH(610, 90, 200, 50), paint);
823 builder.DrawOval(DlRect::MakeXYWH(685, 15, 50, 200), paint);
825 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
829 struct ArcFarmOptions {
836 void RenderArcFarm(DisplayListBuilder& builder,
837 const DlPaint& paint,
838 const ArcFarmOptions& opts) {
840 builder.Translate(50, 50);
842 const int sweep_limit = opts.sweeps_over_360 ? 420 : 360;
845 for (
int sweep = 30; sweep <= sweep_limit; sweep += 30) {
846 builder.DrawArc(arc_bounds,
start, opts.full_circles ? 360 : sweep,
847 opts.use_center, paint);
848 builder.Translate(50, 0);
851 builder.Translate(0, 50);
856 void RenderArcFarmForOverlappingCapsTest(DisplayListBuilder& builder,
857 const DlPaint& paint) {
859 builder.Translate(40, 30);
861 for (
int stroke_width = 10; stroke_width <= 40; stroke_width += 3) {
862 DlPaint modified_paint = DlPaint(paint);
863 modified_paint.setStrokeWidth(stroke_width);
865 for (
int sweep = 160; sweep <= 360; sweep += 20) {
866 builder.DrawArc(arc_bounds, 0, sweep,
false, modified_paint);
867 builder.Translate(84, 0);
870 builder.Translate(0, 44 + stroke_width);
877 DisplayListBuilder builder;
878 builder.Scale(GetContentScale().
x, GetContentScale().y);
879 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
882 paint.setColor(DlColor::kBlue());
884 RenderArcFarm(builder, paint,
887 .full_circles =
false,
890 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
894 DisplayListBuilder builder;
895 builder.Scale(GetContentScale().
x, GetContentScale().y);
896 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
899 paint.setColor(DlColor::kBlue().modulateOpacity(0.5));
901 RenderArcFarm(builder, paint,
904 .full_circles =
false,
907 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
911 DisplayListBuilder builder;
912 builder.Scale(GetContentScale().
x, GetContentScale().y);
913 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
916 paint.setColor(DlColor::kBlue());
918 RenderArcFarm(builder, paint,
921 .full_circles =
false,
924 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
928 DisplayListBuilder builder;
929 builder.Scale(GetContentScale().
x, GetContentScale().y);
930 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
933 paint.setColor(DlColor::kBlue());
935 RenderArcFarm(builder, paint,
938 .full_circles =
false,
939 .vertical_scale = 0.8f,
942 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
946 DisplayListBuilder builder;
947 builder.Scale(GetContentScale().
x, GetContentScale().y);
948 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
951 paint.setColor(DlColor::kBlue());
953 RenderArcFarm(builder, paint,
956 .full_circles =
false,
957 .vertical_scale = 0.8f,
960 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
964 DisplayListBuilder builder;
965 builder.Scale(GetContentScale().
x, GetContentScale().y);
966 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
969 paint.setDrawStyle(DlDrawStyle::kStroke);
970 paint.setStrokeWidth(6.0f);
971 paint.setStrokeCap(DlStrokeCap::kButt);
972 paint.setColor(DlColor::kBlue());
974 RenderArcFarm(builder, paint,
977 .full_circles =
false,
980 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
984 DisplayListBuilder builder;
985 builder.Scale(GetContentScale().
x, GetContentScale().y);
986 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
989 paint.setDrawStyle(DlDrawStyle::kStroke);
990 paint.setStrokeWidth(6.0f);
991 paint.setStrokeCap(DlStrokeCap::kSquare);
992 paint.setColor(DlColor::kBlue());
994 RenderArcFarm(builder, paint,
997 .full_circles =
false,
1000 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1004 DisplayListBuilder builder;
1005 builder.Scale(GetContentScale().
x, GetContentScale().y);
1006 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1009 paint.setDrawStyle(DlDrawStyle::kStroke);
1010 paint.setStrokeCap(DlStrokeCap::kSquare);
1011 paint.setColor(DlColor::kBlue().modulateOpacity(0.5));
1013 RenderArcFarmForOverlappingCapsTest(builder, paint);
1015 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1019 DisplayListBuilder builder;
1020 builder.Scale(GetContentScale().
x, GetContentScale().y);
1021 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1024 paint.setDrawStyle(DlDrawStyle::kStroke);
1025 paint.setStrokeWidth(6.0f);
1026 paint.setStrokeCap(DlStrokeCap::kRound);
1027 paint.setColor(DlColor::kBlue());
1029 RenderArcFarm(builder, paint,
1031 .use_center =
false,
1032 .full_circles =
false,
1035 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1039 DisplayListBuilder builder;
1040 builder.Scale(GetContentScale().
x, GetContentScale().y);
1041 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1044 paint.setDrawStyle(DlDrawStyle::kStroke);
1045 paint.setStrokeCap(DlStrokeCap::kRound);
1046 paint.setColor(DlColor::kBlue().modulateOpacity(0.5));
1048 RenderArcFarmForOverlappingCapsTest(builder, paint);
1050 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1054 DisplayListBuilder builder;
1055 builder.Scale(GetContentScale().
x, GetContentScale().y);
1056 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1059 paint.setDrawStyle(DlDrawStyle::kStroke);
1060 paint.setStrokeWidth(6.0f);
1061 paint.setStrokeJoin(DlStrokeJoin::kBevel);
1062 paint.setColor(DlColor::kBlue());
1064 RenderArcFarm(builder, paint,
1067 .full_circles =
false,
1068 .sweeps_over_360 =
true,
1071 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1075 DisplayListBuilder builder;
1076 builder.Scale(GetContentScale().
x, GetContentScale().y);
1077 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1080 paint.setDrawStyle(DlDrawStyle::kStroke);
1081 paint.setStrokeWidth(6.0f);
1082 paint.setStrokeJoin(DlStrokeJoin::kMiter);
1085 paint.setStrokeMiter(3.0f);
1086 paint.setColor(DlColor::kBlue());
1088 RenderArcFarm(builder, paint,
1091 .full_circles =
false,
1092 .sweeps_over_360 =
true,
1095 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1099 DisplayListBuilder builder;
1100 builder.Scale(GetContentScale().
x, GetContentScale().y);
1101 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1104 paint.setDrawStyle(DlDrawStyle::kStroke);
1105 paint.setStrokeWidth(6.0f);
1106 paint.setStrokeJoin(DlStrokeJoin::kRound);
1107 paint.setColor(DlColor::kBlue());
1109 RenderArcFarm(builder, paint,
1112 .full_circles =
false,
1113 .sweeps_over_360 =
true,
1116 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1120 DisplayListBuilder builder;
1121 builder.Scale(GetContentScale().
x, GetContentScale().y);
1122 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1125 paint.setDrawStyle(DlDrawStyle::kStroke);
1126 paint.setStrokeWidth(8.0f);
1127 paint.setStrokeCap(DlStrokeCap::kSquare);
1128 paint.setColor(DlColor::kRed());
1130 RenderArcFarm(builder, paint,
1132 .use_center =
false,
1133 .full_circles =
false,
1136 paint.setStrokeCap(DlStrokeCap::kButt);
1137 paint.setColor(DlColor::kBlue());
1139 RenderArcFarm(builder, paint,
1141 .use_center =
false,
1142 .full_circles =
false,
1145 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1149 DisplayListBuilder builder;
1150 builder.Scale(GetContentScale().
x, GetContentScale().y);
1151 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1154 paint.setDrawStyle(DlDrawStyle::kStroke);
1155 paint.setStrokeWidth(8.0f);
1156 paint.setStrokeCap(DlStrokeCap::kSquare);
1157 paint.setColor(DlColor::kRed());
1159 RenderArcFarm(builder, paint,
1161 .use_center =
false,
1162 .full_circles =
false,
1165 paint.setStrokeCap(DlStrokeCap::kRound);
1166 paint.setColor(DlColor::kGreen());
1168 RenderArcFarm(builder, paint,
1170 .use_center =
false,
1171 .full_circles =
false,
1174 paint.setStrokeCap(DlStrokeCap::kButt);
1175 paint.setColor(DlColor::kBlue());
1177 RenderArcFarm(builder, paint,
1179 .use_center =
false,
1180 .full_circles =
false,
1183 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1198 DisplayListBuilder builder;
1199 builder.Scale(GetContentScale().
x, GetContentScale().y);
1200 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
1203 paint.setDrawStyle(DlDrawStyle::kStroke);
1204 paint.setStrokeWidth(6.0f);
1205 paint.setStrokeCap(DlStrokeCap::kButt);
1206 paint.setColor(DlColor::kBlue());
1209 RenderArcFarm(builder, paint,
1211 .use_center =
false,
1212 .full_circles =
true,
1215 paint.setColor(DlColor::kWhite());
1218 RenderArcFarm(builder, paint,
1220 .use_center =
false,
1221 .full_circles =
false,
1224 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1228 DisplayListBuilder builder;
1229 builder.Scale(GetContentScale().
x, GetContentScale().y);
1231 const int color_count = 3;
1232 DlColor colors[color_count] = {
1235 DlColor::RGBA(220.0f / 255.0f, 20.0f / 255.0f, 60.0f / 255.0f, 1.0f),
1238 paint.setColor(DlColor::kWhite());
1239 builder.DrawPaint(paint);
1242 for (
int i = 0; i < 4; i++) {
1243 for (
int j = 0; j < 4; j++) {
1244 paint.setColor(colors[(c_index++) % color_count]);
1245 builder.DrawRoundRect(
1246 DlRoundRect::MakeRectXY(
1247 DlRect::MakeXYWH(i * 100 + 10, j * 100 + 20, 80, 80),
1248 i * 5 + 10, j * 5 + 10),
1252 paint.setColor(colors[(c_index++) % color_count]);
1253 builder.DrawRoundRect(
1254 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(10, 420, 380, 80), 40, 40),
1256 paint.setColor(colors[(c_index++) % color_count]);
1257 builder.DrawRoundRect(
1258 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(410, 20, 80, 380), 40, 40),
1261 DlColor gradient_colors[7] = {
1262 DlColor::RGBA(0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0),
1263 DlColor::RGBA(0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0),
1264 DlColor::RGBA(0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0),
1265 DlColor::RGBA(0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0),
1266 DlColor::RGBA(0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0),
1267 DlColor::RGBA(0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0),
1268 DlColor::RGBA(0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0),
1279 auto texture = CreateTextureForFixture(
"airplane.jpg",
1283 paint.setColor(DlColor::kWhite().modulateOpacity(0.1));
1284 paint.setColorSource(DlColorSource::MakeRadial(
1285 DlPoint(550, 550), 75, 7, gradient_colors, stops, DlTileMode::kMirror));
1286 for (
int i = 1; i <= 10; i++) {
1288 builder.DrawRoundRect(
1289 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(550 - i * 20, 550 - j * 20,
1290 550 + i * 20, 550 + j * 20),
1295 paint.setColor(DlColor::kWhite().modulateOpacity(0.5));
1296 paint.setColorSource(DlColorSource::MakeRadial(
1297 DlPoint(200, 650), 75, 7, gradient_colors, stops, DlTileMode::kMirror));
1298 paint.setColor(DlColor::kWhite().modulateOpacity(0.5));
1299 builder.DrawRoundRect(
1300 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(100, 610, 300, 690), 40, 40),
1302 builder.DrawRoundRect(
1303 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(160, 550, 240, 750), 40, 40),
1306 paint.setColor(DlColor::kWhite().modulateOpacity(0.1));
1307 DlMatrix local_matrix = DlMatrix::MakeTranslation({520, 20});
1308 paint.setColorSource(DlColorSource::MakeImage(
1309 image, DlTileMode::kRepeat, DlTileMode::kRepeat,
1310 DlImageSampling::kNearestNeighbor, &local_matrix));
1311 for (
int i = 1; i <= 10; i++) {
1313 builder.DrawRoundRect(
1314 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(720 - i * 20, 220 - j * 20,
1315 720 + i * 20, 220 + j * 20),
1320 paint.setColor(DlColor::kWhite().modulateOpacity(0.5));
1321 local_matrix = DlMatrix::MakeTranslation({800, 300});
1322 paint.setColorSource(DlColorSource::MakeImage(
1323 image, DlTileMode::kRepeat, DlTileMode::kRepeat,
1324 DlImageSampling::kNearestNeighbor, &local_matrix));
1325 builder.DrawRoundRect(
1326 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(800, 410, 1000, 490), 40, 40),
1328 builder.DrawRoundRect(
1329 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(860, 350, 940, 550), 40, 40),
1332 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1336 DisplayListBuilder builder;
1337 builder.Scale(GetContentScale().
x, GetContentScale().y);
1339 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 1.0f));
1341 builder.DrawPaint(DlPaint().setColor(DlColor::kWhite()));
1344 DlColor::RGBA(220.0f / 255.0f, 20.0f / 255.0f, 60.0f / 255.0f, 1.0f));
1346 for (
int i = 0; i < 5; i++) {
1349 builder.DrawRect(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
1350 radius, 60.0f - radius),
1354 paint.setColor(DlColor::kBlue());
1356 for (
int i = 0; i < 5; i++) {
1359 builder.DrawCircle(
DlPoint(
x + 25, y + 25), radius, paint);
1362 paint.setColor(DlColor::kGreen());
1364 for (
int i = 0; i < 5; i++) {
1367 builder.DrawOval(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
1368 radius, 60.0f - radius),
1373 DlColor::RGBA(128.0f / 255.0f, 0.0f / 255.0f, 128.0f / 255.0f, 1.0f));
1375 for (
int i = 0; i < 5; i++) {
1378 builder.DrawRoundRect(
1379 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(
x, y, 60.0f, 60.0f),
1385 DlColor::RGBA(255.0f / 255.0f, 165.0f / 255.0f, 0.0f / 255.0f, 1.0f));
1387 for (
int i = 0; i < 5; i++) {
1390 builder.DrawRoundRect(
1391 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(
x, y, 60.0f, 60.0f),
1396 auto dl = builder.Build();
1397 ASSERT_TRUE(OpenPlaygroundHere(dl));
1401 DisplayListBuilder builder;
1403 builder.Scale(GetContentScale().
x, GetContentScale().y);
1406 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
1407 DlColor::RGBA(0.1294, 0.5882, 0.9529, 1.0)};
1408 std::vector<Scalar> stops = {
1413 paint.setColorSource(DlColorSource::MakeLinear(
1422 builder.DrawPaint(paint);
1424 DlRect clip_rect = DlRect::MakeLTRB(50, 50, 400, 300);
1425 DlRoundRect clip_rrect = DlRoundRect::MakeRectXY(clip_rect, 100, 100);
1429 builder.ClipRoundRect(clip_rrect, DlClipOp::kIntersect);
1432 auto backdrop_filter = DlImageFilter::MakeColorFilter(
1433 DlColorFilter::MakeBlend(DlColor::kRed(), DlBlendMode::kExclusion));
1434 builder.SaveLayer(clip_rect, &save_paint, backdrop_filter.get());
1436 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1442 auto callback = [&]() -> sk_sp<DisplayList> {
1443 DisplayListBuilder builder;
1447 builder.Translate(300, 300);
1454 paint.setColor(DlColor::kGreen());
1455 builder.DrawPaint(paint);
1456 builder.ClipRect(DlRect::MakeLTRB(-180, -180, 180, 180),
1457 DlClipOp::kDifference);
1459 paint.setColor(DlColor::kBlack());
1460 builder.DrawPaint(paint);
1468 builder.ClipOval(DlRect::MakeLTRB(-200, -200, 200, 200));
1471 Matrix(1.0, 0.0, 0.0, 0.0,
1473 0.0, 0.0, 1.0, 0.003,
1474 0.0, 0.0, 0.0, 1.0) *
1483 -
DlPoint(image->GetSize().width, image->GetSize().height) * 0.5;
1484 builder.DrawImage(image, position, {});
1490 paint.setColor(DlColor::kBlue().modulateOpacity(0.4));
1491 builder.DrawCircle(
DlPoint(), 230, paint);
1495 return builder.Build();
1497 ASSERT_TRUE(OpenPlaygroundHere(callback));
1503 DisplayListBuilder builder;
1507 paint.setColor(DlColor::kWhite());
1508 builder.DrawPaint(paint);
1512 DlMatrix matrix = DlMatrix::MakeTranslation({50, 50});
1514 paint.setColorSource(DlColorSource::MakeImage(
1515 texture, DlTileMode::kRepeat, DlTileMode::kRepeat,
1516 DlImageSampling::kNearestNeighbor, &matrix));
1518 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100, 100), paint);
1527 Matrix matrix(1, -1, 0, 0,
1531 paint.setColorSource(DlColorSource::MakeImage(
1532 texture, DlTileMode::kRepeat, DlTileMode::kRepeat,
1533 DlImageSampling::kNearestNeighbor, &matrix));
1534 builder.DrawRect(DlRect::MakeLTRB(100, 0, 200, 100), paint);
1541 builder.Translate(100, 0);
1542 builder.Scale(100, 100);
1545 DlMatrix matrix = DlMatrix::MakeScale({0.005, 0.005, 1});
1546 paint.setColorSource(DlColorSource::MakeImage(
1547 texture, DlTileMode::kRepeat, DlTileMode::kRepeat,
1548 DlImageSampling::kNearestNeighbor, &matrix));
1550 builder.DrawRect(DlRect::MakeLTRB(0, 0, 1, 1), paint);
1557 builder.Translate(150, 150);
1561 DlMatrix::MakePerspective(
Radians{0.5},
ISize{200, 200}, 0.05, 1);
1562 paint.setColorSource(DlColorSource::MakeImage(
1563 texture, DlTileMode::kRepeat, DlTileMode::kRepeat,
1564 DlImageSampling::kNearestNeighbor, &matrix));
1566 builder.DrawRect(DlRect::MakeLTRB(0, 0, 200, 200), paint);
1570 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1574 DisplayListBuilder builder;
1579 paint.setColor(DlColor::kBlue().modulateOpacity(0.5));
1580 paint.setBlendMode(DlBlendMode::kSrc);
1582 DlRect bounds = DlRect::MakeLTRB(0, 0, 200, 200);
1583 builder.SaveLayer(bounds, &paint);
1585 paint.setColor(DlColor::kTransparent());
1586 paint.setBlendMode(DlBlendMode::kSrc);
1587 builder.DrawPaint(paint);
1590 paint.setColor(DlColor::kBlue());
1591 paint.setBlendMode(DlBlendMode::kDstOver);
1592 builder.SaveLayer(std::nullopt, &paint);
1598 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1603 DisplayListBuilder builder;
1604 builder.Scale(GetContentScale().
x, GetContentScale().y);
1605 builder.Translate(100, 100);
1609 DlMatrix translate = DlMatrix::MakeTranslation({300, 0});
1610 paint.setImageFilter(
1611 DlImageFilter::MakeMatrix(translate, DlImageSampling::kLinear));
1612 builder.SaveLayer(std::nullopt, &paint);
1614 DlPaint circle_paint;
1615 circle_paint.setColor(DlColor::kGreen());
1616 builder.DrawCircle(
DlPoint(-300, 0), 100, circle_paint);
1619 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1624 MatrixImageFilterDoesntCullWhenScaledAndTranslatedFromOffscreen) {
1625 DisplayListBuilder builder;
1626 builder.Scale(GetContentScale().
x, GetContentScale().y);
1627 builder.Translate(100, 100);
1632 paint.setImageFilter(DlImageFilter::MakeMatrix(
1633 DlMatrix::MakeTranslation({300, 0}) * DlMatrix::MakeScale({2, 2, 1}),
1634 DlImageSampling::kNearestNeighbor));
1635 builder.SaveLayer(std::nullopt, &paint);
1637 DlPaint circle_paint;
1638 circle_paint.setColor(DlColor::kGreen());
1639 builder.DrawCircle(
DlPoint(-150, 0), 50, circle_paint);
1642 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1647 SetWindowSize({400, 400});
1648 DisplayListBuilder builder;
1650 builder.Scale(GetContentScale().
x, GetContentScale().y);
1653 paint.setColor(DlColor::kRed());
1654 builder.DrawRect(DlRect::MakeLTRB(200, 200, 300, 300), paint);
1656 paint.setImageFilter(DlImageFilter::MakeMatrix(DlMatrix::MakeScale({2, 2, 1}),
1657 DlImageSampling::kLinear));
1658 builder.SaveLayer(std::nullopt, &paint);
1661 paint.setColor(DlColor::kGreen());
1662 builder.DrawRect(DlRect::MakeLTRB(0, 0, 400, 400), paint);
1665 paint.setColor(DlColor::kRed());
1666 builder.DrawRect(DlRect::MakeLTRB(0, 0, 800, 800), paint);
1669 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1673 DisplayListBuilder builder;
1674 builder.Scale(GetContentScale().
x, GetContentScale().y);
1677 paint.setColor(DlColor::kRed());
1678 builder.DrawPaint(paint);
1679 builder.ClipRect(DlRect::MakeXYWH(100, 100, 200, 200));
1680 paint.setColor(DlColor::kBlue());
1681 builder.SaveLayer(std::nullopt, &paint);
1684 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1688 DisplayListBuilder builder;
1689 builder.Scale(GetContentScale().
x, GetContentScale().y);
1691 builder.DrawImage(image,
DlPoint(10, 10), {});
1692 builder.ClipRect(DlRect::MakeXYWH(100, 100, 200, 200));
1695 paint.setBlendMode(DlBlendMode::kClear);
1696 builder.SaveLayer(std::nullopt, &paint);
1699 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1703 CanPerformSaveLayerWithBoundsAndLargerIntermediateIsNotAllocated) {
1704 DisplayListBuilder builder;
1707 red.setColor(DlColor::kRed());
1710 green.setColor(DlColor::kGreen());
1713 blue.setColor(DlColor::kBlue());
1716 save.setColor(DlColor::kBlack().modulateOpacity(0.5));
1718 DlRect huge_bounds = DlRect::MakeXYWH(0, 0, 100000, 100000);
1719 builder.SaveLayer(huge_bounds, &save);
1721 builder.DrawRect(DlRect::MakeXYWH(0, 0, 100, 100), red);
1722 builder.DrawRect(DlRect::MakeXYWH(10, 10, 100, 100), green);
1723 builder.DrawRect(DlRect::MakeXYWH(20, 20, 100, 100), blue);
1727 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1732 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
1738 GetContext()->GetCapabilities()->GetDefaultColorFormat();
1745 DisplayListBuilder builder;
1752 builder.Translate(100, 200);
1753 builder.Scale(0.5, 0.5);
1754 builder.DrawImage(image,
DlPoint(100.0, 100.0),
1755 DlImageSampling::kNearestNeighbor);
1762 alpha.setColor(DlColor::kRed().modulateOpacity(0.5));
1764 builder.SaveLayer(std::nullopt, &alpha);
1767 paint.setColor(DlColor::kRed());
1768 builder.DrawRect(DlRect::MakeXYWH(000, 000, 100, 100), paint);
1769 paint.setColor(DlColor::kGreen());
1770 builder.DrawRect(DlRect::MakeXYWH(020, 020, 100, 100), paint);
1771 paint.setColor(DlColor::kBlue());
1772 builder.DrawRect(DlRect::MakeXYWH(040, 040, 100, 100), paint);
1777 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1781 DisplayListBuilder builder;
1784 paint.setColor(DlColor::kRed());
1785 builder.DrawCircle(
DlPoint(250, 250), 125, paint);
1787 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1791 DisplayListBuilder builder;
1794 red.setColor(DlColor::kRed());
1796 builder.DrawRect(DlRect::MakeXYWH(0, 0, 100, 100), red);
1798 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1802 DisplayListBuilder builder;
1805 save.setColor(DlColor::kBlack());
1807 DlRect save_bounds = DlRect::MakeXYWH(0, 0, 50, 50);
1808 builder.SaveLayer(save_bounds, &save);
1811 paint.setColor(DlColor::kRed());
1812 builder.DrawRect(DlRect::MakeXYWH(0, 0, 100, 100), paint);
1813 paint.setColor(DlColor::kGreen());
1814 builder.DrawRect(DlRect::MakeXYWH(10, 10, 100, 100), paint);
1815 paint.setColor(DlColor::kBlue());
1816 builder.DrawRect(DlRect::MakeXYWH(20, 20, 100, 100), paint);
1820 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1824 DisplayListBuilder builder;
1825 builder.Scale(GetContentScale().
x, GetContentScale().y);
1828 const int color_count = 3;
1829 DlColor colors[color_count] = {
1832 DlColor::ARGB(1.0, 220.0f / 255.0f, 20.0f / 255.0f, 60.0f / 255.0f),
1835 paint.setColor(DlColor::kWhite());
1836 builder.DrawPaint(paint);
1839 const DlPaint& paint) {
1840 builder.DrawPath(DlPath::MakeRoundRectXY(rect,
x, y), paint);
1844 for (
int i = 0; i < 4; i++) {
1845 for (
int j = 0; j < 4; j++) {
1846 paint.setColor(colors[(c_index++) % color_count]);
1847 draw_rrect_as_path(DlRect::MakeXYWH(i * 100 + 10, j * 100 + 20, 80, 80),
1848 i * 5 + 10, j * 5 + 10, paint);
1851 paint.setColor(colors[(c_index++) % color_count]);
1852 draw_rrect_as_path(DlRect::MakeXYWH(10, 420, 380, 80), 40, 40, paint);
1853 paint.setColor(colors[(c_index++) % color_count]);
1854 draw_rrect_as_path(DlRect::MakeXYWH(410, 20, 80, 380), 40, 40, paint);
1856 std::vector<DlColor> gradient_colors = {
1857 DlColor::RGBA(0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0),
1858 DlColor::RGBA(0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0),
1859 DlColor::RGBA(0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0),
1860 DlColor::RGBA(0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0),
1861 DlColor::RGBA(0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0),
1862 DlColor::RGBA(0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0),
1863 DlColor::RGBA(0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0)};
1864 std::vector<Scalar> stops = {
1874 CreateTextureForFixture(
"airplane.jpg",
1877 paint.setColor(DlColor::kWhite().modulateOpacity(0.1));
1878 paint.setColorSource(DlColorSource::MakeRadial(
1881 gradient_colors.size(),
1882 gradient_colors.data(),
1884 DlTileMode::kMirror));
1885 for (
int i = 1; i <= 10; i++) {
1887 draw_rrect_as_path(DlRect::MakeLTRB(550 - i * 20, 550 - j * 20,
1888 550 + i * 20, 550 + j * 20),
1889 i * 10, j * 10, paint);
1891 paint.setColor(DlColor::kWhite().modulateOpacity(0.5));
1892 paint.setColorSource(DlColorSource::MakeRadial(
1895 gradient_colors.size(),
1896 gradient_colors.data(),
1898 DlTileMode::kMirror));
1899 draw_rrect_as_path(DlRect::MakeLTRB(100, 610, 300, 690), 40, 40, paint);
1900 draw_rrect_as_path(DlRect::MakeLTRB(160, 550, 240, 750), 40, 40, paint);
1902 auto matrix = DlMatrix::MakeTranslation({520, 20});
1903 paint.setColor(DlColor::kWhite().modulateOpacity(0.1));
1904 paint.setColorSource(DlColorSource::MakeImage(
1905 texture, DlTileMode::kRepeat, DlTileMode::kRepeat,
1906 DlImageSampling::kMipmapLinear, &matrix));
1907 for (
int i = 1; i <= 10; i++) {
1909 draw_rrect_as_path(DlRect::MakeLTRB(720 - i * 20, 220 - j * 20,
1910 720 + i * 20, 220 + j * 20),
1911 i * 10, j * 10, paint);
1913 matrix = DlMatrix::MakeTranslation({800, 300});
1914 paint.setColor(DlColor::kWhite().modulateOpacity(0.5));
1915 paint.setColorSource(DlColorSource::MakeImage(
1916 texture, DlTileMode::kRepeat, DlTileMode::kRepeat,
1917 DlImageSampling::kMipmapLinear, &matrix));
1919 draw_rrect_as_path(DlRect::MakeLTRB(800, 410, 1000, 490), 40, 40, paint);
1920 draw_rrect_as_path(DlRect::MakeLTRB(860, 350, 940, 550), 40, 40, paint);
1922 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1926 auto callback = [&]() -> sk_sp<DisplayList> {
1927 DisplayListBuilder builder;
1928 builder.Scale(GetContentScale().x, GetContentScale().y);
1931 alpha.setColor(DlColor::kRed().modulateOpacity(0.5));
1933 auto current =
Point{25, 25};
1934 const auto offset =
Point{25, 25};
1935 const auto size =
Size(100, 100);
1940 DlRect bounds = DlRect::MakeLTRB(b0.x, b0.y, b1.x, b1.y);
1942 DlPaint stroke_paint;
1943 stroke_paint.setColor(DlColor::kYellow());
1944 stroke_paint.setStrokeWidth(5);
1945 stroke_paint.setDrawStyle(DlDrawStyle::kStroke);
1946 builder.DrawRect(bounds, stroke_paint);
1948 builder.SaveLayer(bounds, &alpha);
1951 paint.setColor(DlColor::kRed());
1953 DlRect::MakeXYWH(current.x, current.y, size.width, size.height), paint);
1955 paint.setColor(DlColor::kGreen());
1958 DlRect::MakeXYWH(current.x, current.y, size.width, size.height), paint);
1960 paint.setColor(DlColor::kBlue());
1963 DlRect::MakeXYWH(current.x, current.y, size.width, size.height), paint);
1967 return builder.Build();
1970 ASSERT_TRUE(OpenPlaygroundHere(callback));
1975 DisplayListBuilder builder;
1978 paint.setColor(DlColor::kBlack());
1979 DlRect rect = DlRect::MakeXYWH(25, 25, 25, 25);
1980 builder.DrawRect(rect, paint);
1982 builder.Translate(10, 10);
1985 builder.SaveLayer(std::nullopt, &save_paint);
1987 paint.setColor(DlColor::kGreen());
1988 builder.DrawRect(rect, paint);
1992 builder.Translate(10, 10);
1993 paint.setColor(DlColor::kRed());
1994 builder.DrawRect(rect, paint);
1996 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
2000 DisplayListBuilder builder;
2002 DlRect rect = DlRect::MakeXYWH(0, 0, 1000, 1000);
2007 DlRect bounds = DlRect::MakeXYWH(25, 25, 25, 25);
2008 builder.SaveLayer(bounds, &save_paint);
2009 paint.setColor(DlColor::kBlack());
2010 builder.DrawRect(rect, paint);
2016 DlRect bounds = DlRect::MakeXYWH(35, 35, 25, 25);
2017 builder.SaveLayer(bounds, &save_paint);
2018 paint.setColor(DlColor::kGreen());
2019 builder.DrawRect(rect, paint);
2025 DlRect bounds = DlRect::MakeXYWH(45, 45, 25, 25);
2026 builder.SaveLayer(bounds, &save_paint);
2027 paint.setColor(DlColor::kRed());
2028 builder.DrawRect(rect, paint);
2032 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
2036 DisplayListBuilder builder;
2039 paint.setColor(DlColor::kWhite());
2040 builder.DrawPaint(paint);
2046 builder.ClipPath(path);
2048 DlRect bounds = DlRect::MakeXYWH(50, 50, 100, 100);
2050 builder.SaveLayer(bounds, &save_paint);
2053 paint.setColor(DlColor::kWhite());
2054 builder.DrawRect(DlRect::MakeSize(DlSize(400, 400)), paint);
2057 paint.setColor(DlColor::kGreen());
2058 paint.setBlendMode(DlBlendMode::kHardLight);
2059 builder.DrawRect(DlRect::MakeSize(DlSize(400, 400)), paint);
2062 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
2066 DisplayListBuilder builder;
2068 builder.Scale(GetContentScale().
x, GetContentScale().y);
2069 builder.Translate(100, 100);
2072 auto draw_image_layer = [&builder, &texture](
const DlPaint& paint) {
2073 builder.SaveLayer(std::nullopt, &paint);
2074 builder.DrawImage(texture,
DlPoint(), DlImageSampling::kLinear);
2078 DlPaint effect_paint;
2079 effect_paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 6));
2080 draw_image_layer(effect_paint);
2082 builder.Translate(300, 300);
2083 builder.Scale(3, 3);
2084 draw_image_layer(effect_paint);
2086 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
2090 DisplayListBuilder builder;
2092 builder.Scale(GetContentScale().
x, GetContentScale().y);
2094 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 1));
2097 save_paint.setColor(DlColor::kWhite());
2098 builder.DrawPaint(save_paint);
2100 paint.setColor(DlColor::kBlue());
2101 for (
int i = 0; i < 5; i++) {
2103 Scalar y_radius = i * 15;
2104 for (
int j = 0; j < 5; j++) {
2106 Scalar x_radius = j * 15;
2107 builder.DrawRoundRect(
2108 DlRoundRect::MakeRectXY(
2109 DlRect::MakeXYWH(
x + 50, y + 50, 100.0f, 100.0f),
2110 x_radius, y_radius),
2115 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
2119 DisplayListBuilder builder;
2123 builder.SaveLayer(std::nullopt, &paint);
2125 builder.Translate(100, 100);
2126 paint.setColor(DlColor::kBlue());
2127 builder.DrawCircle(
DlPoint(200, 200), 200, paint);
2128 builder.ClipRect(DlRect::MakeXYWH(100, 100, 200, 200));
2130 paint.setColor(DlColor::kGreen());
2131 paint.setBlendMode(DlBlendMode::kSrcOver);
2132 paint.setImageFilter(DlImageFilter::MakeColorFilter(
2133 DlColorFilter::MakeBlend(DlColor::kWhite(), DlBlendMode::kDst)));
2134 builder.DrawCircle(
DlPoint(200, 200), 200, paint);
2138 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
2146 GTEST_SKIP() <<
"Swiftshader is running out of memory on this example.";
2148 DisplayListBuilder builder(DlRect::MakeSize(DlSize(1000, 1000)));
2150 auto filter = DlImageFilter::MakeMatrix(
2151 DlMatrix::MakeScale({0.001, 0.001, 1}), DlImageSampling::kLinear);
2154 paint.setImageFilter(filter);
2155 builder.SaveLayer(std::nullopt, &paint);
2158 paint.setColor(DlColor::kRed());
2159 builder.DrawRect(DlRect::MakeLTRB(0, 0, 100000, 100000), paint);
2163 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
2170 auto callback = [&]() -> sk_sp<DisplayList> {
2172 ImGuiWindowFlags_AlwaysAutoResize)) {
2173 ImGui::SliderFloat(
"width", &width, 0, 200);
2174 ImGui::SliderFloat(
"height", &height, 0, 200);
2175 ImGui::SliderFloat(
"corner", &corner, 0, 1);
2179 DisplayListBuilder builder;
2180 builder.Scale(GetContentScale().
x, GetContentScale().y);
2182 DlPaint background_paint;
2183 background_paint.setColor(DlColor(1, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
2184 builder.DrawPaint(background_paint);
2186 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue()};
2187 std::vector<Scalar> stops = {0.0, 1.0};
2190 auto gradient = DlColorSource::MakeLinear(
DlPoint(0, 0),
DlPoint(200, 200),
2191 2, colors.data(), stops.data(),
2192 DlTileMode::kClamp);
2193 paint.setColorSource(gradient);
2194 paint.setColor(DlColor::kWhite());
2195 paint.setDrawStyle(DlDrawStyle::kStroke);
2196 paint.setStrokeWidth(20);
2199 builder.Translate(100, 100);
2201 Scalar corner_x = ((1 - corner) * 50) + 50;
2202 Scalar corner_y = corner * 50 + 50;
2204 DlRect::MakeXYWH(0, 0, width, height), corner_x, corner_y);
2205 builder.DrawRoundRect(rrect, paint);
2207 return builder.Build();
2209 ASSERT_TRUE(OpenPlaygroundHere(callback));
2213 DisplayListBuilder builder;
2215 builder.DrawPaint(DlPaint().setColor(DlColor::kWhite()));
2218 builder.ClipRect(DlRect::MakeLTRB(100, 100, 800, 800));
2222 builder.ClipRect(DlRect::MakeLTRB(600, 600, 800, 800));
2223 builder.DrawPaint(DlPaint().setColor(DlColor::kRed()));
2224 builder.DrawPaint(DlPaint().setColor(DlColor::kBlue().withAlphaF(0.5)));
2225 builder.ClipRect(DlRect::MakeLTRB(700, 700, 750, 800));
2226 builder.DrawPaint(DlPaint().setColor(DlColor::kRed().withAlphaF(0.5)));
2230 auto image_filter = DlImageFilter::MakeBlur(10, 10, DlTileMode::kDecal);
2231 builder.SaveLayer(std::nullopt,
nullptr, image_filter.get());
2234 builder.DrawCircle(
DlPoint(100, 100), 100,
2235 DlPaint().setColor(DlColor::kAqua()));
2237 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
static bool ImGuiBegin(const char *name, bool *p_open, ImGuiWindowFlags flags)
static sk_sp< DlImageImpeller > Make(std::shared_ptr< Texture > texture, OwningContext owning_context=OwningContext::kIO)
TEST_P(AiksTest, DrawAtlasNoColor)
std::tuple< Point, Point > DrawPlaygroundLine(PlaygroundPoint &point_a, PlaygroundPoint &point_b)
constexpr float kEhCloseEnough
flutter::DlRoundRect DlRoundRect
PixelFormat
The Pixel formats supported by Impeller. The naming convention denotes the usage of the component,...
constexpr const char * PixelFormatToString(PixelFormat format)
flutter::DlScalar DlScalar
void Close(PathBuilder *builder)
static constexpr Color White()
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static Matrix MakeRotationY(Radians r)
constexpr Quad Transform(const Quad &quad) const
static RoundRect MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)