5 #include "display_list/dl_sampling_options.h"
6 #include "display_list/dl_tile_mode.h"
7 #include "display_list/effects/dl_color_source.h"
8 #include "display_list/effects/dl_mask_filter.h"
11 #include "flutter/display_list/dl_blend_mode.h"
12 #include "flutter/display_list/dl_builder.h"
13 #include "flutter/display_list/dl_color.h"
14 #include "flutter/display_list/dl_paint.h"
15 #include "flutter/display_list/effects/dl_color_filter.h"
16 #include "flutter/display_list/geometry/dl_path_builder.h"
17 #include "flutter/testing/testing.h"
28 DisplayListBuilder builder;
29 builder.Transform(DlMatrix::MakeTranslation(
DlPoint(300, 300)) *
30 DlMatrix::MakeRotationZ(DlDegrees(90)));
32 DlPathBuilder arrow_stem;
33 DlPathBuilder arrow_head;
36 arrow_head.MoveTo(
DlPoint(50, 120))
41 DlColorFilter::MakeBlend(DlColor::kAliceBlue(), DlBlendMode::kSrcIn);
44 paint.setStrokeWidth(15.0);
45 paint.setStrokeCap(DlStrokeCap::kRound);
46 paint.setStrokeJoin(DlStrokeJoin::kRound);
47 paint.setDrawStyle(DlDrawStyle::kStroke);
48 paint.setColorFilter(filter);
49 paint.setColor(DlColor::kBlack());
51 builder.DrawPath(arrow_stem.TakePath(), paint);
52 builder.DrawPath(arrow_head.TakePath(), paint);
54 auto dl = builder.Build();
55 ASSERT_TRUE(OpenPlaygroundHere(dl));
59 DisplayListBuilder builder;
61 paint.setColor(DlColor::kRed());
62 paint.setStrokeWidth(20);
63 paint.setDrawStyle(DlDrawStyle::kStroke);
65 builder.DrawPath(DlPath::MakeLine(
DlPoint(200, 100),
DlPoint(800, 100)),
68 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
72 DisplayListBuilder builder;
74 paint.setColor(DlColor::kRed());
75 paint.setStrokeWidth(25);
76 paint.setDrawStyle(DlDrawStyle::kStroke);
78 builder.DrawPath(DlPath::MakeCircle(
DlPoint(500, 500), 250), paint);
80 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
84 DisplayListBuilder builder;
86 paint.setColor(DlColor::kRed());
87 paint.setStrokeWidth(100);
88 paint.setDrawStyle(DlDrawStyle::kStroke);
90 builder.DrawPath(DlPath::MakeCircle(
DlPoint(100, 100), 50), paint);
92 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
96 DisplayListBuilder builder;
98 paint.setColor(DlColor::kRed());
99 paint.setStrokeWidth(0.01);
100 paint.setDrawStyle(DlDrawStyle::kStroke);
102 builder.DrawPath(DlPath::MakeCircle(
DlPoint(100, 100), 50), paint);
104 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
108 DisplayListBuilder builder;
110 paint.setColor(DlColor::kRed());
111 paint.setStrokeWidth(200);
112 paint.setDrawStyle(DlDrawStyle::kStroke);
114 DlPath path = DlPath::MakeArc(DlRect::MakeXYWH(100, 100, 200, 200),
115 DlDegrees(0), DlDegrees(90),
false);
117 builder.DrawPath(path, paint);
119 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
123 DisplayListBuilder builder;
126 paint.setColor(DlColor::kRed());
127 paint.setStrokeWidth(20);
128 paint.setDrawStyle(DlDrawStyle::kStroke);
130 DlPathBuilder path_builder;
131 path_builder.MoveTo(
DlPoint(0, 200));
135 builder.DrawPath(path_builder.TakePath(), paint);
136 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
140 DisplayListBuilder builder;
143 paint.setColor(DlColor::kRed());
144 paint.setStrokeWidth(50);
145 paint.setDrawStyle(DlDrawStyle::kStroke);
146 paint.setStrokeCap(DlStrokeCap::kRound);
150 DlPathBuilder path_builder;
151 path_builder.MoveTo(
DlPoint(250, 250));
152 path_builder.QuadraticCurveTo(
DlPoint(100, 100),
DlPoint(250, 250));
154 builder.DrawPath(path_builder.TakePath(), paint);
156 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
160 DisplayListBuilder builder;
161 builder.Scale(GetContentScale().
x, GetContentScale().y);
164 paint.setColor(DlColor::kRed());
165 paint.setDrawStyle(DlDrawStyle::kFill);
167 DlPaint reference_paint;
168 reference_paint.setColor(DlColor::kGreen());
169 reference_paint.setDrawStyle(DlDrawStyle::kFill);
171 DlPathBuilder path_builder;
172 DlPathBuilder reference_builder;
175 path_builder.MoveTo(
DlPoint(100, 100));
176 path_builder.ConicCurveTo(
DlPoint(150, 150),
DlPoint(200, 100), 1.0f);
177 reference_builder.MoveTo(
DlPoint(300, 100));
178 reference_builder.QuadraticCurveTo(
DlPoint(350, 150),
DlPoint(400, 100));
181 path_builder.MoveTo(
DlPoint(100, 200));
183 reference_builder.MoveTo(
DlPoint(300, 200));
184 auto magic = DlPathBuilder::kArcApproximationMagic;
185 reference_builder.CubicCurveTo(
DlPoint(300, 200) +
DlPoint(50, 50) * magic,
190 path_builder.MoveTo(
DlPoint(100, 300));
191 path_builder.ConicCurveTo(
DlPoint(150, 350),
DlPoint(200, 300), 0.01f);
192 reference_builder.MoveTo(
DlPoint(300, 300));
193 reference_builder.LineTo(
DlPoint(350, 300.5));
194 reference_builder.LineTo(
DlPoint(400, 300));
197 path_builder.MoveTo(
DlPoint(100, 400));
198 path_builder.ConicCurveTo(
DlPoint(150, 450),
DlPoint(200, 400), 100.0f);
199 reference_builder.MoveTo(
DlPoint(300, 400));
200 reference_builder.LineTo(
DlPoint(350, 450));
201 reference_builder.LineTo(
DlPoint(400, 400));
203 builder.DrawPath(path_builder.TakePath(), paint);
204 builder.DrawPath(reference_builder.TakePath(), reference_paint);
206 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
210 DisplayListBuilder builder;
211 builder.Scale(GetContentScale().
x, GetContentScale().y);
214 paint.setColor(DlColor::kRed());
215 paint.setStrokeWidth(10);
216 paint.setDrawStyle(DlDrawStyle::kStroke);
217 paint.setStrokeCap(DlStrokeCap::kRound);
218 paint.setStrokeJoin(DlStrokeJoin::kRound);
220 DlPaint reference_paint;
221 reference_paint.setColor(DlColor::kGreen());
222 reference_paint.setStrokeWidth(10);
223 reference_paint.setDrawStyle(DlDrawStyle::kStroke);
224 reference_paint.setStrokeCap(DlStrokeCap::kRound);
225 reference_paint.setStrokeJoin(DlStrokeJoin::kRound);
227 DlPathBuilder path_builder;
228 DlPathBuilder reference_builder;
231 path_builder.MoveTo(
DlPoint(100, 100));
232 path_builder.ConicCurveTo(
DlPoint(150, 150),
DlPoint(200, 100), 1.0f);
233 reference_builder.MoveTo(
DlPoint(300, 100));
234 reference_builder.QuadraticCurveTo(
DlPoint(350, 150),
DlPoint(400, 100));
237 path_builder.MoveTo(
DlPoint(100, 200));
239 reference_builder.MoveTo(
DlPoint(300, 200));
240 auto magic = DlPathBuilder::kArcApproximationMagic;
241 reference_builder.CubicCurveTo(
DlPoint(300, 200) +
DlPoint(50, 50) * magic,
246 path_builder.MoveTo(
DlPoint(100, 300));
247 path_builder.ConicCurveTo(
DlPoint(150, 350),
DlPoint(200, 300), 0.0f);
248 reference_builder.MoveTo(
DlPoint(300, 300));
249 reference_builder.LineTo(
DlPoint(400, 300));
252 path_builder.MoveTo(
DlPoint(100, 400));
253 path_builder.ConicCurveTo(
DlPoint(150, 450),
DlPoint(200, 400), 100.0f);
254 reference_builder.MoveTo(
DlPoint(300, 400));
255 reference_builder.LineTo(
DlPoint(350, 450));
256 reference_builder.LineTo(
DlPoint(400, 400));
258 builder.DrawPath(path_builder.TakePath(), paint);
259 builder.DrawPath(reference_builder.TakePath(), reference_paint);
261 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
268 auto callback = [&]() -> sk_sp<DisplayList> {
270 ImGuiWindowFlags_AlwaysAutoResize)) {
271 ImGui::SliderFloat(
"Scale", &scale, 0, 6);
272 ImGui::SliderFloat(
"Rotate", &rotation, 0, 90);
273 ImGui::SliderFloat(
"Offset", &offset, 0, 2);
277 DisplayListBuilder builder;
278 builder.Scale(GetContentScale().
x, GetContentScale().y);
279 builder.DrawPaint(DlPaint(DlColor(0xff111111)));
282 paint.setStrokeWidth(0.f);
283 paint.setColor(DlColor::kWhite());
284 paint.setStrokeCap(DlStrokeCap::kRound);
285 paint.setStrokeJoin(DlStrokeJoin::kRound);
286 paint.setDrawStyle(DlDrawStyle::kStroke);
288 builder.Translate(512, 384);
289 builder.Scale(scale, scale);
290 builder.Rotate(rotation);
291 builder.Translate(-512, -384 + offset);
293 for (
int i = 0; i < 5; ++i) {
294 Scalar yoffset = i * 25.25f + 300.f;
295 DlPathBuilder path_builder;
297 path_builder.MoveTo(
DlPoint(100, yoffset));
298 path_builder.LineTo(
DlPoint(924, yoffset));
299 builder.DrawPath(path_builder.TakePath(), paint);
302 return builder.Build();
305 ASSERT_TRUE(OpenPlaygroundHere(callback));
312 auto callback = [&]() -> sk_sp<DisplayList> {
314 ImGuiWindowFlags_AlwaysAutoResize)) {
315 ImGui::SliderFloat(
"Scale", &scale, 0, 6);
316 ImGui::SliderFloat(
"Rotate", &rotation, 0, 90);
317 ImGui::SliderFloat(
"Offset", &offset, 0, 2);
321 DisplayListBuilder builder;
322 builder.Scale(GetContentScale().
x, GetContentScale().y);
323 builder.DrawPaint(DlPaint(DlColor(0xff111111)));
326 paint.setStrokeWidth(0.f);
327 paint.setColor(DlColor::kWhite());
329 builder.Translate(512, 384);
330 builder.Scale(scale, scale);
331 builder.Rotate(rotation);
332 builder.Translate(-512, -384 + offset);
334 for (
int i = 0; i < 5; ++i) {
335 Scalar yoffset = i * 25.25f + 300.f;
337 builder.DrawLine(
DlPoint(100, yoffset),
DlPoint(924, yoffset), paint);
340 return builder.Build();
343 ASSERT_TRUE(OpenPlaygroundHere(callback));
347 DisplayListBuilder builder;
348 builder.Scale(GetContentScale().
x, GetContentScale().y);
351 paint.setColor(DlColor::kRed());
352 paint.setDrawStyle(DlDrawStyle::kFill);
354 DlPaint reference_paint;
355 reference_paint.setColor(DlColor::kGreen());
356 reference_paint.setDrawStyle(DlDrawStyle::kFill);
358 DlPathBuilder path_builder;
360 path_builder.MoveTo(
DlPoint(100, 100));
361 path_builder.ConicCurveTo(
DlPoint(150, 450),
DlPoint(200, 100), 5.0f);
363 DlPathBuilder reference_builder;
368 reference_builder.MoveTo(component.p1);
369 constexpr
int N = 100;
370 for (
int i = 1; i < N; i++) {
371 reference_builder.LineTo(component.Solve(
static_cast<Scalar>(i) / N));
373 reference_builder.LineTo(component.p2);
376 line_paint.setColor(DlColor::kYellow());
377 line_paint.setDrawStyle(DlDrawStyle::kStroke);
378 line_paint.setStrokeWidth(1.0f);
382 builder.DrawLine(
DlPoint(145, 100),
DlPoint(145, 450), line_paint);
383 builder.DrawLine(
DlPoint(155, 100),
DlPoint(155, 450), line_paint);
384 builder.DrawLine(
DlPoint(345, 100),
DlPoint(345, 450), line_paint);
385 builder.DrawLine(
DlPoint(355, 100),
DlPoint(355, 450), line_paint);
386 builder.DrawLine(
DlPoint(100, 392.5f),
DlPoint(400, 392.5f), line_paint);
389 builder.DrawPath(path_builder.TakePath(), paint);
390 builder.DrawPath(reference_builder.TakePath(), reference_paint);
392 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
396 DisplayListBuilder builder;
399 paint.setColor(DlColor::kRed());
403 .top_right = {25, 50},
404 .bottom_left = {25, 50},
405 .bottom_right = {50, 25},
407 DlPathBuilder path_builder;
409 DlRoundRect::MakeRectRadii(DlRect::MakeXYWH(100, 100, 200, 200), radii);
412 path_builder.AddPath(DlPath::MakeRoundRect(rrect));
413 path_builder.AddPath(DlPath::MakeCircle(
DlPoint(200, 200), 50));
414 path_builder.SetFillType(DlPathFillType::kOdd);
415 DlPath path = path_builder.TakePath();
420 builder.DrawPath(path, paint);
422 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
429 DisplayListBuilder builder;
435 DlPathBuilder path_builder;
436 path_builder.MoveTo(
DlPoint(50, 50));
437 path_builder.LineTo(
DlPoint(50, 100));
438 path_builder.LineTo(
DlPoint(100, 100));
439 path_builder.LineTo(
DlPoint(100, 50));
442 paint.setColor(DlColor::kRed());
443 paint.setDrawStyle(DlDrawStyle::kStroke);
444 paint.setStrokeWidth(10);
446 builder.DrawPath(path_builder.TakePath(), paint);
448 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
452 DisplayListBuilder builder;
456 DlPathBuilder path_builder;
457 path_builder.MoveTo(
DlPoint(50, 50));
458 path_builder.LineTo(
DlPoint(520, 120));
459 path_builder.LineTo(
DlPoint(300, 310));
460 path_builder.LineTo(
DlPoint(100, 50));
461 path_builder.Close();
464 paint.setColor(DlColor::kRed());
465 paint.setDrawStyle(DlDrawStyle::kStroke);
466 paint.setStrokeWidth(10);
468 builder.DrawPath(path_builder.TakePath(), paint);
470 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
475 auto callback = [&]() -> sk_sp<DisplayList> {
477 static float scale = 3;
478 static bool add_circle_clip =
true;
481 ImGuiWindowFlags_AlwaysAutoResize)) {
482 ImGui::ColorEdit4(
"Color",
reinterpret_cast<float*
>(&color));
483 ImGui::SliderFloat(
"Scale", &scale, 0, 6);
484 ImGui::Checkbox(
"Circle clip", &add_circle_clip);
488 DisplayListBuilder builder;
489 builder.Scale(GetContentScale().
x, GetContentScale().y);
492 paint.setColor(DlColor::kWhite());
493 builder.DrawPaint(paint);
497 paint.setDrawStyle(DlDrawStyle::kStroke);
498 paint.setStrokeWidth(10);
500 DlPathBuilder path_builder;
501 path_builder.MoveTo(
DlPoint(20, 20));
503 path_builder.Close();
504 path_builder.MoveTo(
DlPoint(60, 20));
506 DlPath path = path_builder.TakePath();
508 builder.Scale(scale, scale);
510 if (add_circle_clip) {
515 auto [handle_a, handle_b] =
518 Matrix screen_to_canvas = builder.GetMatrix();
522 screen_to_canvas = screen_to_canvas.
Invert();
524 Point point_a = screen_to_canvas * handle_a;
525 Point point_b = screen_to_canvas * handle_b;
527 Point middle = point_a + point_b;
528 middle *= GetContentScale().
x / 2;
532 builder.ClipPath(DlPath::MakeCircle(middle, radius));
536 {DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
537 paint.setStrokeJoin(join);
539 {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
540 paint.setStrokeCap(cap);
541 builder.DrawPath(path, paint);
542 builder.Translate(80, 0);
544 builder.Translate(-240, 60);
547 return builder.Build();
550 ASSERT_TRUE(OpenPlaygroundHere(callback));
554 DisplayListBuilder builder;
555 builder.Scale(GetContentScale().
x, GetContentScale().y);
558 paint.setColor(DlColor::kBlue());
559 paint.setStrokeWidth(10);
561 auto draw = [&builder](DlPaint& paint) {
563 {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
564 paint.setStrokeCap(cap);
567 for (
int d = 15; d < 90; d += 15) {
569 Point origin = {100, 100};
572 auto a = origin + m * p0;
573 auto b = origin + m * p1;
575 builder.DrawLine(a,
b, paint);
578 builder.DrawCircle(origin, 35, paint);
582 builder.Translate(250, 0);
584 builder.Translate(-750, 250);
587 std::vector<DlColor> colors = {
588 DlColor::ARGB(1, 0x1f / 255.0, 0.0, 0x5c / 255.0),
589 DlColor::ARGB(1, 0x5b / 255.0, 0.0, 0x60 / 255.0),
590 DlColor::ARGB(1, 0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0),
591 DlColor::ARGB(1, 0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0),
592 DlColor::ARGB(1, 0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0),
593 DlColor::ARGB(1, 0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0),
594 DlColor::ARGB(1, 0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0)};
595 std::vector<Scalar> stops = {
606 CreateTextureForFixture(
"airplane.jpg",
611 paint.setColorSource(DlColorSource::MakeRadial({100, 100}, 200, stops.size(),
612 colors.data(), stops.data(),
613 DlTileMode::kMirror));
616 DlMatrix matrix = DlMatrix::MakeTranslation({-150, 75});
617 paint.setColorSource(DlColorSource::MakeImage(
618 texture, DlTileMode::kRepeat, DlTileMode::kRepeat,
619 DlImageSampling::kMipmapLinear, &matrix));
622 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
631 auto callback = [&]() -> sk_sp<DisplayList> {
633 ImGuiWindowFlags_AlwaysAutoResize)) {
634 ImGui::SliderFloat(
"Scale", &scale, 0.001, 5);
635 ImGui::SliderFloat(
"Width", &line_width, 1, 20);
639 DisplayListBuilder builder;
640 builder.Scale(GetContentScale().
x, GetContentScale().y);
642 builder.DrawPaint(DlPaint(DlColor(0xff111111)));
646 paint.setColor(DlColor::kGreenYellow());
647 paint.setStrokeWidth(line_width);
653 builder.Translate(100, 300);
654 builder.Scale(scale, scale);
655 builder.Translate(-100, -300);
663 paint.setColor(DlColor::kGreenYellow());
664 paint.setStrokeWidth(2.0);
667 builder.Translate(100, 500);
668 builder.Scale(0.2, 0.2);
669 builder.Translate(-100, -500);
675 return builder.Build();
677 ASSERT_TRUE(OpenPlaygroundHere(callback));
682 float line_width = 10.f;
683 float rotation = 0.f;
685 auto callback = [&]() -> sk_sp<DisplayList> {
687 ImGuiWindowFlags_AlwaysAutoResize)) {
689 ImGui::SliderFloat(
"Scale", &scale, 0.001f, 5.0f);
690 ImGui::SliderFloat(
"Width", &line_width, 1.0f, 20.0f);
691 ImGui::SliderFloat(
"Rotation", &rotation, 0.0f, 180.0f);
695 DisplayListBuilder builder;
696 builder.Scale(
static_cast<float>(GetContentScale().
x),
697 static_cast<float>(GetContentScale().y));
699 builder.DrawPaint(DlPaint(DlColor(0xff111111)));
705 hex_paint.setStrokeWidth(line_width);
711 float r_sin60 = r * std::sqrt(3.0f) / 2.0f;
712 float r_cos60 = r / 2.0f;
722 DlPoint(cx + r_cos60, cy + r_sin60);
725 builder.Translate(cx, cy);
726 builder.Scale(scale, scale);
727 builder.Rotate(rotation);
728 builder.Translate(-cx, -cy);
730 builder.DrawLine(v0, v1, hex_paint);
731 builder.DrawLine(v1, v2, hex_paint);
732 builder.DrawLine(v2, v3, hex_paint);
733 builder.DrawLine(v3, v4, hex_paint);
734 builder.DrawLine(v4, v5, hex_paint);
735 builder.DrawLine(v5, v0, hex_paint);
738 return builder.Build();
740 ASSERT_TRUE(OpenPlaygroundHere(callback));
744 DisplayListBuilder builder;
745 builder.Scale(GetContentScale().
x, GetContentScale().y);
747 builder.DrawPaint(DlPaint(DlColor(0xff111111)));
750 paint.setColor(DlColor::kGreenYellow());
751 paint.setStrokeWidth(10);
753 auto draw = [&builder](DlPaint& paint) {
755 {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
756 paint.setStrokeCap(cap);
759 for (
int d = 15; d < 90; d += 15) {
761 Point origin = {100, 100};
764 auto a = origin + m * p0;
765 auto b = origin + m * p1;
767 builder.DrawLine(a,
b, paint);
770 builder.DrawCircle(origin, 35, paint);
774 builder.Translate(250, 0);
776 builder.Translate(-750, 250);
781 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
785 DisplayListBuilder builder;
787 paint.setColor(DlColor::kRed());
788 paint.setDrawStyle(DlDrawStyle::kStroke);
789 paint.setStrokeWidth(10);
791 builder.Translate(100, 100);
792 builder.DrawPath(DlPath::MakeRect(DlRect::MakeSize(DlSize(100, 100))), paint);
794 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
798 DisplayListBuilder builder;
800 paint.setColor(DlColor::kRed());
801 paint.setDrawStyle(DlDrawStyle::kStroke);
802 paint.setStrokeWidth(10);
803 paint.setStrokeJoin(DlStrokeJoin::kBevel);
805 builder.Translate(100, 100);
806 builder.DrawPath(DlPath::MakeRect(DlRect::MakeSize(DlSize(100, 100))), paint);
808 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
812 DlPathBuilder path_builder;
813 for (
auto i = 0; i < 10; i++) {
818 DlPath::MakeCircle(
DlPoint(100 + 50 * i, 100 + 50 * i), 100);
819 path_builder.AddPath(circle);
820 path_builder.Close();
822 path_builder.MoveTo(
DlPoint(100.f + 50.f * i - 100, 100.f + 50.f * i));
823 path_builder.LineTo(
DlPoint(100.f + 50.f * i, 100.f + 50.f * i - 100));
824 path_builder.LineTo(
DlPoint(100.f + 50.f * i - 100,
825 100.f + 50.f * i - 100));
826 path_builder.Close();
829 DlPath path = path_builder.TakePath();
831 DisplayListBuilder builder;
833 paint.setColor(DlColor::kRed().withAlpha(102));
834 builder.DrawPath(path, paint);
836 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
840 DisplayListBuilder builder;
841 builder.Scale(GetContentScale().
x, GetContentScale().y);
844 paint.setColor(DlColor::kRed());
846 std::vector<DlColor> colors = {DlColor::RGBA(1.0, 0.0, 0.0, 1.0),
847 DlColor::RGBA(0.0, 0.0, 0.0, 1.0)};
848 std::vector<Scalar> stops = {0.0, 1.0};
850 paint.setColorSource(
851 DlColorSource::MakeSweep({100, 100}, 45, 135, stops.size(), colors.data(),
852 stops.data(), DlTileMode::kMirror));
853 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
855 DlPathBuilder path_builder;
856 path_builder.AddArc(DlRect::MakeXYWH(10, 10, 100, 100),
857 DlDegrees(0), DlDegrees(0));
858 builder.DrawPath(path_builder.TakePath(), paint);
865 DisplayListBuilder builder;
867 paint.setColor(DlColor::kFuchsia());
869 builder.ClipPath(DlPath::MakeRect(DlRect::MakeXYWH(0, 0, 500, 500)));
870 builder.DrawPath(DlPath::MakeCircle(
DlPoint(500, 500), 250), paint);
872 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
880 auto callback = [&]() -> sk_sp<DisplayList> {
882 ImGuiWindowFlags_AlwaysAutoResize)) {
883 ImGui::SliderFloat(
"Stroke Width", &stroke_width, 1, 300);
884 ImGui::SliderFloat(
"Aspect", &aspect, 0.5, 2.0);
885 ImGui::SliderFloat(
"Start Angle", &start_angle, 0, 360);
886 ImGui::SliderFloat(
"End Angle", &end_angle, 0, 360);
890 DisplayListBuilder builder;
892 grey_paint.setColor(DlColor(0xff111111));
893 builder.DrawPaint(grey_paint);
896 white_paint.setColor(DlColor::kWhite());
897 white_paint.setStrokeWidth(stroke_width);
898 white_paint.setDrawStyle(DlDrawStyle::kStroke);
900 red_paint.setColor(DlColor::kRed());
903 builder.DrawRect(rect, red_paint);
904 builder.DrawArc(rect, start_angle, end_angle,
907 builder.DrawLine(
Point(frontier, 0),
Point(frontier, 150), red_paint);
909 return builder.Build();
911 ASSERT_TRUE(OpenPlaygroundHere(callback));
915 DisplayListBuilder builder;
918 paint.setColor(DlColor::kRed());
922 .top_right = DlSize(50, 50),
923 .bottom_left = DlSize(50, 50),
924 .bottom_right = DlSize(50, 50),
927 const Scalar kTriangleHeight = 100;
929 DlRect::MakeXYWH(-kTriangleHeight / 2.0f, -kTriangleHeight / 2.0f,
930 kTriangleHeight, kTriangleHeight),
935 DlPath rrect_path = DlPath::MakeRoundRect(rrect);
937 builder.Translate(200, 200);
941 DlPathBuilder path_builder;
942 path_builder.MoveTo(
DlPoint(0, kTriangleHeight));
943 path_builder.LineTo(
DlPoint(-kTriangleHeight / 2.0f, 0));
944 path_builder.LineTo(
DlPoint(kTriangleHeight / 2.0f, 0));
945 path_builder.Close();
946 path_builder.AddPath(rrect_path);
948 builder.DrawPath(path_builder.TakePath(), paint);
950 builder.Translate(100, 0);
953 DlPathBuilder path_builder;
954 path_builder.MoveTo(
DlPoint(0, kTriangleHeight));
955 path_builder.LineTo(
DlPoint(-kTriangleHeight / 2.0f, 0));
956 path_builder.LineTo(
DlPoint(0, -10));
957 path_builder.LineTo(
DlPoint(kTriangleHeight / 2.0f, 0));
958 path_builder.Close();
959 path_builder.AddPath(rrect_path);
961 builder.DrawPath(path_builder.TakePath(), paint);
964 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
968 DisplayListBuilder builder;
971 paint.setColor(DlColor::kRed());
972 paint.setDrawStyle(DlDrawStyle::kStroke);
973 paint.setStrokeWidth(15.0);
974 paint.setStrokeCap(DlStrokeCap::kRound);
976 DlPathBuilder path_builder;
977 path_builder.MoveTo(
DlPoint(100, 100));
978 path_builder.LineTo(
DlPoint(150, 150));
979 path_builder.MoveTo(
DlPoint(200, 200));
980 path_builder.LineTo(
DlPoint(200, 200));
982 builder.DrawPath(path_builder.TakePath(), paint);
984 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
988 DisplayListBuilder builder;
989 builder.Scale(GetContentScale().
x, GetContentScale().y);
991 builder.Translate(100, 0);
994 for (
auto cap : std::vector<DlStrokeCap>{
995 DlStrokeCap::kButt, DlStrokeCap::kRound, DlStrokeCap::kSquare}) {
996 DlPathBuilder path_builder;
997 path_builder.MoveTo({20, 50});
998 path_builder.LineTo({50, 50});
999 path_builder.MoveTo({120, 50});
1000 path_builder.LineTo({120, 80});
1001 path_builder.MoveTo({180, 50});
1002 path_builder.LineTo({180, 50});
1003 DlPath path = path_builder.TakePath();
1006 paint.setColor(DlColor::kRed());
1007 paint.setDrawStyle(DlDrawStyle::kStroke);
1008 paint.setStrokeWidth(20.0f);
1009 paint.setStrokeCap(cap);
1010 paint.setStrokeJoin(DlStrokeJoin::kBevel);
1012 builder.DrawPath(path, paint);
1014 paint.setColor(DlColor::kYellow());
1015 paint.setStrokeWidth(1.0f);
1016 paint.setStrokeCap(DlStrokeCap::kButt);
1018 builder.DrawPath(path, paint);
1020 builder.Translate(250, 0);
1024 builder.Translate(0, 100);
1027 for (
auto join : std::vector<DlStrokeJoin>{
1028 DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
1029 DlPathBuilder path_builder;
1030 path_builder.MoveTo({20, 50});
1031 path_builder.LineTo({50, 50});
1032 path_builder.LineTo({80, 50});
1033 path_builder.MoveTo({20, 150});
1034 path_builder.LineTo({50, 150});
1035 path_builder.LineTo({50, 180});
1036 path_builder.MoveTo({20, 250});
1037 path_builder.LineTo({50, 250});
1038 path_builder.LineTo({70, 270});
1039 path_builder.MoveTo({20, 350});
1040 path_builder.LineTo({50, 350});
1041 path_builder.LineTo({30, 370});
1042 path_builder.MoveTo({20, 450});
1043 path_builder.LineTo({50, 450});
1044 path_builder.LineTo({20, 450});
1045 path_builder.MoveTo({120, 80});
1046 path_builder.LineTo({150, 80});
1047 path_builder.LineTo({180, 80});
1048 path_builder.MoveTo({120, 180});
1049 path_builder.LineTo({150, 180});
1050 path_builder.LineTo({150, 150});
1051 path_builder.MoveTo({120, 280});
1052 path_builder.LineTo({150, 280});
1053 path_builder.LineTo({170, 260});
1054 path_builder.MoveTo({120, 380});
1055 path_builder.LineTo({150, 380});
1056 path_builder.LineTo({130, 360});
1057 path_builder.MoveTo({120, 480});
1058 path_builder.LineTo({150, 480});
1059 path_builder.LineTo({120, 480});
1060 DlPath path = path_builder.TakePath();
1064 paint.setColor(DlColor::kRed());
1065 paint.setDrawStyle(DlDrawStyle::kStroke);
1066 paint.setStrokeWidth(20.0f);
1067 paint.setStrokeCap(DlStrokeCap::kSquare);
1068 paint.setStrokeJoin(join);
1069 builder.DrawPath(path, paint);
1071 paint.setColor(DlColor::kYellow());
1072 paint.setStrokeWidth(1.0f);
1073 paint.setStrokeCap(DlStrokeCap::kButt);
1074 builder.DrawPath(path, paint);
1076 builder.Translate(250, 0);
1080 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1084 DisplayListBuilder builder;
1086 paint.setColor(DlColor::kGreen());
1087 paint.setDrawStyle(DlDrawStyle::kStroke);
1088 paint.setStrokeWidth(30);
1089 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 5));
1091 builder.DrawCircle(
DlPoint(200, 200), 100, paint);
1093 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 kSqrt2Over2
flutter::DlRoundRect DlRoundRect
flutter::DlScalar DlScalar
static constexpr Color Black()
constexpr Color WithAlpha(Scalar new_alpha) const
static constexpr Color Red()
A 4x4 matrix using column-major storage.
bool IsInvertible() const
static Matrix MakeRotationZ(Radians r)
constexpr Type GetDistance(const TPoint &p) const
constexpr auto GetRight() const
constexpr static TRect MakeXYWH(Type x, Type y, Type width, Type height)