10 #include "flutter/display_list/dl_blend_mode.h"
11 #include "flutter/display_list/dl_builder.h"
12 #include "flutter/display_list/dl_color.h"
13 #include "flutter/display_list/dl_paint.h"
14 #include "flutter/display_list/dl_text_skia.h"
15 #include "flutter/display_list/dl_tile_mode.h"
16 #include "flutter/display_list/effects/dl_color_filter.h"
17 #include "flutter/display_list/effects/dl_color_source.h"
18 #include "flutter/display_list/effects/dl_image_filters.h"
19 #include "flutter/display_list/effects/dl_mask_filter.h"
20 #include "flutter/display_list/geometry/dl_path_builder.h"
21 #include "flutter/testing/testing.h"
22 #include "gtest/gtest.h"
34 #include "third_party/imgui/imgui.h"
39 flutter::DlColor
toColor(
const float* components) {
41 Color(components[0], components[1], components[2], components[3])));
48 flutter::DisplayListBuilder builder;
49 builder.DrawRect(DlRect::MakeXYWH(10, 10, 100, 100),
50 flutter::DlPaint(flutter::DlColor::kBlue()));
51 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
55 flutter::DisplayListBuilder builder;
56 builder.DrawText(flutter::DlTextSkia::Make(
57 SkTextBlob::MakeFromString(
"Hello", CreateTestFont())),
58 100, 100, flutter::DlPaint(flutter::DlColor::kBlue()));
59 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
63 flutter::DisplayListBuilder builder;
65 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
66 flutter::DlColor::kRed()};
67 const float stops[2] = {0.0, 1.0};
69 auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {300.0, 300.0},
70 2, colors.data(), stops,
71 flutter::DlTileMode::kClamp);
72 flutter::DlPaint paint;
73 paint.setColorSource(linear);
75 builder.DrawText(flutter::DlTextSkia::Make(SkTextBlob::MakeFromString(
76 "Hello World", CreateTestFont())),
78 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
82 flutter::DisplayListBuilder builder;
83 builder.DrawText(flutter::DlTextSkia::Make(
84 SkTextBlob::MakeFromString(
"Hello", CreateTestFont())),
85 100, 100, flutter::DlPaint(flutter::DlColor::kRed()));
87 flutter::DlPaint save_paint;
89 save_paint.setAlpha(
static_cast<uint8_t
>(255 * alpha));
90 builder.SaveLayer(std::nullopt, &save_paint);
91 builder.DrawText(flutter::DlTextSkia::Make(SkTextBlob::MakeFromString(
92 "Hello with half alpha", CreateTestFontOfSize(100))),
93 100, 300, flutter::DlPaint(flutter::DlColor::kRed()));
95 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
99 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
100 flutter::DisplayListBuilder builder;
102 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
103 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
107 flutter::DisplayListBuilder builder;
108 flutter::DlPaint paint;
110 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
111 paint.setStrokeWidth(30);
112 paint.setColor(flutter::DlColor::kRed());
114 flutter::DlPathBuilder path_builder;
115 path_builder.MoveTo(
DlPoint(-50, 0));
116 path_builder.LineTo(
DlPoint(0, -50));
117 path_builder.LineTo(
DlPoint(50, 0));
120 builder.Translate(100, 100);
122 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
123 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
124 paint.setStrokeMiter(4);
125 builder.DrawPath(path, paint);
130 builder.Translate(0, 100);
133 paint.setStrokeMiter(1);
134 builder.DrawPath(path, paint);
138 builder.Translate(150, 0);
140 paint.setStrokeCap(flutter::DlStrokeCap::kSquare);
141 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
142 builder.DrawPath(path, paint);
145 builder.Translate(150, 0);
147 paint.setStrokeCap(flutter::DlStrokeCap::kRound);
148 paint.setStrokeJoin(flutter::DlStrokeJoin::kRound);
149 builder.DrawPath(path, paint);
152 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
156 auto callback = [&]() {
157 static float start_angle = 45;
158 static float sweep_angle = 270;
159 static float stroke_width = 10;
162 static int selected_cap = 0;
163 const char* cap_names[] = {
"Butt",
"Round",
"Square"};
164 flutter::DlStrokeCap cap;
166 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
167 ImGui::SliderFloat(
"Start angle", &start_angle, -360, 360);
168 ImGui::SliderFloat(
"Sweep angle", &sweep_angle, -360, 360);
169 ImGui::SliderFloat(
"Stroke width", &stroke_width, 0, 300);
170 ImGui::Combo(
"Cap", &selected_cap, cap_names,
171 sizeof(cap_names) /
sizeof(
char*));
175 switch (selected_cap) {
177 cap = flutter::DlStrokeCap::kButt;
180 cap = flutter::DlStrokeCap::kRound;
183 cap = flutter::DlStrokeCap::kSquare;
186 cap = flutter::DlStrokeCap::kButt;
194 flutter::DisplayListBuilder builder;
195 flutter::DlPaint paint;
197 Vector2 scale = GetContentScale();
198 builder.Scale(scale.
x, scale.
y);
199 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
200 paint.setStrokeCap(cap);
201 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
202 paint.setStrokeMiter(10);
203 auto rect = DlRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
204 paint.setColor(flutter::DlColor::kGreen());
205 paint.setStrokeWidth(2);
206 builder.DrawRect(rect, paint);
207 paint.setColor(flutter::DlColor::kRed());
208 paint.setStrokeWidth(stroke_width);
209 builder.DrawArc(rect, start_angle, sweep_angle,
use_center, paint);
211 return builder.Build();
213 ASSERT_TRUE(OpenPlaygroundHere(callback));
217 auto callback = [&]() {
218 flutter::DisplayListBuilder builder;
219 flutter::DlPaint paint;
221 paint.setColor(flutter::DlColor::kRed());
222 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
224 static float stroke_width = 10.0f;
225 static int selected_stroke_type = 0;
226 static int selected_join_type = 0;
227 const char* stroke_types[] = {
"Butte",
"Round",
"Square"};
228 const char* join_type[] = {
"kMiter",
"Round",
"kBevel"};
230 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
231 ImGui::Combo(
"Cap", &selected_stroke_type, stroke_types,
232 sizeof(stroke_types) /
sizeof(
char*));
233 ImGui::Combo(
"Join", &selected_join_type, join_type,
234 sizeof(join_type) /
sizeof(
char*));
235 ImGui::SliderFloat(
"Stroke Width", &stroke_width, 10.0f, 50.0f);
238 flutter::DlStrokeCap cap;
239 flutter::DlStrokeJoin join;
240 switch (selected_stroke_type) {
242 cap = flutter::DlStrokeCap::kButt;
245 cap = flutter::DlStrokeCap::kRound;
248 cap = flutter::DlStrokeCap::kSquare;
251 cap = flutter::DlStrokeCap::kButt;
254 switch (selected_join_type) {
256 join = flutter::DlStrokeJoin::kMiter;
259 join = flutter::DlStrokeJoin::kRound;
262 join = flutter::DlStrokeJoin::kBevel;
265 join = flutter::DlStrokeJoin::kMiter;
268 paint.setStrokeCap(cap);
269 paint.setStrokeJoin(join);
270 paint.setStrokeWidth(stroke_width);
273 builder.Scale(1.5f, 1.5f);
276 builder.Translate(100, 100);
277 builder.DrawRect(DlRect::MakeWH(100, 100), paint);
280 builder.Translate(150, 0);
281 builder.DrawRoundRect(
282 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 10, 10), paint);
285 builder.Translate(150, 0);
286 builder.DrawDiffRoundRect(
287 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 10, 10),
288 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(10, 10, 80, 30), 10, 10),
293 builder.Translate(150, 0);
294 flutter::DlPathBuilder path_builder;
295 path_builder.MoveTo(
DlPoint(0, 0));
296 path_builder.LineTo(
DlPoint(0, 0));
297 path_builder.LineTo(
DlPoint(100, 0));
298 path_builder.LineTo(
DlPoint(100, 0));
299 path_builder.LineTo(
DlPoint(100, 100));
300 builder.DrawPath(path_builder.TakePath(), paint);
306 builder.Translate(200, 0);
310 flutter::DlPathBuilder line_path_builder;
311 line_path_builder.MoveTo(
DlPoint(0, 0));
312 line_path_builder.MoveTo(
DlPoint(0, 0));
313 line_path_builder.LineTo(
DlPoint(0, 0));
314 line_path_builder.LineTo(
DlPoint(0, 0));
315 line_path_builder.LineTo(
DlPoint(50, 50));
316 line_path_builder.LineTo(
DlPoint(50, 50));
317 line_path_builder.LineTo(
DlPoint(100, 0));
318 line_path_builder.LineTo(
DlPoint(100, 0));
319 DlPath line_path = line_path_builder.TakePath();
320 builder.DrawPath(line_path, paint);
322 builder.Translate(0, 100);
323 builder.DrawPath(line_path, paint);
325 builder.Translate(0, 100);
326 flutter::DlPathBuilder line_path_builder2;
327 line_path_builder2.MoveTo(
DlPoint(0, 0));
328 line_path_builder2.LineTo(
DlPoint(0, 0));
329 line_path_builder2.LineTo(
DlPoint(0, 0));
330 builder.DrawPath(line_path_builder2.TakePath(), paint);
336 builder.Translate(150, 0);
340 flutter::DlPathBuilder cubic_path;
341 cubic_path.MoveTo(
DlPoint(0, 0));
342 cubic_path.CubicCurveTo(
DlPoint(0, 0),
345 builder.DrawPath(cubic_path.TakePath(), paint);
347 builder.Translate(0, 100);
348 flutter::DlPathBuilder cubic_path2;
349 cubic_path2.MoveTo(
DlPoint(0, 0));
350 cubic_path2.CubicCurveTo(
DlPoint(0, 0),
353 builder.DrawPath(cubic_path2.TakePath(), paint);
355 builder.Translate(0, 100);
356 flutter::DlPathBuilder cubic_path3;
357 cubic_path3.MoveTo(
DlPoint(0, 0));
358 cubic_path3.CubicCurveTo(
DlPoint(0, 0),
361 builder.DrawPath(cubic_path3.TakePath(), paint);
367 builder.Translate(200, 0);
371 flutter::DlPathBuilder quad_path;
372 quad_path.MoveTo(
DlPoint(0, 0));
373 quad_path.MoveTo(
DlPoint(0, 0));
375 builder.DrawPath(quad_path.TakePath(), paint);
377 builder.Translate(0, 150);
378 flutter::DlPathBuilder quad_path2;
379 quad_path2.MoveTo(
DlPoint(0, 0));
380 quad_path2.MoveTo(
DlPoint(0, 0));
382 builder.DrawPath(quad_path2.TakePath(), paint);
384 builder.Translate(0, 100);
385 flutter::DlPathBuilder quad_path3;
386 quad_path3.MoveTo(
DlPoint(0, 0));
388 builder.DrawPath(quad_path3.TakePath(), paint);
392 return builder.Build();
394 ASSERT_TRUE(OpenPlaygroundHere(callback));
398 flutter::DisplayListBuilder builder;
399 flutter::DlPaint paint;
401 paint.setColor(flutter::DlColor::kRed());
402 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
404 builder.Translate(300, 300);
405 flutter::DlPathBuilder path_builder;
406 path_builder.AddCircle(
DlPoint(0, 0), 100);
407 path_builder.AddCircle(
DlPoint(0, 0), 50);
408 path_builder.SetFillType(flutter::DlPathFillType::kOdd);
409 builder.DrawPath(path_builder.TakePath(), paint);
411 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
418 flutter::DisplayListBuilder builder;
419 flutter::DlPaint paint;
421 paint.setColor(flutter::DlColor::kRed());
422 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
423 paint.setStrokeWidth(10);
425 builder.Translate(300, 300);
431 flutter::DlPathBuilder path_builder;
432 path_builder.MoveTo(
DlPoint(50, 50));
433 path_builder.LineTo(
DlPoint(50, 100));
434 path_builder.LineTo(
DlPoint(100, 100));
435 path_builder.LineTo(
DlPoint(100, 50));
436 builder.DrawPath(path_builder.TakePath(), paint);
438 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
442 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
443 flutter::DisplayListBuilder builder;
444 flutter::DlPaint paint;
449 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
450 paint.setMaskFilter(&filter);
452 flutter::DlImageSampling::kNearestNeighbor, &paint);
457 paint.setColor(flutter::DlColor::kYellow());
459 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kOuter, 10.0f);
460 paint.setMaskFilter(&filter);
461 builder.DrawArc(DlRect::MakeXYWH(410, 110, 100, 100), 45, 270,
true, paint);
467 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kSolid, 10.0f);
468 paint.setMaskFilter(&filter);
469 builder.DrawText(flutter::DlTextSkia::Make(SkTextBlob::MakeFromString(
470 "Testing", CreateTestFont())),
474 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
478 flutter::DisplayListBuilder builder;
479 flutter::DlPaint paint;
481 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
482 paint.setColor(flutter::DlColor::kRed());
483 builder.DrawText(flutter::DlTextSkia::Make(SkTextBlob::MakeFromString(
484 "stoked about stroked text", CreateTestFont())),
487 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
492 flutter::DisplayListBuilder builder;
493 flutter::DlPaint paint;
494 auto const& text_blob = SkTextBlob::MakeFromString(
"00000", CreateTestFont());
495 auto text = flutter::DlTextSkia::Make(text_blob);
498 auto const& mat_blue = flutter::DlColor(0xFF2196f3);
501 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
502 paint.setColor(mat_blue);
503 builder.DrawRect(DlRect::MakeXYWH(0, 0, 500, 500), paint);
506 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
507 paint.setColor(flutter::DlColor::kWhite());
508 builder.DrawText(text, 250, 250, paint);
510 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
511 paint.setColor(flutter::DlColor::kBlack());
512 builder.DrawText(text, 250, 250, paint);
514 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
518 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
519 flutter::DisplayListBuilder builder;
520 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
521 flutter::DlPaint paint;
522 paint.setMaskFilter(&filter);
523 builder.SaveLayer(std::nullopt, &paint);
525 flutter::DlImageSampling::kNearestNeighbor);
527 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
531 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
532 flutter::DisplayListBuilder builder;
533 flutter::DlPaint paint;
537 auto filter = flutter::DlColorFilter::MakeBlend(
538 flutter::DlColor::kYellow(), flutter::DlBlendMode::kModulate);
539 paint.setColorFilter(filter);
541 flutter::DlImageSampling::kNearestNeighbor, &paint);
546 auto filter = flutter::DlColorFilter::MakeBlend(
547 flutter::DlColor::kRed(), flutter::DlBlendMode::kScreen);
548 paint.setColorFilter(filter);
550 flutter::DlImageSampling::kNearestNeighbor, &paint);
553 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
557 const float invert_color_matrix[20] = {
563 auto texture = CreateTextureForFixture(
"boston.jpg");
564 flutter::DisplayListBuilder builder;
565 flutter::DlPaint paint;
567 auto color_filter = flutter::DlColorFilter::MakeMatrix(invert_color_matrix);
568 auto image_filter = flutter::DlImageFilter::MakeColorFilter(color_filter);
570 paint.setImageFilter(image_filter);
572 flutter::DlImageSampling::kNearestNeighbor, &paint);
574 builder.Translate(0, 700);
575 paint.setColorFilter(color_filter);
577 flutter::DlImageSampling::kNearestNeighbor, &paint);
578 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
582 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
584 auto callback = [&]() {
585 static float sigma[] = {10, 10};
587 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
588 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
591 flutter::DisplayListBuilder builder;
592 flutter::DlPaint paint;
594 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
595 flutter::DlTileMode::kClamp);
596 paint.setImageFilter(&filter);
598 flutter::DlImageSampling::kNearestNeighbor, &paint);
600 return builder.Build();
603 ASSERT_TRUE(OpenPlaygroundHere(callback));
607 auto texture = CreateTextureForFixture(
"boston.jpg");
608 flutter::DisplayListBuilder builder;
609 flutter::DlPaint paint;
611 auto dilate = std::make_shared<flutter::DlDilateImageFilter>(10.0, 10.0);
612 auto erode = std::make_shared<flutter::DlErodeImageFilter>(10.0, 10.0);
613 auto open = std::make_shared<flutter::DlComposeImageFilter>(dilate, erode);
614 auto close = std::make_shared<flutter::DlComposeImageFilter>(erode, dilate);
616 paint.setImageFilter(open.get());
618 flutter::DlImageSampling::kNearestNeighbor, &paint);
619 builder.Translate(0, 700);
620 paint.setImageFilter(close.get());
622 flutter::DlImageSampling::kNearestNeighbor, &paint);
623 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
627 auto texture = CreateTextureForFixture(
"boston.jpg");
628 const float inner_color_matrix[20] = {
634 const float outer_color_matrix[20] = {
640 auto inner_color_filter =
641 flutter::DlColorFilter::MakeMatrix(inner_color_matrix);
642 auto outer_color_filter =
643 flutter::DlColorFilter::MakeMatrix(outer_color_matrix);
644 auto inner = flutter::DlImageFilter::MakeColorFilter(inner_color_filter);
645 auto outer = flutter::DlImageFilter::MakeColorFilter(outer_color_filter);
646 auto compose = std::make_shared<flutter::DlComposeImageFilter>(outer, inner);
648 flutter::DisplayListBuilder builder;
649 flutter::DlPaint paint;
650 paint.setImageFilter(compose.get());
652 flutter::DlImageSampling::kNearestNeighbor, &paint);
653 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
657 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
659 auto callback = [&]() {
660 static float sigma[] = {10, 10};
661 static float ctm_scale = 1;
662 static bool use_bounds =
true;
663 static bool draw_circle =
true;
664 static bool add_clip =
true;
666 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
667 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
668 ImGui::SliderFloat(
"Scale", &ctm_scale, 0, 10);
671 "If everything is working correctly, none of the options below should "
672 "impact the filter's appearance.");
673 ImGui::Checkbox(
"Use SaveLayer bounds", &use_bounds);
674 ImGui::Checkbox(
"Draw child element", &draw_circle);
675 ImGui::Checkbox(
"Add pre-clip", &add_clip);
678 flutter::DisplayListBuilder builder;
680 Vector2 scale = ctm_scale * GetContentScale();
681 builder.Scale(scale.
x, scale.
y);
683 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
684 flutter::DlTileMode::kClamp);
686 std::optional<DlRect> bounds;
691 bounds = DlRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
697 builder.ClipRect(DlRect::MakeLTRB(0, 0, 99999, 99999),
698 flutter::DlClipOp::kIntersect,
true);
702 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
703 builder.SaveLayer(bounds,
nullptr, &filter);
709 flutter::DlPaint paint;
710 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
711 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
712 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
713 paint.setStrokeWidth(10);
714 paint.setColor(flutter::DlColor::kRed().withAlpha(100));
715 builder.DrawCircle(
DlPoint(circle_center.x, circle_center.y), 100, paint);
718 return builder.Build();
721 ASSERT_TRUE(OpenPlaygroundHere(callback));
726 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
727 flutter::DisplayListBuilder builder;
728 auto size = texture->GetSize();
729 builder.DrawImageNine(
731 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
732 size.height * 3 / 4),
733 DlRect::MakeLTRB(0, 0, size.width * 2, size.height * 2),
734 flutter::DlFilterMode::kNearest,
nullptr);
735 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
742 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
743 flutter::DisplayListBuilder builder;
744 auto size = texture->GetSize();
745 builder.DrawImageNine(
747 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
748 size.height * 3 / 4),
749 DlRect::MakeLTRB(0, 0, size.width / 2, size.height),
750 flutter::DlFilterMode::kNearest,
nullptr);
751 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
758 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
759 flutter::DisplayListBuilder builder;
760 auto size = texture->GetSize();
761 builder.DrawImageNine(
763 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
764 size.height * 3 / 4),
765 DlRect::MakeLTRB(0, 0, size.width, size.height / 2),
766 flutter::DlFilterMode::kNearest,
nullptr);
767 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
773 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
774 flutter::DisplayListBuilder builder;
775 auto size = texture->GetSize();
776 builder.DrawImageNine(
778 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
779 size.height * 3 / 4),
780 DlRect::MakeLTRB(0, 0, size.width / 2, size.height / 2),
781 flutter::DlFilterMode::kNearest,
nullptr);
782 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
788 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
789 flutter::DisplayListBuilder builder;
790 auto size = texture->GetSize();
791 builder.DrawImageNine(
793 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
794 size.height * 3 / 4),
795 DlRect::MakeLTRB(0, 0, size.width / 4, size.height / 4),
796 flutter::DlFilterMode::kNearest,
nullptr);
797 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
803 auto texture = CreateTextureForFixture(
"nine_patch_corners.png");
804 flutter::DisplayListBuilder builder;
806 DlIRect::MakeXYWH(10, 10, 1, 1),
807 DlRect::MakeXYWH(0, 0, 200, 100),
808 flutter::DlFilterMode::kNearest,
nullptr);
809 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
813 auto texture = CreateTextureForFixture(
"nine_patch2.png");
815 auto filter = flutter::DlColorFilter::MakeBlend(flutter::DlColor::kGreen(),
816 flutter::DlBlendMode::kSrcIn);
817 flutter::DlPaint paint;
818 paint.setColorFilter(filter);
820 flutter::DisplayListBuilder builder;
822 DlIRect::MakeXYWH(10, 10, 1, 1),
823 DlRect::MakeXYWH(0, 0, 200, 100),
824 flutter::DlFilterMode::kNearest, &paint);
825 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
829 flutter::DisplayListBuilder builder;
839 std::vector<flutter::DlStrokeCap> caps = {
840 flutter::DlStrokeCap::kButt,
841 flutter::DlStrokeCap::kRound,
842 flutter::DlStrokeCap::kSquare,
844 flutter::DlPaint paint =
846 .setColor(flutter::DlColor::kYellow().withAlpha(127))
848 builder.Translate(50, 50);
849 for (
auto cap : caps) {
850 paint.setStrokeCap(cap);
852 builder.DrawPoints(flutter::DlPointMode::kPoints, 7,
points, paint);
853 builder.Translate(150, 0);
854 builder.DrawPoints(flutter::DlPointMode::kLines, 5,
points, paint);
855 builder.Translate(150, 0);
856 builder.DrawPoints(flutter::DlPointMode::kPolygon, 5,
points, paint);
858 builder.Translate(0, 150);
860 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
864 flutter::DisplayListBuilder builder;
865 std::vector<flutter::DlStrokeCap> caps = {
866 flutter::DlStrokeCap::kButt,
867 flutter::DlStrokeCap::kRound,
868 flutter::DlStrokeCap::kSquare,
870 flutter::DlPaint paint =
872 .setColor(flutter::DlColor::kYellow().withAlpha(127))
873 .setDrawStyle(flutter::DlDrawStyle::kStroke)
874 .setStrokeCap(flutter::DlStrokeCap::kButt)
876 DlPath path = DlPath::MakeLine({150, 50}, {150, 50});
877 for (
auto cap : caps) {
878 paint.setStrokeCap(cap);
880 builder.DrawPath(path, paint);
881 builder.Translate(0, 150);
883 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
887 flutter::DisplayListBuilder builder;
888 flutter::DlPaint paint;
890 auto content_scale = GetContentScale() * 0.8;
891 builder.Scale(content_scale.x, content_scale.y);
893 constexpr
size_t star_spikes = 5;
894 constexpr
DlScalar half_spike_rotation =
kPi / star_spikes;
897 constexpr
DlScalar outer_radius = radius + spike_size;
898 constexpr
DlScalar inner_radius = radius - spike_size;
899 std::array<DlPoint, star_spikes * 2> star;
900 for (
size_t i = 0; i < star_spikes; i++) {
901 const DlScalar rotation = half_spike_rotation * i * 2;
902 star[i * 2] =
DlPoint(50 + std::sin(rotation) * outer_radius,
903 50 - std::cos(rotation) * outer_radius);
905 DlPoint(50 + std::sin(rotation + half_spike_rotation) * inner_radius,
906 50 - std::cos(rotation + half_spike_rotation) * inner_radius);
909 std::array<DlPath, 4> paths = {
910 DlPath::MakeRect(DlRect::MakeXYWH(0, 0, 200, 100)),
911 DlPath::MakeRoundRectXY(DlRect::MakeXYWH(20, 0, 200, 100), 30, 30),
912 DlPath::MakeCircle(
DlPoint(100, 50), 50),
913 DlPath::MakePoly(star.data(), star.size(),
true),
915 paint.setColor(flutter::DlColor::kWhite());
916 builder.DrawPaint(paint);
917 paint.setColor(flutter::DlColor::kCyan());
918 builder.Translate(100, 50);
919 for (
size_t x = 0;
x < paths.size();
x++) {
921 for (
size_t y = 0; y < 6; y++) {
922 builder.DrawShadow(paths[
x], flutter::DlColor::kBlack(), 3 + y * 8,
false,
924 builder.DrawPath(paths[
x], paint);
925 builder.Translate(0, 150);
928 builder.Translate(250, 0);
931 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
935 flutter::DisplayListBuilder builder;
936 std::vector<flutter::DlStrokeCap> caps = {
937 flutter::DlStrokeCap::kButt,
938 flutter::DlStrokeCap::kRound,
939 flutter::DlStrokeCap::kSquare,
941 flutter::DlPaint paint =
943 .setColor(flutter::DlColor::kWhite())
944 .setDrawStyle(flutter::DlDrawStyle::kStroke)
946 flutter::DlPaint outline_paint =
948 .setColor(flutter::DlColor::kYellow())
949 .setDrawStyle(flutter::DlDrawStyle::kStroke)
950 .setStrokeCap(flutter::DlStrokeCap::kSquare)
952 DlPath path = DlPath::MakeLine({150, 50}, {160, 50});
953 for (
auto cap : caps) {
954 paint.setStrokeCap(cap);
956 builder.DrawRect(DlRect::MakeLTRB(45, 45, 65, 55), outline_paint);
958 if (cap != flutter::DlStrokeCap::kButt) {
959 builder.DrawRect(DlRect::MakeLTRB(95, 45, 105, 55), outline_paint);
961 builder.DrawPath(path, paint);
962 builder.DrawRect(path.GetBounds().Expand(5, 5), outline_paint);
963 builder.Translate(0, 150);
965 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
969 auto boston = CreateTextureForFixture(
"boston.jpg");
971 auto callback = [&]() {
972 static int selected_matrix_type = 0;
973 const char* matrix_type_names[] = {
"Matrix",
"Local Matrix"};
975 static float ctm_translation[2] = {200, 200};
976 static float ctm_scale[2] = {0.65, 0.65};
977 static float ctm_skew[2] = {0, 0};
979 static bool enable =
true;
980 static float translation[2] = {100, 100};
981 static float scale[2] = {0.8, 0.8};
982 static float skew[2] = {0.2, 0.2};
984 static bool enable_savelayer =
true;
986 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
988 ImGui::Combo(
"Filter type", &selected_matrix_type, matrix_type_names,
989 sizeof(matrix_type_names) /
sizeof(
char*));
991 ImGui::TextWrapped(
"Current Transform");
992 ImGui::SliderFloat2(
"CTM Translation", ctm_translation, 0, 1000);
993 ImGui::SliderFloat2(
"CTM Scale", ctm_scale, 0, 3);
994 ImGui::SliderFloat2(
"CTM Skew", ctm_skew, -3, 3);
997 "MatrixFilter and LocalMatrixFilter modify the CTM in the same way. "
998 "The only difference is that MatrixFilter doesn't affect the effect "
999 "transform, whereas LocalMatrixFilter does.");
1002 ImGui::Checkbox(
"Enable", &enable);
1003 ImGui::SliderFloat2(
"Filter Translation", translation, 0, 1000);
1004 ImGui::SliderFloat2(
"Filter Scale", scale, 0, 3);
1005 ImGui::SliderFloat2(
"Filter Skew", skew, -3, 3);
1008 "Rendering the filtered image within a layer can expose bounds "
1009 "issues. If the rendered image gets cut off when this setting is "
1010 "enabled, there's a coverage bug in the filter.");
1011 ImGui::Checkbox(
"Render in layer", &enable_savelayer);
1015 flutter::DisplayListBuilder builder;
1016 flutter::DlPaint paint;
1018 if (enable_savelayer) {
1019 builder.SaveLayer(std::nullopt,
nullptr);
1022 auto content_scale = GetContentScale();
1023 builder.Scale(content_scale.x, content_scale.y);
1027 ctm_scale[0], ctm_skew[0], 0.0f, ctm_translation[0],
1028 ctm_skew[1], ctm_scale[1], 0.0f, ctm_translation[1],
1031 builder.Transform(ctm_matrix);
1034 auto filter_matrix =
1036 skew[1], scale[1], 0.0f, translation[1],
1037 0.0f, 0.0f, 1.0f, 0.0f,
1038 0.0f, 0.0f, 0.0f, 1.0f);
1041 switch (selected_matrix_type) {
1043 auto filter = flutter::DlMatrixImageFilter(
1044 filter_matrix, flutter::DlImageSampling::kLinear);
1045 paint.setImageFilter(&filter);
1049 auto internal_filter =
1050 flutter::DlBlurImageFilter(10, 10, flutter::DlTileMode::kDecal)
1052 auto filter = flutter::DlLocalMatrixImageFilter(filter_matrix,
1054 paint.setImageFilter(&filter);
1061 flutter::DlImageSampling::kLinear, &paint);
1063 if (enable_savelayer) {
1067 return builder.Build();
1070 ASSERT_TRUE(OpenPlaygroundHere(callback));
1074 auto callback = [&]() {
1075 static float translation[2] = {0, 0};
1076 static bool enable_save_layer =
true;
1078 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1079 ImGui::SliderFloat2(
"Translation", translation, -130, 130);
1080 ImGui::Checkbox(
"Enable save layer", &enable_save_layer);
1083 flutter::DisplayListBuilder builder;
1085 builder.Scale(2.0, 2.0);
1086 flutter::DlPaint paint;
1087 paint.setColor(flutter::DlColor::kYellow());
1088 builder.DrawRect(DlRect::MakeWH(300, 300), paint);
1089 paint.setStrokeWidth(1.0);
1090 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1091 paint.setColor(flutter::DlColor::kBlack().withAlpha(0x80));
1095 flutter::DlPaint save_paint;
1096 DlRect bounds = DlRect::MakeXYWH(100, 100, 100, 100);
1097 Matrix translate_matrix =
1099 if (enable_save_layer) {
1100 auto filter = flutter::DlMatrixImageFilter(
1101 translate_matrix, flutter::DlImageSampling::kNearestNeighbor);
1102 save_paint.setImageFilter(filter.shared());
1103 builder.SaveLayer(bounds, &save_paint);
1106 builder.Transform(translate_matrix);
1111 filter_matrix.
Scale({0.2f, 0.2f});
1113 auto filter = flutter::DlMatrixImageFilter(
1114 filter_matrix, flutter::DlImageSampling::kNearestNeighbor);
1116 save_paint.setImageFilter(filter.shared());
1118 builder.SaveLayer(bounds, &save_paint);
1119 flutter::DlPaint paint2;
1120 paint2.setColor(flutter::DlColor::kBlue());
1121 builder.DrawRect(bounds, paint2);
1124 return builder.Build();
1127 ASSERT_TRUE(OpenPlaygroundHere(callback));
1131 flutter::DlPaint paint;
1132 paint.setColor(flutter::DlColor(0xFF2196F3).withAlpha(128));
1133 flutter::DisplayListBuilder builder;
1134 paint.setColorFilter(flutter::DlColorFilter::MakeLinearToSrgbGamma());
1135 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
1136 builder.Translate(0, 200);
1138 paint.setColorFilter(flutter::DlColorFilter::MakeSrgbToLinearGamma());
1139 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
1141 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1145 const flutter::DlColor colors[2] = {
1146 flutter::DlColor(0xFFF44336),
1147 flutter::DlColor(0xFF2196F3),
1149 const float stops[2] = {0.0, 1.0};
1150 flutter::DlPaint paint;
1151 flutter::DisplayListBuilder builder;
1152 auto clip_bounds = DlRect::MakeWH(300.0, 300.0);
1154 builder.Translate(100, 100);
1155 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1157 flutter::DlColorSource::MakeLinear({0.0, 0.0}, {100.0, 100.0}, 2, colors,
1158 stops, flutter::DlTileMode::kRepeat);
1159 paint.setColorSource(linear);
1160 builder.DrawPaint(paint);
1164 builder.Translate(500, 100);
1165 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1166 auto radial = flutter::DlColorSource::MakeRadial(
1167 {100.0, 100.0}, 100.0, 2, colors, stops, flutter::DlTileMode::kRepeat);
1168 paint.setColorSource(radial);
1169 builder.DrawPaint(paint);
1173 builder.Translate(100, 500);
1174 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1176 flutter::DlColorSource::MakeSweep({100.0, 100.0}, 180.0, 270.0, 2, colors,
1177 stops, flutter::DlTileMode::kRepeat);
1178 paint.setColorSource(sweep);
1179 builder.DrawPaint(paint);
1183 builder.Translate(500, 500);
1184 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1185 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
1187 flutter::DlTileMode::kRepeat,
1188 flutter::DlTileMode::kRepeat);
1189 paint.setColorSource(image);
1190 builder.DrawPaint(paint);
1193 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1197 flutter::DisplayListBuilder builder;
1200 builder.SaveLayer(std::nullopt,
nullptr);
1201 builder.Translate(100, 100);
1202 flutter::DlPaint paint;
1203 paint.setColor(flutter::DlColor::kRed());
1204 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1205 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1206 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
1207 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1211 builder.SaveLayer(std::nullopt,
nullptr);
1212 builder.Translate(300, 100);
1213 flutter::DlPaint paint;
1214 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1215 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1216 paint.setColor(flutter::DlColor::kRed());
1217 paint.setBlendMode(flutter::DlBlendMode::kDstOver);
1218 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1222 builder.SaveLayer(std::nullopt,
nullptr);
1223 builder.Translate(100, 300);
1224 flutter::DlPaint paint;
1225 paint.setColor(flutter::DlColor::kRed());
1226 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1227 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1228 paint.setBlendMode(flutter::DlBlendMode::kSrc);
1229 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1233 builder.SaveLayer(std::nullopt,
nullptr);
1234 builder.Translate(300, 300);
1235 flutter::DlPaint paint;
1236 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1237 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1238 paint.setColor(flutter::DlColor::kRed());
1239 paint.setBlendMode(flutter::DlBlendMode::kDst);
1240 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1244 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1248 flutter::DisplayListBuilder builder;
1249 const float green_color_matrix[20] = {
1255 const float blue_color_matrix[20] = {
1261 auto green_color_filter =
1262 flutter::DlColorFilter::MakeMatrix(green_color_matrix);
1263 auto blue_color_filter =
1264 flutter::DlColorFilter::MakeMatrix(blue_color_matrix);
1265 auto blue_image_filter =
1266 flutter::DlImageFilter::MakeColorFilter(blue_color_filter);
1268 flutter::DlPaint paint;
1269 paint.setColor(flutter::DlColor::kRed());
1270 paint.setColorFilter(green_color_filter);
1271 paint.setImageFilter(blue_image_filter);
1272 builder.DrawRect(DlRect::MakeLTRB(100, 100, 500, 500), paint);
1273 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1277 auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
1278 flutter::DlBlurStyle::kNormal, 10);
1280 flutter::DisplayListBuilder builder;
1282 std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
1283 flutter::DlColor::kGreen()};
1284 std::array<float, 2> stops = {0, 1};
1285 auto texture = CreateTextureForFixture(
"airplane.jpg");
1286 auto matrix = flutter::DlMatrix::MakeTranslation({-300, -110});
1287 std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
1288 flutter::DlColorSource::MakeImage(
1290 flutter::DlTileMode::kRepeat, flutter::DlImageSampling::kLinear,
1292 flutter::DlColorSource::MakeLinear(
1294 stops.data(), flutter::DlTileMode::kClamp),
1298 builder.Translate(0, 100);
1299 for (
const auto& color_source : color_sources) {
1300 flutter::DlPaint paint;
1301 paint.setColorSource(color_source);
1302 paint.setMaskFilter(blur_filter);
1305 builder.Translate(100, 0);
1306 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1307 builder.DrawRoundRect(
1308 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 30, 30), paint);
1310 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1311 paint.setStrokeWidth(10);
1312 builder.Translate(200, 0);
1313 builder.DrawRoundRect(
1314 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 30, 30), paint);
1317 builder.Translate(0, 100);
1321 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1325 flutter::DisplayListBuilder builder;
1326 std::vector<flutter::DlStrokeJoin> joins = {
1327 flutter::DlStrokeJoin::kBevel,
1328 flutter::DlStrokeJoin::kRound,
1329 flutter::DlStrokeJoin::kMiter,
1331 flutter::DlPaint paint =
1333 .setColor(flutter::DlColor::kWhite())
1334 .setDrawStyle(flutter::DlDrawStyle::kFill)
1335 .setStrokeWidth(10);
1336 flutter::DlPaint stroke_paint =
1338 .setColor(flutter::DlColor::kWhite())
1339 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1340 .setStrokeWidth(10);
1341 DlPath path = DlPath::MakeLine({150, 50}, {160, 50});
1343 builder.Translate(300, 50);
1344 builder.Scale(0.8, 0.8);
1345 for (
auto join : joins) {
1346 paint.setStrokeJoin(join);
1347 stroke_paint.setStrokeJoin(join);
1348 builder.DrawRect(DlRect::MakeXYWH(0, 0, 100, 100), paint);
1349 builder.DrawRect(DlRect::MakeXYWH(0, 150, 100, 100), stroke_paint);
1350 builder.DrawRoundRect(
1351 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(150, 0, 100, 100), 30, 30),
1353 builder.DrawRoundRect(
1354 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(150, 150, 100, 100), 30, 30),
1356 builder.DrawCircle(
DlPoint(350, 50), 50, paint);
1357 builder.DrawCircle(
DlPoint(350, 200), 50, stroke_paint);
1358 builder.Translate(0, 300);
1360 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1364 auto callback = [&]() {
1365 static float filled_radius = 100.0;
1366 static float filled_alpha = 255.0;
1367 static float filled_scale[2] = {1.0, 1.0};
1368 static float stroked_radius = 20.0;
1369 static float stroke_width = 10.0;
1370 static float stroked_alpha = 255.0;
1371 static float stroked_scale[2] = {1.0, 1.0};
1373 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1375 ImGui::SliderFloat(
"Filled Radius", &filled_radius, 0, 500);
1376 ImGui::SliderFloat(
"Filled Alpha", &filled_alpha, 0, 255);
1377 ImGui::SliderFloat2(
"Filled Scale", filled_scale, 0, 10.0);
1378 ImGui::SliderFloat(
"Stroked Radius", &stroked_radius, 0, 10.0);
1379 ImGui::SliderFloat(
"Stroked Width", &stroke_width, 0, 500);
1380 ImGui::SliderFloat(
"Stroked Alpha", &stroked_alpha, 0, 10.0);
1381 ImGui::SliderFloat2(
"Stroked Scale", stroked_scale, 0, 10.0);
1385 flutter::DisplayListBuilder builder;
1386 flutter::DlPaint paint;
1388 paint.setColor(flutter::DlColor::kBlue().withAlpha(filled_alpha));
1389 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1391 builder.Scale(filled_scale[0], filled_scale[1]);
1392 builder.DrawCircle(
DlPoint(500, 750), filled_radius, paint);
1395 paint.setColor(flutter::DlColor::kRed().withAlpha(stroked_alpha));
1396 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1397 paint.setStrokeWidth(stroke_width);
1399 builder.Scale(stroked_scale[0], stroked_scale[1]);
1400 builder.DrawCircle(
DlPoint(1250, 750), stroked_radius, paint);
1402 return builder.Build();
1405 ASSERT_TRUE(OpenPlaygroundHere(callback));
1409 flutter::DisplayListBuilder builder;
1411 flutter::DlPaint fill_paint =
1413 .setColor(flutter::DlColor::kBlue())
1414 .setDrawStyle(flutter::DlDrawStyle::kFill)
1415 .setStrokeWidth(10);
1416 flutter::DlPaint stroke_paint =
1418 .setColor(flutter::DlColor::kGreen())
1419 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1420 .setStrokeWidth(10);
1422 builder.DrawRoundRect(
1423 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1425 builder.DrawRoundRect(
1426 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1429 builder.DrawRoundRect(
1430 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1432 builder.DrawRoundRect(
1433 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1436 flutter::DlPaint reference_paint =
1438 .setColor(flutter::DlColor::kMidGrey())
1439 .setDrawStyle(flutter::DlDrawStyle::kFill)
1440 .setStrokeWidth(10);
1442 builder.DrawRoundRect(
1443 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 500, 300, 300), 40, 40),
1445 builder.DrawRoundRect(
1446 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 100, 300, 300), 120, 120),
1449 flutter::DlPaint clip_fill_paint =
1451 .setColor(flutter::DlColor::kCyan())
1452 .setDrawStyle(flutter::DlDrawStyle::kFill)
1453 .setStrokeWidth(10);
1456 builder.ClipRoundRect(
1457 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(900, 100, 300, 300), 120, 40));
1458 builder.DrawPaint(clip_fill_paint);
1462 builder.ClipRoundRect(
1463 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 900, 300, 300), 40, 120));
1464 builder.DrawPaint(clip_fill_paint);
1467 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1471 std::vector<const char*> blend_mode_names;
1472 std::vector<flutter::DlBlendMode> blend_mode_values;
1474 const std::vector<std::tuple<const char*, flutter::DlBlendMode>> blends = {
1476 {
"Clear", flutter::DlBlendMode::kClear},
1477 {
"Source", flutter::DlBlendMode::kSrc},
1478 {
"Destination", flutter::DlBlendMode::kDst},
1479 {
"SourceOver", flutter::DlBlendMode::kSrcOver},
1480 {
"DestinationOver", flutter::DlBlendMode::kDstOver},
1481 {
"SourceIn", flutter::DlBlendMode::kSrcIn},
1482 {
"DestinationIn", flutter::DlBlendMode::kDstIn},
1483 {
"SourceOut", flutter::DlBlendMode::kSrcOut},
1484 {
"DestinationOut", flutter::DlBlendMode::kDstOut},
1485 {
"SourceATop", flutter::DlBlendMode::kSrcATop},
1486 {
"DestinationATop", flutter::DlBlendMode::kDstATop},
1487 {
"Xor", flutter::DlBlendMode::kXor},
1488 {
"Plus", flutter::DlBlendMode::kPlus},
1489 {
"Modulate", flutter::DlBlendMode::kModulate},
1491 {
"Screen", flutter::DlBlendMode::kScreen},
1492 {
"Overlay", flutter::DlBlendMode::kOverlay},
1493 {
"Darken", flutter::DlBlendMode::kDarken},
1494 {
"Lighten", flutter::DlBlendMode::kLighten},
1495 {
"ColorDodge", flutter::DlBlendMode::kColorDodge},
1496 {
"ColorBurn", flutter::DlBlendMode::kColorBurn},
1497 {
"HardLight", flutter::DlBlendMode::kHardLight},
1498 {
"SoftLight", flutter::DlBlendMode::kSoftLight},
1499 {
"Difference", flutter::DlBlendMode::kDifference},
1500 {
"Exclusion", flutter::DlBlendMode::kExclusion},
1501 {
"Multiply", flutter::DlBlendMode::kMultiply},
1502 {
"Hue", flutter::DlBlendMode::kHue},
1503 {
"Saturation", flutter::DlBlendMode::kSaturation},
1504 {
"Color", flutter::DlBlendMode::kColor},
1505 {
"Luminosity", flutter::DlBlendMode::kLuminosity},
1507 assert(blends.size() ==
1508 static_cast<size_t>(flutter::DlBlendMode::kLastMode) + 1);
1509 for (
const auto& [name, mode] : blends) {
1510 blend_mode_names.push_back(name);
1511 blend_mode_values.push_back(mode);
1515 auto callback = [&]() {
1516 static int current_blend_index = 3;
1517 static float dst_alpha = 1;
1518 static float src_alpha = 1;
1519 static float color0[4] = {1.0f, 0.0f, 0.0f, 1.0f};
1520 static float color1[4] = {0.0f, 1.0f, 0.0f, 1.0f};
1521 static float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
1522 static float src_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1524 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1526 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
1527 blend_mode_names.data(), blend_mode_names.size());
1528 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
1529 ImGui::ColorEdit4(
"Color A", color0);
1530 ImGui::ColorEdit4(
"Color B", color1);
1531 ImGui::ColorEdit4(
"Color C", color2);
1532 ImGui::ColorEdit4(
"Source Color", src_color);
1533 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
1537 std::vector<DlPoint> positions = {
DlPoint(100, 300),
1540 std::vector<flutter::DlColor> colors = {
1541 toColor(color0).modulateOpacity(dst_alpha),
1542 toColor(color1).modulateOpacity(dst_alpha),
1543 toColor(color2).modulateOpacity(dst_alpha)};
1545 auto vertices = flutter::DlVertices::Make(
1546 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1547 nullptr, colors.data());
1549 flutter::DisplayListBuilder builder;
1550 flutter::DlPaint paint;
1552 paint.setColor(
toColor(src_color).modulateOpacity(src_alpha));
1553 builder.DrawVertices(vertices, blend_mode_values[current_blend_index],
1555 return builder.Build();
1558 ASSERT_TRUE(OpenPlaygroundHere(callback));
1562 flutter::DisplayListBuilder builder;
1563 builder.DrawPaint(flutter::DlPaint().setColor(flutter::DlColor::kWhite()));
1565 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
1566 builder.DrawCircle(
DlPoint(300, 300), 200,
1567 flutter::DlPaint().setMaskFilter(&filter));
1569 std::vector<flutter::DlColor> colors = {flutter::DlColor::kGreen(),
1570 flutter::DlColor::kGreen()};
1571 const float stops[2] = {0.0, 1.0};
1572 auto linear = flutter::DlColorSource::MakeLinear(
1573 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
1574 flutter::DlTileMode::kRepeat);
1575 flutter::DlPaint blend_paint =
1577 .setColorSource(linear)
1578 .setBlendMode(flutter::DlBlendMode::kScreen);
1579 builder.DrawPaint(blend_paint);
1581 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1585 flutter::DisplayListBuilder builder;
1586 builder.DrawColor(flutter::DlColor::kWhite(), flutter::DlBlendMode::kSrc);
1587 Vector2 scale = GetContentScale();
1588 builder.Scale(scale.
x, scale.
y);
1592 builder.Translate(1.0f, 1.0f);
1594 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kSolid, 5.0f);
1595 flutter::DlPaint solid_alpha_paint =
1597 .setMaskFilter(solid_filter)
1598 .setColor(flutter::DlColor::kBlue())
1600 for (
int x = 1;
x <= 4;
x++) {
1601 for (
int y = 1; y <= 4; y++) {
1602 builder.DrawRect(DlRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1609 builder.Translate(500.0f, 0.0f);
1610 auto normal_filter =
1611 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kNormal, 5.0f);
1612 auto rotate_if = flutter::DlMatrixImageFilter::Make(
1614 flutter::DlPaint normal_if_paint =
1616 .setMaskFilter(solid_filter)
1617 .setImageFilter(rotate_if)
1618 .setColor(flutter::DlColor::kGreen())
1620 for (
int x = 1;
x <= 4;
x++) {
1621 for (
int y = 1; y <= 4; y++) {
1622 builder.DrawRect(DlRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1628 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
static sk_sp< DlImageImpeller > Make(std::shared_ptr< Texture > texture, OwningContext owning_context=OwningContext::kIO)
TEST_P(AiksTest, DrawAtlasNoColor)
flutter::DlColor toColor(const float *components)
INSTANTIATE_PLAYGROUND_SUITE(AiksTest)
Point DrawPlaygroundPoint(PlaygroundPoint &point)
std::tuple< Point, Point > DrawPlaygroundLine(PlaygroundPoint &point_a, PlaygroundPoint &point_b)
flutter::DlScalar DlScalar
static uint32_t ToIColor(Color color)
Convert this color to a 32-bit representation.
static constexpr Color White()
static constexpr Color Red()
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
constexpr Matrix Translate(const Vector3 &t) const
static constexpr Matrix MakeRow(Scalar m0, Scalar m1, Scalar m2, Scalar m3, Scalar m4, Scalar m5, Scalar m6, Scalar m7, Scalar m8, Scalar m9, Scalar m10, Scalar m11, Scalar m12, Scalar m13, Scalar m14, Scalar m15)
constexpr Matrix Scale(const Vector3 &s) const
static Matrix MakeRotationZ(Radians r)
std::vector< Point > points