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_tile_mode.h"
15 #include "flutter/display_list/effects/dl_color_filter.h"
16 #include "flutter/display_list/effects/dl_color_source.h"
17 #include "flutter/display_list/effects/dl_image_filters.h"
18 #include "flutter/display_list/effects/dl_mask_filter.h"
19 #include "flutter/display_list/geometry/dl_path_builder.h"
20 #include "flutter/testing/testing.h"
21 #include "gtest/gtest.h"
33 #include "third_party/imgui/imgui.h"
38 flutter::DlColor
toColor(
const float* components) {
40 Color(components[0], components[1], components[2], components[3])));
47 flutter::DisplayListBuilder builder;
48 builder.DrawRect(DlRect::MakeXYWH(10, 10, 100, 100),
49 flutter::DlPaint(flutter::DlColor::kBlue()));
50 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
54 flutter::DisplayListBuilder builder;
55 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello", CreateTestFont()),
56 100, 100, flutter::DlPaint(flutter::DlColor::kBlue()));
57 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
61 flutter::DisplayListBuilder builder;
63 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
64 flutter::DlColor::kRed()};
65 const float stops[2] = {0.0, 1.0};
67 auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {300.0, 300.0},
68 2, colors.data(), stops,
69 flutter::DlTileMode::kClamp);
70 flutter::DlPaint paint;
71 paint.setColorSource(linear);
74 SkTextBlob::MakeFromString(
"Hello World", CreateTestFont()), 100, 100,
76 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
80 flutter::DisplayListBuilder builder;
81 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello", CreateTestFont()),
82 100, 100, flutter::DlPaint(flutter::DlColor::kRed()));
84 flutter::DlPaint save_paint;
86 save_paint.setAlpha(
static_cast<uint8_t
>(255 * alpha));
87 builder.SaveLayer(std::nullopt, &save_paint);
88 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello with half alpha",
89 CreateTestFontOfSize(100)),
90 100, 300, flutter::DlPaint(flutter::DlColor::kRed()));
92 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
96 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
97 flutter::DisplayListBuilder builder;
99 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
100 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
104 flutter::DisplayListBuilder builder;
105 flutter::DlPaint paint;
107 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
108 paint.setStrokeWidth(30);
109 paint.setColor(flutter::DlColor::kRed());
111 flutter::DlPathBuilder path_builder;
112 path_builder.MoveTo(
DlPoint(-50, 0));
113 path_builder.LineTo(
DlPoint(0, -50));
114 path_builder.LineTo(
DlPoint(50, 0));
117 builder.Translate(100, 100);
119 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
120 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
121 paint.setStrokeMiter(4);
122 builder.DrawPath(path, paint);
127 builder.Translate(0, 100);
130 paint.setStrokeMiter(1);
131 builder.DrawPath(path, paint);
135 builder.Translate(150, 0);
137 paint.setStrokeCap(flutter::DlStrokeCap::kSquare);
138 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
139 builder.DrawPath(path, paint);
142 builder.Translate(150, 0);
144 paint.setStrokeCap(flutter::DlStrokeCap::kRound);
145 paint.setStrokeJoin(flutter::DlStrokeJoin::kRound);
146 builder.DrawPath(path, paint);
149 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
153 auto callback = [&]() {
154 static float start_angle = 45;
155 static float sweep_angle = 270;
156 static float stroke_width = 10;
159 static int selected_cap = 0;
160 const char* cap_names[] = {
"Butt",
"Round",
"Square"};
161 flutter::DlStrokeCap cap;
163 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
164 ImGui::SliderFloat(
"Start angle", &start_angle, -360, 360);
165 ImGui::SliderFloat(
"Sweep angle", &sweep_angle, -360, 360);
166 ImGui::SliderFloat(
"Stroke width", &stroke_width, 0, 300);
167 ImGui::Combo(
"Cap", &selected_cap, cap_names,
168 sizeof(cap_names) /
sizeof(
char*));
172 switch (selected_cap) {
174 cap = flutter::DlStrokeCap::kButt;
177 cap = flutter::DlStrokeCap::kRound;
180 cap = flutter::DlStrokeCap::kSquare;
183 cap = flutter::DlStrokeCap::kButt;
191 flutter::DisplayListBuilder builder;
192 flutter::DlPaint paint;
194 Vector2 scale = GetContentScale();
195 builder.Scale(scale.
x, scale.
y);
196 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
197 paint.setStrokeCap(cap);
198 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
199 paint.setStrokeMiter(10);
200 auto rect = DlRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
201 paint.setColor(flutter::DlColor::kGreen());
202 paint.setStrokeWidth(2);
203 builder.DrawRect(rect, paint);
204 paint.setColor(flutter::DlColor::kRed());
205 paint.setStrokeWidth(stroke_width);
206 builder.DrawArc(rect, start_angle, sweep_angle,
use_center, paint);
208 return builder.Build();
210 ASSERT_TRUE(OpenPlaygroundHere(callback));
214 auto callback = [&]() {
215 flutter::DisplayListBuilder builder;
216 flutter::DlPaint paint;
218 paint.setColor(flutter::DlColor::kRed());
219 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
221 static float stroke_width = 10.0f;
222 static int selected_stroke_type = 0;
223 static int selected_join_type = 0;
224 const char* stroke_types[] = {
"Butte",
"Round",
"Square"};
225 const char* join_type[] = {
"kMiter",
"Round",
"kBevel"};
227 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
228 ImGui::Combo(
"Cap", &selected_stroke_type, stroke_types,
229 sizeof(stroke_types) /
sizeof(
char*));
230 ImGui::Combo(
"Join", &selected_join_type, join_type,
231 sizeof(join_type) /
sizeof(
char*));
232 ImGui::SliderFloat(
"Stroke Width", &stroke_width, 10.0f, 50.0f);
235 flutter::DlStrokeCap cap;
236 flutter::DlStrokeJoin join;
237 switch (selected_stroke_type) {
239 cap = flutter::DlStrokeCap::kButt;
242 cap = flutter::DlStrokeCap::kRound;
245 cap = flutter::DlStrokeCap::kSquare;
248 cap = flutter::DlStrokeCap::kButt;
251 switch (selected_join_type) {
253 join = flutter::DlStrokeJoin::kMiter;
256 join = flutter::DlStrokeJoin::kRound;
259 join = flutter::DlStrokeJoin::kBevel;
262 join = flutter::DlStrokeJoin::kMiter;
265 paint.setStrokeCap(cap);
266 paint.setStrokeJoin(join);
267 paint.setStrokeWidth(stroke_width);
270 builder.Scale(1.5f, 1.5f);
273 builder.Translate(100, 100);
274 builder.DrawRect(DlRect::MakeWH(100, 100), paint);
277 builder.Translate(150, 0);
278 builder.DrawRoundRect(
279 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 10, 10), paint);
282 builder.Translate(150, 0);
283 builder.DrawDiffRoundRect(
284 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 10, 10),
285 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(10, 10, 80, 30), 10, 10),
290 builder.Translate(150, 0);
291 flutter::DlPathBuilder path_builder;
292 path_builder.MoveTo(
DlPoint(0, 0));
293 path_builder.LineTo(
DlPoint(0, 0));
294 path_builder.LineTo(
DlPoint(100, 0));
295 path_builder.LineTo(
DlPoint(100, 0));
296 path_builder.LineTo(
DlPoint(100, 100));
297 builder.DrawPath(path_builder.TakePath(), paint);
303 builder.Translate(200, 0);
307 flutter::DlPathBuilder line_path_builder;
308 line_path_builder.MoveTo(
DlPoint(0, 0));
309 line_path_builder.MoveTo(
DlPoint(0, 0));
310 line_path_builder.LineTo(
DlPoint(0, 0));
311 line_path_builder.LineTo(
DlPoint(0, 0));
312 line_path_builder.LineTo(
DlPoint(50, 50));
313 line_path_builder.LineTo(
DlPoint(50, 50));
314 line_path_builder.LineTo(
DlPoint(100, 0));
315 line_path_builder.LineTo(
DlPoint(100, 0));
316 DlPath line_path = line_path_builder.TakePath();
317 builder.DrawPath(line_path, paint);
319 builder.Translate(0, 100);
320 builder.DrawPath(line_path, paint);
322 builder.Translate(0, 100);
323 flutter::DlPathBuilder line_path_builder2;
324 line_path_builder2.MoveTo(
DlPoint(0, 0));
325 line_path_builder2.LineTo(
DlPoint(0, 0));
326 line_path_builder2.LineTo(
DlPoint(0, 0));
327 builder.DrawPath(line_path_builder2.TakePath(), paint);
333 builder.Translate(150, 0);
337 flutter::DlPathBuilder cubic_path;
338 cubic_path.MoveTo(
DlPoint(0, 0));
339 cubic_path.CubicCurveTo(
DlPoint(0, 0),
342 builder.DrawPath(cubic_path.TakePath(), paint);
344 builder.Translate(0, 100);
345 flutter::DlPathBuilder cubic_path2;
346 cubic_path2.MoveTo(
DlPoint(0, 0));
347 cubic_path2.CubicCurveTo(
DlPoint(0, 0),
350 builder.DrawPath(cubic_path2.TakePath(), paint);
352 builder.Translate(0, 100);
353 flutter::DlPathBuilder cubic_path3;
354 cubic_path3.MoveTo(
DlPoint(0, 0));
355 cubic_path3.CubicCurveTo(
DlPoint(0, 0),
358 builder.DrawPath(cubic_path3.TakePath(), paint);
364 builder.Translate(200, 0);
368 flutter::DlPathBuilder quad_path;
369 quad_path.MoveTo(
DlPoint(0, 0));
370 quad_path.MoveTo(
DlPoint(0, 0));
372 builder.DrawPath(quad_path.TakePath(), paint);
374 builder.Translate(0, 150);
375 flutter::DlPathBuilder quad_path2;
376 quad_path2.MoveTo(
DlPoint(0, 0));
377 quad_path2.MoveTo(
DlPoint(0, 0));
379 builder.DrawPath(quad_path2.TakePath(), paint);
381 builder.Translate(0, 100);
382 flutter::DlPathBuilder quad_path3;
383 quad_path3.MoveTo(
DlPoint(0, 0));
385 builder.DrawPath(quad_path3.TakePath(), paint);
389 return builder.Build();
391 ASSERT_TRUE(OpenPlaygroundHere(callback));
395 flutter::DisplayListBuilder builder;
396 flutter::DlPaint paint;
398 paint.setColor(flutter::DlColor::kRed());
399 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
401 builder.Translate(300, 300);
402 flutter::DlPathBuilder path_builder;
403 path_builder.AddCircle(
DlPoint(0, 0), 100);
404 path_builder.AddCircle(
DlPoint(0, 0), 50);
405 path_builder.SetFillType(flutter::DlPathFillType::kOdd);
406 builder.DrawPath(path_builder.TakePath(), paint);
408 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
415 flutter::DisplayListBuilder builder;
416 flutter::DlPaint paint;
418 paint.setColor(flutter::DlColor::kRed());
419 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
420 paint.setStrokeWidth(10);
422 builder.Translate(300, 300);
428 flutter::DlPathBuilder path_builder;
429 path_builder.MoveTo(
DlPoint(50, 50));
430 path_builder.LineTo(
DlPoint(50, 100));
431 path_builder.LineTo(
DlPoint(100, 100));
432 path_builder.LineTo(
DlPoint(100, 50));
433 builder.DrawPath(path_builder.TakePath(), paint);
435 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
439 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
440 flutter::DisplayListBuilder builder;
441 flutter::DlPaint paint;
446 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
447 paint.setMaskFilter(&filter);
449 flutter::DlImageSampling::kNearestNeighbor, &paint);
454 paint.setColor(flutter::DlColor::kYellow());
456 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kOuter, 10.0f);
457 paint.setMaskFilter(&filter);
458 builder.DrawArc(DlRect::MakeXYWH(410, 110, 100, 100), 45, 270,
true, paint);
464 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kSolid, 10.0f);
465 paint.setMaskFilter(&filter);
466 builder.DrawTextBlob(
467 SkTextBlob::MakeFromString(
"Testing", CreateTestFont()), 220, 170,
471 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
475 flutter::DisplayListBuilder builder;
476 flutter::DlPaint paint;
478 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
479 paint.setColor(flutter::DlColor::kRed());
480 builder.DrawTextBlob(
481 SkTextBlob::MakeFromString(
"stoked about stroked text", CreateTestFont()),
484 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
489 flutter::DisplayListBuilder builder;
490 flutter::DlPaint paint;
491 auto const& text_blob = SkTextBlob::MakeFromString(
"00000", CreateTestFont());
494 auto const& mat_blue = flutter::DlColor(0xFF2196f3);
497 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
498 paint.setColor(mat_blue);
499 builder.DrawRect(DlRect::MakeXYWH(0, 0, 500, 500), paint);
502 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
503 paint.setColor(flutter::DlColor::kWhite());
504 builder.DrawTextBlob(text_blob, 250, 250, paint);
506 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
507 paint.setColor(flutter::DlColor::kBlack());
508 builder.DrawTextBlob(text_blob, 250, 250, paint);
510 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
514 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
515 flutter::DisplayListBuilder builder;
516 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
517 flutter::DlPaint paint;
518 paint.setMaskFilter(&filter);
519 builder.SaveLayer(std::nullopt, &paint);
521 flutter::DlImageSampling::kNearestNeighbor);
523 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
527 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
528 flutter::DisplayListBuilder builder;
529 flutter::DlPaint paint;
533 auto filter = flutter::DlColorFilter::MakeBlend(
534 flutter::DlColor::kYellow(), flutter::DlBlendMode::kModulate);
535 paint.setColorFilter(filter);
537 flutter::DlImageSampling::kNearestNeighbor, &paint);
542 auto filter = flutter::DlColorFilter::MakeBlend(
543 flutter::DlColor::kRed(), flutter::DlBlendMode::kScreen);
544 paint.setColorFilter(filter);
546 flutter::DlImageSampling::kNearestNeighbor, &paint);
549 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
553 const float invert_color_matrix[20] = {
559 auto texture = CreateTextureForFixture(
"boston.jpg");
560 flutter::DisplayListBuilder builder;
561 flutter::DlPaint paint;
563 auto color_filter = flutter::DlColorFilter::MakeMatrix(invert_color_matrix);
564 auto image_filter = flutter::DlImageFilter::MakeColorFilter(color_filter);
566 paint.setImageFilter(image_filter);
568 flutter::DlImageSampling::kNearestNeighbor, &paint);
570 builder.Translate(0, 700);
571 paint.setColorFilter(color_filter);
573 flutter::DlImageSampling::kNearestNeighbor, &paint);
574 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
578 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
580 auto callback = [&]() {
581 static float sigma[] = {10, 10};
583 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
584 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
587 flutter::DisplayListBuilder builder;
588 flutter::DlPaint paint;
590 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
591 flutter::DlTileMode::kClamp);
592 paint.setImageFilter(&filter);
594 flutter::DlImageSampling::kNearestNeighbor, &paint);
596 return builder.Build();
599 ASSERT_TRUE(OpenPlaygroundHere(callback));
603 auto texture = CreateTextureForFixture(
"boston.jpg");
604 flutter::DisplayListBuilder builder;
605 flutter::DlPaint paint;
607 auto dilate = std::make_shared<flutter::DlDilateImageFilter>(10.0, 10.0);
608 auto erode = std::make_shared<flutter::DlErodeImageFilter>(10.0, 10.0);
609 auto open = std::make_shared<flutter::DlComposeImageFilter>(dilate, erode);
610 auto close = std::make_shared<flutter::DlComposeImageFilter>(erode, dilate);
612 paint.setImageFilter(open.get());
614 flutter::DlImageSampling::kNearestNeighbor, &paint);
615 builder.Translate(0, 700);
616 paint.setImageFilter(close.get());
618 flutter::DlImageSampling::kNearestNeighbor, &paint);
619 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
623 auto texture = CreateTextureForFixture(
"boston.jpg");
624 const float inner_color_matrix[20] = {
630 const float outer_color_matrix[20] = {
636 auto inner_color_filter =
637 flutter::DlColorFilter::MakeMatrix(inner_color_matrix);
638 auto outer_color_filter =
639 flutter::DlColorFilter::MakeMatrix(outer_color_matrix);
640 auto inner = flutter::DlImageFilter::MakeColorFilter(inner_color_filter);
641 auto outer = flutter::DlImageFilter::MakeColorFilter(outer_color_filter);
642 auto compose = std::make_shared<flutter::DlComposeImageFilter>(outer, inner);
644 flutter::DisplayListBuilder builder;
645 flutter::DlPaint paint;
646 paint.setImageFilter(compose.get());
648 flutter::DlImageSampling::kNearestNeighbor, &paint);
649 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
653 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
655 auto callback = [&]() {
656 static float sigma[] = {10, 10};
657 static float ctm_scale = 1;
658 static bool use_bounds =
true;
659 static bool draw_circle =
true;
660 static bool add_clip =
true;
662 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
663 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
664 ImGui::SliderFloat(
"Scale", &ctm_scale, 0, 10);
667 "If everything is working correctly, none of the options below should "
668 "impact the filter's appearance.");
669 ImGui::Checkbox(
"Use SaveLayer bounds", &use_bounds);
670 ImGui::Checkbox(
"Draw child element", &draw_circle);
671 ImGui::Checkbox(
"Add pre-clip", &add_clip);
674 flutter::DisplayListBuilder builder;
676 Vector2 scale = ctm_scale * GetContentScale();
677 builder.Scale(scale.
x, scale.
y);
679 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
680 flutter::DlTileMode::kClamp);
682 std::optional<DlRect> bounds;
687 bounds = DlRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
693 builder.ClipRect(DlRect::MakeLTRB(0, 0, 99999, 99999),
694 flutter::DlClipOp::kIntersect,
true);
698 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
699 builder.SaveLayer(bounds,
nullptr, &filter);
705 flutter::DlPaint paint;
706 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
707 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
708 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
709 paint.setStrokeWidth(10);
710 paint.setColor(flutter::DlColor::kRed().withAlpha(100));
711 builder.DrawCircle(
DlPoint(circle_center.x, circle_center.y), 100, paint);
714 return builder.Build();
717 ASSERT_TRUE(OpenPlaygroundHere(callback));
722 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
723 flutter::DisplayListBuilder builder;
724 auto size = texture->GetSize();
725 builder.DrawImageNine(
727 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
728 size.height * 3 / 4),
729 DlRect::MakeLTRB(0, 0, size.width * 2, size.height * 2),
730 flutter::DlFilterMode::kNearest,
nullptr);
731 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
738 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
739 flutter::DisplayListBuilder builder;
740 auto size = texture->GetSize();
741 builder.DrawImageNine(
743 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
744 size.height * 3 / 4),
745 DlRect::MakeLTRB(0, 0, size.width / 2, size.height),
746 flutter::DlFilterMode::kNearest,
nullptr);
747 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
754 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
755 flutter::DisplayListBuilder builder;
756 auto size = texture->GetSize();
757 builder.DrawImageNine(
759 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
760 size.height * 3 / 4),
761 DlRect::MakeLTRB(0, 0, size.width, size.height / 2),
762 flutter::DlFilterMode::kNearest,
nullptr);
763 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
769 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
770 flutter::DisplayListBuilder builder;
771 auto size = texture->GetSize();
772 builder.DrawImageNine(
774 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
775 size.height * 3 / 4),
776 DlRect::MakeLTRB(0, 0, size.width / 2, size.height / 2),
777 flutter::DlFilterMode::kNearest,
nullptr);
778 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
784 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
785 flutter::DisplayListBuilder builder;
786 auto size = texture->GetSize();
787 builder.DrawImageNine(
789 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
790 size.height * 3 / 4),
791 DlRect::MakeLTRB(0, 0, size.width / 4, size.height / 4),
792 flutter::DlFilterMode::kNearest,
nullptr);
793 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
799 auto texture = CreateTextureForFixture(
"nine_patch_corners.png");
800 flutter::DisplayListBuilder builder;
802 DlIRect::MakeXYWH(10, 10, 1, 1),
803 DlRect::MakeXYWH(0, 0, 200, 100),
804 flutter::DlFilterMode::kNearest,
nullptr);
805 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
809 flutter::DisplayListBuilder builder;
819 std::vector<flutter::DlStrokeCap> caps = {
820 flutter::DlStrokeCap::kButt,
821 flutter::DlStrokeCap::kRound,
822 flutter::DlStrokeCap::kSquare,
824 flutter::DlPaint paint =
826 .setColor(flutter::DlColor::kYellow().withAlpha(127))
828 builder.Translate(50, 50);
829 for (
auto cap : caps) {
830 paint.setStrokeCap(cap);
832 builder.DrawPoints(flutter::DlPointMode::kPoints, 7,
points, paint);
833 builder.Translate(150, 0);
834 builder.DrawPoints(flutter::DlPointMode::kLines, 5,
points, paint);
835 builder.Translate(150, 0);
836 builder.DrawPoints(flutter::DlPointMode::kPolygon, 5,
points, paint);
838 builder.Translate(0, 150);
840 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
844 flutter::DisplayListBuilder builder;
845 std::vector<flutter::DlStrokeCap> caps = {
846 flutter::DlStrokeCap::kButt,
847 flutter::DlStrokeCap::kRound,
848 flutter::DlStrokeCap::kSquare,
850 flutter::DlPaint paint =
852 .setColor(flutter::DlColor::kYellow().withAlpha(127))
853 .setDrawStyle(flutter::DlDrawStyle::kStroke)
854 .setStrokeCap(flutter::DlStrokeCap::kButt)
856 DlPath path = DlPath::MakeLine({150, 50}, {150, 50});
857 for (
auto cap : caps) {
858 paint.setStrokeCap(cap);
860 builder.DrawPath(path, paint);
861 builder.Translate(0, 150);
863 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
867 flutter::DisplayListBuilder builder;
868 flutter::DlPaint paint;
870 auto content_scale = GetContentScale() * 0.8;
871 builder.Scale(content_scale.x, content_scale.y);
873 constexpr
size_t star_spikes = 5;
874 constexpr
DlScalar half_spike_rotation =
kPi / star_spikes;
877 constexpr
DlScalar outer_radius = radius + spike_size;
878 constexpr
DlScalar inner_radius = radius - spike_size;
879 std::array<DlPoint, star_spikes * 2> star;
880 for (
size_t i = 0; i < star_spikes; i++) {
881 const DlScalar rotation = half_spike_rotation * i * 2;
882 star[i * 2] =
DlPoint(50 + std::sin(rotation) * outer_radius,
883 50 - std::cos(rotation) * outer_radius);
885 DlPoint(50 + std::sin(rotation + half_spike_rotation) * inner_radius,
886 50 - std::cos(rotation + half_spike_rotation) * inner_radius);
889 std::array<DlPath, 4> paths = {
890 DlPath::MakeRect(DlRect::MakeXYWH(0, 0, 200, 100)),
891 DlPath::MakeRoundRectXY(DlRect::MakeXYWH(20, 0, 200, 100), 30, 30),
892 DlPath::MakeCircle(
DlPoint(100, 50), 50),
893 DlPath::MakePoly(star.data(), star.size(),
true),
895 paint.setColor(flutter::DlColor::kWhite());
896 builder.DrawPaint(paint);
897 paint.setColor(flutter::DlColor::kCyan());
898 builder.Translate(100, 50);
899 for (
size_t x = 0;
x < paths.size();
x++) {
901 for (
size_t y = 0; y < 6; y++) {
902 builder.DrawShadow(paths[
x], flutter::DlColor::kBlack(), 3 + y * 8,
false,
904 builder.DrawPath(paths[
x], paint);
905 builder.Translate(0, 150);
908 builder.Translate(250, 0);
911 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
915 flutter::DisplayListBuilder builder;
916 std::vector<flutter::DlStrokeCap> caps = {
917 flutter::DlStrokeCap::kButt,
918 flutter::DlStrokeCap::kRound,
919 flutter::DlStrokeCap::kSquare,
921 flutter::DlPaint paint =
923 .setColor(flutter::DlColor::kWhite())
924 .setDrawStyle(flutter::DlDrawStyle::kStroke)
926 flutter::DlPaint outline_paint =
928 .setColor(flutter::DlColor::kYellow())
929 .setDrawStyle(flutter::DlDrawStyle::kStroke)
930 .setStrokeCap(flutter::DlStrokeCap::kSquare)
932 DlPath path = DlPath::MakeLine({150, 50}, {160, 50});
933 for (
auto cap : caps) {
934 paint.setStrokeCap(cap);
936 builder.DrawRect(DlRect::MakeLTRB(45, 45, 65, 55), outline_paint);
938 if (cap != flutter::DlStrokeCap::kButt) {
939 builder.DrawRect(DlRect::MakeLTRB(95, 45, 105, 55), outline_paint);
941 builder.DrawPath(path, paint);
942 builder.DrawRect(path.GetBounds().Expand(5, 5), outline_paint);
943 builder.Translate(0, 150);
945 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
949 auto boston = CreateTextureForFixture(
"boston.jpg");
951 auto callback = [&]() {
952 static int selected_matrix_type = 0;
953 const char* matrix_type_names[] = {
"Matrix",
"Local Matrix"};
955 static float ctm_translation[2] = {200, 200};
956 static float ctm_scale[2] = {0.65, 0.65};
957 static float ctm_skew[2] = {0, 0};
959 static bool enable =
true;
960 static float translation[2] = {100, 100};
961 static float scale[2] = {0.8, 0.8};
962 static float skew[2] = {0.2, 0.2};
964 static bool enable_savelayer =
true;
966 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
968 ImGui::Combo(
"Filter type", &selected_matrix_type, matrix_type_names,
969 sizeof(matrix_type_names) /
sizeof(
char*));
971 ImGui::TextWrapped(
"Current Transform");
972 ImGui::SliderFloat2(
"CTM Translation", ctm_translation, 0, 1000);
973 ImGui::SliderFloat2(
"CTM Scale", ctm_scale, 0, 3);
974 ImGui::SliderFloat2(
"CTM Skew", ctm_skew, -3, 3);
977 "MatrixFilter and LocalMatrixFilter modify the CTM in the same way. "
978 "The only difference is that MatrixFilter doesn't affect the effect "
979 "transform, whereas LocalMatrixFilter does.");
982 ImGui::Checkbox(
"Enable", &enable);
983 ImGui::SliderFloat2(
"Filter Translation", translation, 0, 1000);
984 ImGui::SliderFloat2(
"Filter Scale", scale, 0, 3);
985 ImGui::SliderFloat2(
"Filter Skew", skew, -3, 3);
988 "Rendering the filtered image within a layer can expose bounds "
989 "issues. If the rendered image gets cut off when this setting is "
990 "enabled, there's a coverage bug in the filter.");
991 ImGui::Checkbox(
"Render in layer", &enable_savelayer);
995 flutter::DisplayListBuilder builder;
996 flutter::DlPaint paint;
998 if (enable_savelayer) {
999 builder.SaveLayer(std::nullopt,
nullptr);
1002 auto content_scale = GetContentScale();
1003 builder.Scale(content_scale.x, content_scale.y);
1007 ctm_scale[0], ctm_skew[0], 0.0f, ctm_translation[0],
1008 ctm_skew[1], ctm_scale[1], 0.0f, ctm_translation[1],
1011 builder.Transform(ctm_matrix);
1014 auto filter_matrix =
1016 skew[1], scale[1], 0.0f, translation[1],
1017 0.0f, 0.0f, 1.0f, 0.0f,
1018 0.0f, 0.0f, 0.0f, 1.0f);
1021 switch (selected_matrix_type) {
1023 auto filter = flutter::DlMatrixImageFilter(
1024 filter_matrix, flutter::DlImageSampling::kLinear);
1025 paint.setImageFilter(&filter);
1029 auto internal_filter =
1030 flutter::DlBlurImageFilter(10, 10, flutter::DlTileMode::kDecal)
1032 auto filter = flutter::DlLocalMatrixImageFilter(filter_matrix,
1034 paint.setImageFilter(&filter);
1041 flutter::DlImageSampling::kLinear, &paint);
1043 if (enable_savelayer) {
1047 return builder.Build();
1050 ASSERT_TRUE(OpenPlaygroundHere(callback));
1054 auto callback = [&]() {
1055 static float translation[2] = {0, 0};
1056 static bool enable_save_layer =
true;
1058 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1059 ImGui::SliderFloat2(
"Translation", translation, -130, 130);
1060 ImGui::Checkbox(
"Enable save layer", &enable_save_layer);
1063 flutter::DisplayListBuilder builder;
1065 builder.Scale(2.0, 2.0);
1066 flutter::DlPaint paint;
1067 paint.setColor(flutter::DlColor::kYellow());
1068 builder.DrawRect(DlRect::MakeWH(300, 300), paint);
1069 paint.setStrokeWidth(1.0);
1070 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1071 paint.setColor(flutter::DlColor::kBlack().withAlpha(0x80));
1075 flutter::DlPaint save_paint;
1076 DlRect bounds = DlRect::MakeXYWH(100, 100, 100, 100);
1077 Matrix translate_matrix =
1079 if (enable_save_layer) {
1080 auto filter = flutter::DlMatrixImageFilter(
1081 translate_matrix, flutter::DlImageSampling::kNearestNeighbor);
1082 save_paint.setImageFilter(filter.shared());
1083 builder.SaveLayer(bounds, &save_paint);
1086 builder.Transform(translate_matrix);
1091 filter_matrix.
Scale({0.2f, 0.2f});
1093 auto filter = flutter::DlMatrixImageFilter(
1094 filter_matrix, flutter::DlImageSampling::kNearestNeighbor);
1096 save_paint.setImageFilter(filter.shared());
1098 builder.SaveLayer(bounds, &save_paint);
1099 flutter::DlPaint paint2;
1100 paint2.setColor(flutter::DlColor::kBlue());
1101 builder.DrawRect(bounds, paint2);
1104 return builder.Build();
1107 ASSERT_TRUE(OpenPlaygroundHere(callback));
1111 flutter::DlPaint paint;
1112 paint.setColor(flutter::DlColor(0xFF2196F3).withAlpha(128));
1113 flutter::DisplayListBuilder builder;
1114 paint.setColorFilter(flutter::DlColorFilter::MakeLinearToSrgbGamma());
1115 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
1116 builder.Translate(0, 200);
1118 paint.setColorFilter(flutter::DlColorFilter::MakeSrgbToLinearGamma());
1119 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
1121 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1125 const flutter::DlColor colors[2] = {
1126 flutter::DlColor(0xFFF44336),
1127 flutter::DlColor(0xFF2196F3),
1129 const float stops[2] = {0.0, 1.0};
1130 flutter::DlPaint paint;
1131 flutter::DisplayListBuilder builder;
1132 auto clip_bounds = DlRect::MakeWH(300.0, 300.0);
1134 builder.Translate(100, 100);
1135 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1137 flutter::DlColorSource::MakeLinear({0.0, 0.0}, {100.0, 100.0}, 2, colors,
1138 stops, flutter::DlTileMode::kRepeat);
1139 paint.setColorSource(linear);
1140 builder.DrawPaint(paint);
1144 builder.Translate(500, 100);
1145 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1146 auto radial = flutter::DlColorSource::MakeRadial(
1147 {100.0, 100.0}, 100.0, 2, colors, stops, flutter::DlTileMode::kRepeat);
1148 paint.setColorSource(radial);
1149 builder.DrawPaint(paint);
1153 builder.Translate(100, 500);
1154 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1156 flutter::DlColorSource::MakeSweep({100.0, 100.0}, 180.0, 270.0, 2, colors,
1157 stops, flutter::DlTileMode::kRepeat);
1158 paint.setColorSource(sweep);
1159 builder.DrawPaint(paint);
1163 builder.Translate(500, 500);
1164 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1165 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
1167 flutter::DlTileMode::kRepeat,
1168 flutter::DlTileMode::kRepeat);
1169 paint.setColorSource(image);
1170 builder.DrawPaint(paint);
1173 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1177 flutter::DisplayListBuilder builder;
1180 builder.SaveLayer(std::nullopt,
nullptr);
1181 builder.Translate(100, 100);
1182 flutter::DlPaint paint;
1183 paint.setColor(flutter::DlColor::kRed());
1184 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1185 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1186 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
1187 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1191 builder.SaveLayer(std::nullopt,
nullptr);
1192 builder.Translate(300, 100);
1193 flutter::DlPaint paint;
1194 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1195 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1196 paint.setColor(flutter::DlColor::kRed());
1197 paint.setBlendMode(flutter::DlBlendMode::kDstOver);
1198 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1202 builder.SaveLayer(std::nullopt,
nullptr);
1203 builder.Translate(100, 300);
1204 flutter::DlPaint paint;
1205 paint.setColor(flutter::DlColor::kRed());
1206 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1207 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1208 paint.setBlendMode(flutter::DlBlendMode::kSrc);
1209 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1213 builder.SaveLayer(std::nullopt,
nullptr);
1214 builder.Translate(300, 300);
1215 flutter::DlPaint paint;
1216 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1217 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1218 paint.setColor(flutter::DlColor::kRed());
1219 paint.setBlendMode(flutter::DlBlendMode::kDst);
1220 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1224 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1228 flutter::DisplayListBuilder builder;
1229 const float green_color_matrix[20] = {
1235 const float blue_color_matrix[20] = {
1241 auto green_color_filter =
1242 flutter::DlColorFilter::MakeMatrix(green_color_matrix);
1243 auto blue_color_filter =
1244 flutter::DlColorFilter::MakeMatrix(blue_color_matrix);
1245 auto blue_image_filter =
1246 flutter::DlImageFilter::MakeColorFilter(blue_color_filter);
1248 flutter::DlPaint paint;
1249 paint.setColor(flutter::DlColor::kRed());
1250 paint.setColorFilter(green_color_filter);
1251 paint.setImageFilter(blue_image_filter);
1252 builder.DrawRect(DlRect::MakeLTRB(100, 100, 500, 500), paint);
1253 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1257 auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
1258 flutter::DlBlurStyle::kNormal, 10);
1260 flutter::DisplayListBuilder builder;
1262 std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
1263 flutter::DlColor::kGreen()};
1264 std::array<float, 2> stops = {0, 1};
1265 auto texture = CreateTextureForFixture(
"airplane.jpg");
1266 auto matrix = flutter::DlMatrix::MakeTranslation({-300, -110});
1267 std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
1268 flutter::DlColorSource::MakeImage(
1270 flutter::DlTileMode::kRepeat, flutter::DlImageSampling::kLinear,
1272 flutter::DlColorSource::MakeLinear(
1274 stops.data(), flutter::DlTileMode::kClamp),
1278 builder.Translate(0, 100);
1279 for (
const auto& color_source : color_sources) {
1280 flutter::DlPaint paint;
1281 paint.setColorSource(color_source);
1282 paint.setMaskFilter(blur_filter);
1285 builder.Translate(100, 0);
1286 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1287 builder.DrawRoundRect(
1288 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 30, 30), paint);
1290 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1291 paint.setStrokeWidth(10);
1292 builder.Translate(200, 0);
1293 builder.DrawRoundRect(
1294 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 30, 30), paint);
1297 builder.Translate(0, 100);
1301 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1305 flutter::DisplayListBuilder builder;
1306 std::vector<flutter::DlStrokeJoin> joins = {
1307 flutter::DlStrokeJoin::kBevel,
1308 flutter::DlStrokeJoin::kRound,
1309 flutter::DlStrokeJoin::kMiter,
1311 flutter::DlPaint paint =
1313 .setColor(flutter::DlColor::kWhite())
1314 .setDrawStyle(flutter::DlDrawStyle::kFill)
1315 .setStrokeWidth(10);
1316 flutter::DlPaint stroke_paint =
1318 .setColor(flutter::DlColor::kWhite())
1319 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1320 .setStrokeWidth(10);
1321 DlPath path = DlPath::MakeLine({150, 50}, {160, 50});
1323 builder.Translate(300, 50);
1324 builder.Scale(0.8, 0.8);
1325 for (
auto join : joins) {
1326 paint.setStrokeJoin(join);
1327 stroke_paint.setStrokeJoin(join);
1328 builder.DrawRect(DlRect::MakeXYWH(0, 0, 100, 100), paint);
1329 builder.DrawRect(DlRect::MakeXYWH(0, 150, 100, 100), stroke_paint);
1330 builder.DrawRoundRect(
1331 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(150, 0, 100, 100), 30, 30),
1333 builder.DrawRoundRect(
1334 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(150, 150, 100, 100), 30, 30),
1336 builder.DrawCircle(
DlPoint(350, 50), 50, paint);
1337 builder.DrawCircle(
DlPoint(350, 200), 50, stroke_paint);
1338 builder.Translate(0, 300);
1340 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1344 flutter::DisplayListBuilder builder;
1346 flutter::DlPaint fill_paint =
1348 .setColor(flutter::DlColor::kBlue())
1349 .setDrawStyle(flutter::DlDrawStyle::kFill)
1350 .setStrokeWidth(10);
1351 flutter::DlPaint stroke_paint =
1353 .setColor(flutter::DlColor::kGreen())
1354 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1355 .setStrokeWidth(10);
1357 builder.DrawRoundRect(
1358 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1360 builder.DrawRoundRect(
1361 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1364 builder.DrawRoundRect(
1365 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1367 builder.DrawRoundRect(
1368 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1371 flutter::DlPaint reference_paint =
1373 .setColor(flutter::DlColor::kMidGrey())
1374 .setDrawStyle(flutter::DlDrawStyle::kFill)
1375 .setStrokeWidth(10);
1377 builder.DrawRoundRect(
1378 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 500, 300, 300), 40, 40),
1380 builder.DrawRoundRect(
1381 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 100, 300, 300), 120, 120),
1384 flutter::DlPaint clip_fill_paint =
1386 .setColor(flutter::DlColor::kCyan())
1387 .setDrawStyle(flutter::DlDrawStyle::kFill)
1388 .setStrokeWidth(10);
1391 builder.ClipRoundRect(
1392 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(900, 100, 300, 300), 120, 40));
1393 builder.DrawPaint(clip_fill_paint);
1397 builder.ClipRoundRect(
1398 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 900, 300, 300), 40, 120));
1399 builder.DrawPaint(clip_fill_paint);
1402 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1406 std::vector<const char*> blend_mode_names;
1407 std::vector<flutter::DlBlendMode> blend_mode_values;
1409 const std::vector<std::tuple<const char*, flutter::DlBlendMode>> blends = {
1411 {
"Clear", flutter::DlBlendMode::kClear},
1412 {
"Source", flutter::DlBlendMode::kSrc},
1413 {
"Destination", flutter::DlBlendMode::kDst},
1414 {
"SourceOver", flutter::DlBlendMode::kSrcOver},
1415 {
"DestinationOver", flutter::DlBlendMode::kDstOver},
1416 {
"SourceIn", flutter::DlBlendMode::kSrcIn},
1417 {
"DestinationIn", flutter::DlBlendMode::kDstIn},
1418 {
"SourceOut", flutter::DlBlendMode::kSrcOut},
1419 {
"DestinationOut", flutter::DlBlendMode::kDstOut},
1420 {
"SourceATop", flutter::DlBlendMode::kSrcATop},
1421 {
"DestinationATop", flutter::DlBlendMode::kDstATop},
1422 {
"Xor", flutter::DlBlendMode::kXor},
1423 {
"Plus", flutter::DlBlendMode::kPlus},
1424 {
"Modulate", flutter::DlBlendMode::kModulate},
1426 {
"Screen", flutter::DlBlendMode::kScreen},
1427 {
"Overlay", flutter::DlBlendMode::kOverlay},
1428 {
"Darken", flutter::DlBlendMode::kDarken},
1429 {
"Lighten", flutter::DlBlendMode::kLighten},
1430 {
"ColorDodge", flutter::DlBlendMode::kColorDodge},
1431 {
"ColorBurn", flutter::DlBlendMode::kColorBurn},
1432 {
"HardLight", flutter::DlBlendMode::kHardLight},
1433 {
"SoftLight", flutter::DlBlendMode::kSoftLight},
1434 {
"Difference", flutter::DlBlendMode::kDifference},
1435 {
"Exclusion", flutter::DlBlendMode::kExclusion},
1436 {
"Multiply", flutter::DlBlendMode::kMultiply},
1437 {
"Hue", flutter::DlBlendMode::kHue},
1438 {
"Saturation", flutter::DlBlendMode::kSaturation},
1439 {
"Color", flutter::DlBlendMode::kColor},
1440 {
"Luminosity", flutter::DlBlendMode::kLuminosity},
1442 assert(blends.size() ==
1443 static_cast<size_t>(flutter::DlBlendMode::kLastMode) + 1);
1444 for (
const auto& [name, mode] : blends) {
1445 blend_mode_names.push_back(name);
1446 blend_mode_values.push_back(mode);
1450 auto callback = [&]() {
1451 static int current_blend_index = 3;
1452 static float dst_alpha = 1;
1453 static float src_alpha = 1;
1454 static float color0[4] = {1.0f, 0.0f, 0.0f, 1.0f};
1455 static float color1[4] = {0.0f, 1.0f, 0.0f, 1.0f};
1456 static float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
1457 static float src_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1459 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1461 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
1462 blend_mode_names.data(), blend_mode_names.size());
1463 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
1464 ImGui::ColorEdit4(
"Color A", color0);
1465 ImGui::ColorEdit4(
"Color B", color1);
1466 ImGui::ColorEdit4(
"Color C", color2);
1467 ImGui::ColorEdit4(
"Source Color", src_color);
1468 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
1472 std::vector<DlPoint> positions = {
DlPoint(100, 300),
1475 std::vector<flutter::DlColor> colors = {
1476 toColor(color0).modulateOpacity(dst_alpha),
1477 toColor(color1).modulateOpacity(dst_alpha),
1478 toColor(color2).modulateOpacity(dst_alpha)};
1480 auto vertices = flutter::DlVertices::Make(
1481 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1482 nullptr, colors.data());
1484 flutter::DisplayListBuilder builder;
1485 flutter::DlPaint paint;
1487 paint.setColor(
toColor(src_color).modulateOpacity(src_alpha));
1488 builder.DrawVertices(vertices, blend_mode_values[current_blend_index],
1490 return builder.Build();
1493 ASSERT_TRUE(OpenPlaygroundHere(callback));
1497 flutter::DisplayListBuilder builder;
1498 builder.DrawPaint(flutter::DlPaint().setColor(flutter::DlColor::kWhite()));
1500 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
1501 builder.DrawCircle(
DlPoint(300, 300), 200,
1502 flutter::DlPaint().setMaskFilter(&filter));
1504 std::vector<flutter::DlColor> colors = {flutter::DlColor::kGreen(),
1505 flutter::DlColor::kGreen()};
1506 const float stops[2] = {0.0, 1.0};
1507 auto linear = flutter::DlColorSource::MakeLinear(
1508 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
1509 flutter::DlTileMode::kRepeat);
1510 flutter::DlPaint blend_paint =
1512 .setColorSource(linear)
1513 .setBlendMode(flutter::DlBlendMode::kScreen);
1514 builder.DrawPaint(blend_paint);
1516 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1520 flutter::DisplayListBuilder builder;
1521 builder.DrawColor(flutter::DlColor::kWhite(), flutter::DlBlendMode::kSrc);
1522 Vector2 scale = GetContentScale();
1523 builder.Scale(scale.
x, scale.
y);
1527 builder.Translate(1.0f, 1.0f);
1529 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kSolid, 5.0f);
1530 flutter::DlPaint solid_alpha_paint =
1532 .setMaskFilter(solid_filter)
1533 .setColor(flutter::DlColor::kBlue())
1535 for (
int x = 1;
x <= 4;
x++) {
1536 for (
int y = 1; y <= 4; y++) {
1537 builder.DrawRect(DlRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1544 builder.Translate(500.0f, 0.0f);
1545 auto normal_filter =
1546 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kNormal, 5.0f);
1547 auto rotate_if = flutter::DlMatrixImageFilter::Make(
1549 flutter::DlPaint normal_if_paint =
1551 .setMaskFilter(solid_filter)
1552 .setImageFilter(rotate_if)
1553 .setColor(flutter::DlColor::kGreen())
1555 for (
int x = 1;
x <= 4;
x++) {
1556 for (
int y = 1; y <= 4; y++) {
1557 builder.DrawRect(DlRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1563 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