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/testing/testing.h"
20 #include "gtest/gtest.h"
32 #include "third_party/imgui/imgui.h"
37 flutter::DlColor
toColor(
const float* components) {
39 Color(components[0], components[1], components[2], components[3])));
46 flutter::DisplayListBuilder builder;
47 builder.DrawRect(DlRect::MakeXYWH(10, 10, 100, 100),
48 flutter::DlPaint(flutter::DlColor::kBlue()));
49 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
53 flutter::DisplayListBuilder builder;
54 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello", CreateTestFont()),
55 100, 100, flutter::DlPaint(flutter::DlColor::kBlue()));
56 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
60 flutter::DisplayListBuilder builder;
62 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
63 flutter::DlColor::kRed()};
64 const float stops[2] = {0.0, 1.0};
66 auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {300.0, 300.0},
67 2, colors.data(), stops,
68 flutter::DlTileMode::kClamp);
69 flutter::DlPaint paint;
70 paint.setColorSource(linear);
73 SkTextBlob::MakeFromString(
"Hello World", CreateTestFont()), 100, 100,
75 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
79 flutter::DisplayListBuilder builder;
80 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello", CreateTestFont()),
81 100, 100, flutter::DlPaint(flutter::DlColor::kRed()));
83 flutter::DlPaint save_paint;
85 save_paint.setAlpha(
static_cast<uint8_t
>(255 * alpha));
86 builder.SaveLayer(std::nullopt, &save_paint);
87 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello with half alpha",
88 CreateTestFontOfSize(100)),
89 100, 300, flutter::DlPaint(flutter::DlColor::kRed()));
91 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
95 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
96 flutter::DisplayListBuilder builder;
98 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
99 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
103 flutter::DisplayListBuilder builder;
104 flutter::DlPaint paint;
106 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
107 paint.setStrokeWidth(30);
108 paint.setColor(flutter::DlColor::kRed());
110 flutter::DlPathBuilder path_builder;
111 path_builder.MoveTo(
DlPoint(-50, 0));
112 path_builder.LineTo(
DlPoint(0, -50));
113 path_builder.LineTo(
DlPoint(50, 0));
116 builder.Translate(100, 100);
118 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
119 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
120 paint.setStrokeMiter(4);
121 builder.DrawPath(path, paint);
126 builder.Translate(0, 100);
129 paint.setStrokeMiter(1);
130 builder.DrawPath(path, paint);
134 builder.Translate(150, 0);
136 paint.setStrokeCap(flutter::DlStrokeCap::kSquare);
137 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
138 builder.DrawPath(path, paint);
141 builder.Translate(150, 0);
143 paint.setStrokeCap(flutter::DlStrokeCap::kRound);
144 paint.setStrokeJoin(flutter::DlStrokeJoin::kRound);
145 builder.DrawPath(path, paint);
148 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
152 auto callback = [&]() {
153 static float start_angle = 45;
154 static float sweep_angle = 270;
156 static bool use_center =
true;
158 static int selected_cap = 0;
159 const char* cap_names[] = {
"Butt",
"Round",
"Square"};
160 flutter::DlStrokeCap cap;
162 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
163 ImGui::SliderFloat(
"Start angle", &start_angle, -360, 360);
164 ImGui::SliderFloat(
"Sweep angle", &sweep_angle, -360, 360);
165 ImGui::SliderFloat(
"Stroke width", &
stroke_width, 0, 300);
166 ImGui::Combo(
"Cap", &selected_cap, cap_names,
167 sizeof(cap_names) /
sizeof(
char*));
168 ImGui::Checkbox(
"Use center", &use_center);
171 switch (selected_cap) {
173 cap = flutter::DlStrokeCap::kButt;
176 cap = flutter::DlStrokeCap::kRound;
179 cap = flutter::DlStrokeCap::kSquare;
182 cap = flutter::DlStrokeCap::kButt;
190 flutter::DisplayListBuilder builder;
191 flutter::DlPaint paint;
195 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
196 paint.setStrokeCap(cap);
197 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
198 paint.setStrokeMiter(10);
199 auto rect = DlRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
200 paint.setColor(flutter::DlColor::kGreen());
201 paint.setStrokeWidth(2);
202 builder.DrawRect(rect, paint);
203 paint.setColor(flutter::DlColor::kRed());
205 builder.DrawArc(rect, start_angle, sweep_angle, use_center, paint);
207 return builder.Build();
209 ASSERT_TRUE(OpenPlaygroundHere(callback));
213 auto callback = [&]() {
214 flutter::DisplayListBuilder builder;
215 flutter::DlPaint paint;
217 paint.setColor(flutter::DlColor::kRed());
218 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
221 static int selected_stroke_type = 0;
222 static int selected_join_type = 0;
223 const char* stroke_types[] = {
"Butte",
"Round",
"Square"};
224 const char* join_type[] = {
"kMiter",
"Round",
"kBevel"};
226 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
227 ImGui::Combo(
"Cap", &selected_stroke_type, stroke_types,
228 sizeof(stroke_types) /
sizeof(
char*));
229 ImGui::Combo(
"Join", &selected_join_type, join_type,
230 sizeof(join_type) /
sizeof(
char*));
231 ImGui::SliderFloat(
"Stroke Width", &
stroke_width, 10.0f, 50.0f);
234 flutter::DlStrokeCap cap;
235 flutter::DlStrokeJoin join;
236 switch (selected_stroke_type) {
238 cap = flutter::DlStrokeCap::kButt;
241 cap = flutter::DlStrokeCap::kRound;
244 cap = flutter::DlStrokeCap::kSquare;
247 cap = flutter::DlStrokeCap::kButt;
250 switch (selected_join_type) {
252 join = flutter::DlStrokeJoin::kMiter;
255 join = flutter::DlStrokeJoin::kRound;
258 join = flutter::DlStrokeJoin::kBevel;
261 join = flutter::DlStrokeJoin::kMiter;
264 paint.setStrokeCap(cap);
265 paint.setStrokeJoin(join);
269 builder.Scale(1.5f, 1.5f);
272 builder.Translate(100, 100);
273 builder.DrawRect(DlRect::MakeWH(100, 100), paint);
276 builder.Translate(150, 0);
277 builder.DrawRoundRect(
278 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 10, 10), paint);
281 builder.Translate(150, 0);
282 builder.DrawDiffRoundRect(
283 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 10, 10),
284 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(10, 10, 80, 30), 10, 10),
289 builder.Translate(150, 0);
290 flutter::DlPathBuilder path_builder;
291 path_builder.MoveTo(
DlPoint(0, 0));
292 path_builder.LineTo(
DlPoint(0, 0));
293 path_builder.LineTo(
DlPoint(100, 0));
294 path_builder.LineTo(
DlPoint(100, 0));
295 path_builder.LineTo(
DlPoint(100, 100));
296 builder.DrawPath(
DlPath(path_builder), paint);
302 builder.Translate(200, 0);
306 flutter::DlPathBuilder line_path_builder;
307 line_path_builder.MoveTo(
DlPoint(0, 0));
308 line_path_builder.MoveTo(
DlPoint(0, 0));
309 line_path_builder.LineTo(
DlPoint(0, 0));
310 line_path_builder.LineTo(
DlPoint(0, 0));
311 line_path_builder.LineTo(
DlPoint(50, 50));
312 line_path_builder.LineTo(
DlPoint(50, 50));
313 line_path_builder.LineTo(
DlPoint(100, 0));
314 line_path_builder.LineTo(
DlPoint(100, 0));
315 DlPath line_path(line_path_builder);
316 builder.DrawPath(line_path, paint);
318 builder.Translate(0, 100);
319 builder.DrawPath(line_path, paint);
321 builder.Translate(0, 100);
322 flutter::DlPathBuilder line_path_builder2;
323 line_path_builder2.MoveTo(
DlPoint(0, 0));
324 line_path_builder2.LineTo(
DlPoint(0, 0));
325 line_path_builder2.LineTo(
DlPoint(0, 0));
326 builder.DrawPath(
DlPath(line_path_builder2), paint);
332 builder.Translate(150, 0);
336 flutter::DlPathBuilder cubic_path;
337 cubic_path.MoveTo(
DlPoint(0, 0));
338 cubic_path.CubicCurveTo(
DlPoint(0, 0),
341 builder.DrawPath(
DlPath(cubic_path), paint);
343 builder.Translate(0, 100);
344 flutter::DlPathBuilder cubic_path2;
345 cubic_path2.MoveTo(
DlPoint(0, 0));
346 cubic_path2.CubicCurveTo(
DlPoint(0, 0),
349 builder.DrawPath(
DlPath(cubic_path2), paint);
351 builder.Translate(0, 100);
352 flutter::DlPathBuilder cubic_path3;
353 cubic_path3.MoveTo(
DlPoint(0, 0));
354 cubic_path3.CubicCurveTo(
DlPoint(0, 0),
357 builder.DrawPath(
DlPath(cubic_path3), paint);
363 builder.Translate(200, 0);
367 flutter::DlPathBuilder quad_path;
368 quad_path.MoveTo(
DlPoint(0, 0));
369 quad_path.MoveTo(
DlPoint(0, 0));
371 builder.DrawPath(
DlPath(quad_path), paint);
373 builder.Translate(0, 150);
374 flutter::DlPathBuilder quad_path2;
375 quad_path2.MoveTo(
DlPoint(0, 0));
376 quad_path2.MoveTo(
DlPoint(0, 0));
378 builder.DrawPath(
DlPath(quad_path2), paint);
380 builder.Translate(0, 100);
381 flutter::DlPathBuilder quad_path3;
382 quad_path3.MoveTo(
DlPoint(0, 0));
384 builder.DrawPath(
DlPath(quad_path3), paint);
388 return builder.Build();
390 ASSERT_TRUE(OpenPlaygroundHere(callback));
394 flutter::DisplayListBuilder builder;
395 flutter::DlPaint paint;
397 paint.setColor(flutter::DlColor::kRed());
398 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
400 builder.Translate(300, 300);
401 flutter::DlPathBuilder path_builder;
402 path_builder.AddCircle(
DlPoint(0, 0), 100);
403 path_builder.AddCircle(
DlPoint(0, 0), 50);
404 builder.DrawPath(
DlPath(path_builder, flutter::DlPathFillType::kOdd), paint);
406 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
413 flutter::DisplayListBuilder builder;
414 flutter::DlPaint paint;
416 paint.setColor(flutter::DlColor::kRed());
417 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
418 paint.setStrokeWidth(10);
420 builder.Translate(300, 300);
426 flutter::DlPathBuilder path_builder;
427 path_builder.MoveTo(
DlPoint(50, 50));
428 path_builder.LineTo(
DlPoint(50, 100));
429 path_builder.LineTo(
DlPoint(100, 100));
430 path_builder.LineTo(
DlPoint(100, 50));
431 builder.DrawPath(
DlPath(path_builder), paint);
433 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
437 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
438 flutter::DisplayListBuilder builder;
439 flutter::DlPaint paint;
444 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
445 paint.setMaskFilter(&filter);
447 flutter::DlImageSampling::kNearestNeighbor, &paint);
452 paint.setColor(flutter::DlColor::kYellow());
454 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kOuter, 10.0f);
455 paint.setMaskFilter(&filter);
456 builder.DrawArc(DlRect::MakeXYWH(410, 110, 100, 100), 45, 270,
true, paint);
462 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kSolid, 10.0f);
463 paint.setMaskFilter(&filter);
464 builder.DrawTextBlob(
465 SkTextBlob::MakeFromString(
"Testing", CreateTestFont()), 220, 170,
469 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
473 flutter::DisplayListBuilder builder;
474 flutter::DlPaint paint;
476 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
477 paint.setColor(flutter::DlColor::kRed());
478 builder.DrawTextBlob(
479 SkTextBlob::MakeFromString(
"stoked about stroked text", CreateTestFont()),
482 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
487 flutter::DisplayListBuilder builder;
488 flutter::DlPaint paint;
489 auto const& text_blob = SkTextBlob::MakeFromString(
"00000", CreateTestFont());
492 auto const& mat_blue = flutter::DlColor(0xFF2196f3);
495 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
496 paint.setColor(mat_blue);
497 builder.DrawRect(DlRect::MakeXYWH(0, 0, 500, 500), paint);
500 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
501 paint.setColor(flutter::DlColor::kWhite());
502 builder.DrawTextBlob(text_blob, 250, 250, paint);
504 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
505 paint.setColor(flutter::DlColor::kBlack());
506 builder.DrawTextBlob(text_blob, 250, 250, paint);
508 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
512 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
513 flutter::DisplayListBuilder builder;
514 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
515 flutter::DlPaint paint;
516 paint.setMaskFilter(&filter);
517 builder.SaveLayer(std::nullopt, &paint);
519 flutter::DlImageSampling::kNearestNeighbor);
521 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
525 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
526 flutter::DisplayListBuilder builder;
527 flutter::DlPaint paint;
531 auto filter = flutter::DlColorFilter::MakeBlend(
532 flutter::DlColor::kYellow(), flutter::DlBlendMode::kModulate);
533 paint.setColorFilter(filter);
535 flutter::DlImageSampling::kNearestNeighbor, &paint);
540 auto filter = flutter::DlColorFilter::MakeBlend(
541 flutter::DlColor::kRed(), flutter::DlBlendMode::kScreen);
542 paint.setColorFilter(filter);
544 flutter::DlImageSampling::kNearestNeighbor, &paint);
547 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
551 const float invert_color_matrix[20] = {
557 auto texture = CreateTextureForFixture(
"boston.jpg");
558 flutter::DisplayListBuilder builder;
559 flutter::DlPaint paint;
561 auto color_filter = flutter::DlColorFilter::MakeMatrix(invert_color_matrix);
562 auto image_filter = flutter::DlImageFilter::MakeColorFilter(color_filter);
564 paint.setImageFilter(image_filter);
566 flutter::DlImageSampling::kNearestNeighbor, &paint);
568 builder.Translate(0, 700);
569 paint.setColorFilter(color_filter);
571 flutter::DlImageSampling::kNearestNeighbor, &paint);
572 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
576 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
578 auto callback = [&]() {
579 static float sigma[] = {10, 10};
581 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
582 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
585 flutter::DisplayListBuilder builder;
586 flutter::DlPaint paint;
588 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
589 flutter::DlTileMode::kClamp);
590 paint.setImageFilter(&filter);
592 flutter::DlImageSampling::kNearestNeighbor, &paint);
594 return builder.Build();
597 ASSERT_TRUE(OpenPlaygroundHere(callback));
601 auto texture = CreateTextureForFixture(
"boston.jpg");
602 flutter::DisplayListBuilder builder;
603 flutter::DlPaint paint;
605 auto dilate = std::make_shared<flutter::DlDilateImageFilter>(10.0, 10.0);
606 auto erode = std::make_shared<flutter::DlErodeImageFilter>(10.0, 10.0);
607 auto open = std::make_shared<flutter::DlComposeImageFilter>(dilate, erode);
608 auto close = std::make_shared<flutter::DlComposeImageFilter>(erode, dilate);
610 paint.setImageFilter(open.get());
612 flutter::DlImageSampling::kNearestNeighbor, &paint);
613 builder.Translate(0, 700);
614 paint.setImageFilter(close.get());
616 flutter::DlImageSampling::kNearestNeighbor, &paint);
617 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
621 auto texture = CreateTextureForFixture(
"boston.jpg");
622 const float inner_color_matrix[20] = {
628 const float outer_color_matrix[20] = {
634 auto inner_color_filter =
635 flutter::DlColorFilter::MakeMatrix(inner_color_matrix);
636 auto outer_color_filter =
637 flutter::DlColorFilter::MakeMatrix(outer_color_matrix);
638 auto inner = flutter::DlImageFilter::MakeColorFilter(inner_color_filter);
639 auto outer = flutter::DlImageFilter::MakeColorFilter(outer_color_filter);
640 auto compose = std::make_shared<flutter::DlComposeImageFilter>(outer, inner);
642 flutter::DisplayListBuilder builder;
643 flutter::DlPaint paint;
644 paint.setImageFilter(compose.get());
646 flutter::DlImageSampling::kNearestNeighbor, &paint);
647 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
651 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
653 auto callback = [&]() {
654 static float sigma[] = {10, 10};
655 static float ctm_scale = 1;
656 static bool use_bounds =
true;
657 static bool draw_circle =
true;
658 static bool add_clip =
true;
660 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
661 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
662 ImGui::SliderFloat(
"Scale", &ctm_scale, 0, 10);
665 "If everything is working correctly, none of the options below should "
666 "impact the filter's appearance.");
667 ImGui::Checkbox(
"Use SaveLayer bounds", &use_bounds);
668 ImGui::Checkbox(
"Draw child element", &draw_circle);
669 ImGui::Checkbox(
"Add pre-clip", &add_clip);
672 flutter::DisplayListBuilder builder;
677 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
678 flutter::DlTileMode::kClamp);
680 std::optional<DlRect> bounds;
685 bounds = DlRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
691 builder.ClipRect(DlRect::MakeLTRB(0, 0, 99999, 99999),
692 flutter::DlClipOp::kIntersect,
true);
696 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
697 builder.SaveLayer(bounds,
nullptr, &filter);
703 flutter::DlPaint paint;
704 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
705 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
706 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
707 paint.setStrokeWidth(10);
708 paint.setColor(flutter::DlColor::kRed().withAlpha(100));
709 builder.DrawCircle(
DlPoint(circle_center.x, circle_center.y), 100, paint);
712 return builder.Build();
715 ASSERT_TRUE(OpenPlaygroundHere(callback));
720 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
721 flutter::DisplayListBuilder builder;
722 auto size = texture->GetSize();
723 builder.DrawImageNine(
725 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
726 size.height * 3 / 4),
727 DlRect::MakeLTRB(0, 0, size.width * 2, size.height * 2),
728 flutter::DlFilterMode::kNearest,
nullptr);
729 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
736 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
737 flutter::DisplayListBuilder builder;
738 auto size = texture->GetSize();
739 builder.DrawImageNine(
741 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
742 size.height * 3 / 4),
743 DlRect::MakeLTRB(0, 0, size.width / 2, size.height),
744 flutter::DlFilterMode::kNearest,
nullptr);
745 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
752 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
753 flutter::DisplayListBuilder builder;
754 auto size = texture->GetSize();
755 builder.DrawImageNine(
757 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
758 size.height * 3 / 4),
759 DlRect::MakeLTRB(0, 0, size.width, size.height / 2),
760 flutter::DlFilterMode::kNearest,
nullptr);
761 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
767 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
768 flutter::DisplayListBuilder builder;
769 auto size = texture->GetSize();
770 builder.DrawImageNine(
772 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
773 size.height * 3 / 4),
774 DlRect::MakeLTRB(0, 0, size.width / 2, size.height / 2),
775 flutter::DlFilterMode::kNearest,
nullptr);
776 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
782 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
783 flutter::DisplayListBuilder builder;
784 auto size = texture->GetSize();
785 builder.DrawImageNine(
787 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
788 size.height * 3 / 4),
789 DlRect::MakeLTRB(0, 0, size.width / 4, size.height / 4),
790 flutter::DlFilterMode::kNearest,
nullptr);
791 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
797 auto texture = CreateTextureForFixture(
"nine_patch_corners.png");
798 flutter::DisplayListBuilder builder;
800 DlIRect::MakeXYWH(10, 10, 1, 1),
801 DlRect::MakeXYWH(0, 0, 200, 100),
802 flutter::DlFilterMode::kNearest,
nullptr);
803 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
807 flutter::DisplayListBuilder builder;
817 std::vector<flutter::DlStrokeCap> caps = {
818 flutter::DlStrokeCap::kButt,
819 flutter::DlStrokeCap::kRound,
820 flutter::DlStrokeCap::kSquare,
822 flutter::DlPaint paint =
824 .setColor(flutter::DlColor::kYellow().withAlpha(127))
826 builder.Translate(50, 50);
827 for (
auto cap : caps) {
828 paint.setStrokeCap(cap);
830 builder.DrawPoints(flutter::DlPointMode::kPoints, 7, points, paint);
831 builder.Translate(150, 0);
832 builder.DrawPoints(flutter::DlPointMode::kLines, 5, points, paint);
833 builder.Translate(150, 0);
834 builder.DrawPoints(flutter::DlPointMode::kPolygon, 5, points, paint);
836 builder.Translate(0, 150);
838 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
842 flutter::DisplayListBuilder builder;
843 std::vector<flutter::DlStrokeCap> caps = {
844 flutter::DlStrokeCap::kButt,
845 flutter::DlStrokeCap::kRound,
846 flutter::DlStrokeCap::kSquare,
848 flutter::DlPaint paint =
850 .setColor(flutter::DlColor::kYellow().withAlpha(127))
851 .setDrawStyle(flutter::DlDrawStyle::kStroke)
852 .setStrokeCap(flutter::DlStrokeCap::kButt)
854 DlPath path = DlPath::MakeLine({150, 50}, {150, 50});
855 for (
auto cap : caps) {
856 paint.setStrokeCap(cap);
858 builder.DrawPath(path, paint);
859 builder.Translate(0, 150);
861 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
865 flutter::DisplayListBuilder builder;
866 flutter::DlPaint paint;
868 auto content_scale = GetContentScale() * 0.8;
869 builder.Scale(content_scale.x, content_scale.y);
871 constexpr
size_t star_spikes = 5;
872 constexpr
DlScalar half_spike_rotation =
kPi / star_spikes;
875 constexpr
DlScalar outer_radius = radius + spike_size;
876 constexpr
DlScalar inner_radius = radius - spike_size;
877 std::array<DlPoint, star_spikes * 2> star;
878 for (
size_t i = 0; i < star_spikes; i++) {
879 const DlScalar rotation = half_spike_rotation * i * 2;
880 star[i * 2] =
DlPoint(50 + std::sin(rotation) * outer_radius,
881 50 - std::cos(rotation) * outer_radius);
883 DlPoint(50 + std::sin(rotation + half_spike_rotation) * inner_radius,
884 50 - std::cos(rotation + half_spike_rotation) * inner_radius);
887 std::array<DlPath, 4> paths = {
888 DlPath::MakeRect(DlRect::MakeXYWH(0, 0, 200, 100)),
889 DlPath::MakeRoundRectXY(DlRect::MakeXYWH(20, 0, 200, 100), 30, 30),
890 DlPath::MakeCircle(
DlPoint(100, 50), 50),
891 DlPath::MakePoly(star.data(), star.size(),
true),
893 paint.setColor(flutter::DlColor::kWhite());
894 builder.DrawPaint(paint);
895 paint.setColor(flutter::DlColor::kCyan());
896 builder.Translate(100, 50);
897 for (
size_t x = 0;
x < paths.size();
x++) {
899 for (
size_t y = 0; y < 6; y++) {
900 builder.DrawShadow(paths[
x], flutter::DlColor::kBlack(), 3 + y * 8,
false,
902 builder.DrawPath(paths[
x], paint);
903 builder.Translate(0, 150);
906 builder.Translate(250, 0);
909 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
913 flutter::DisplayListBuilder builder;
914 std::vector<flutter::DlStrokeCap> caps = {
915 flutter::DlStrokeCap::kButt,
916 flutter::DlStrokeCap::kRound,
917 flutter::DlStrokeCap::kSquare,
919 flutter::DlPaint paint =
921 .setColor(flutter::DlColor::kWhite())
922 .setDrawStyle(flutter::DlDrawStyle::kStroke)
924 flutter::DlPaint outline_paint =
926 .setColor(flutter::DlColor::kYellow())
927 .setDrawStyle(flutter::DlDrawStyle::kStroke)
928 .setStrokeCap(flutter::DlStrokeCap::kSquare)
930 DlPath path = DlPath::MakeLine({150, 50}, {160, 50});
931 for (
auto cap : caps) {
932 paint.setStrokeCap(cap);
934 builder.DrawRect(DlRect::MakeLTRB(45, 45, 65, 55), outline_paint);
936 if (cap != flutter::DlStrokeCap::kButt) {
937 builder.DrawRect(DlRect::MakeLTRB(95, 45, 105, 55), outline_paint);
939 builder.DrawPath(path, paint);
940 builder.DrawRect(path.GetBounds().Expand(5, 5), outline_paint);
941 builder.Translate(0, 150);
943 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
947 auto boston = CreateTextureForFixture(
"boston.jpg");
949 auto callback = [&]() {
950 static int selected_matrix_type = 0;
951 const char* matrix_type_names[] = {
"Matrix",
"Local Matrix"};
953 static float ctm_translation[2] = {200, 200};
954 static float ctm_scale[2] = {0.65, 0.65};
955 static float ctm_skew[2] = {0, 0};
957 static bool enable =
true;
958 static float translation[2] = {100, 100};
959 static float scale[2] = {0.8, 0.8};
960 static float skew[2] = {0.2, 0.2};
962 static bool enable_savelayer =
true;
964 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
966 ImGui::Combo(
"Filter type", &selected_matrix_type, matrix_type_names,
967 sizeof(matrix_type_names) /
sizeof(
char*));
969 ImGui::TextWrapped(
"Current Transform");
970 ImGui::SliderFloat2(
"CTM Translation", ctm_translation, 0, 1000);
971 ImGui::SliderFloat2(
"CTM Scale", ctm_scale, 0, 3);
972 ImGui::SliderFloat2(
"CTM Skew", ctm_skew, -3, 3);
975 "MatrixFilter and LocalMatrixFilter modify the CTM in the same way. "
976 "The only difference is that MatrixFilter doesn't affect the effect "
977 "transform, whereas LocalMatrixFilter does.");
980 ImGui::Checkbox(
"Enable", &enable);
981 ImGui::SliderFloat2(
"Filter Translation", translation, 0, 1000);
982 ImGui::SliderFloat2(
"Filter Scale",
scale, 0, 3);
983 ImGui::SliderFloat2(
"Filter Skew", skew, -3, 3);
986 "Rendering the filtered image within a layer can expose bounds "
987 "issues. If the rendered image gets cut off when this setting is "
988 "enabled, there's a coverage bug in the filter.");
989 ImGui::Checkbox(
"Render in layer", &enable_savelayer);
993 flutter::DisplayListBuilder builder;
994 flutter::DlPaint paint;
996 if (enable_savelayer) {
997 builder.SaveLayer(std::nullopt,
nullptr);
1000 auto content_scale = GetContentScale();
1001 builder.Scale(content_scale.x, content_scale.y);
1005 ctm_scale[0], ctm_skew[0], 0.0f, ctm_translation[0],
1006 ctm_skew[1], ctm_scale[1], 0.0f, ctm_translation[1],
1009 builder.Transform(ctm_matrix);
1012 auto filter_matrix =
1014 skew[1],
scale[1], 0.0f, translation[1],
1015 0.0f, 0.0f, 1.0f, 0.0f,
1016 0.0f, 0.0f, 0.0f, 1.0f);
1019 switch (selected_matrix_type) {
1021 auto filter = flutter::DlMatrixImageFilter(
1022 filter_matrix, flutter::DlImageSampling::kLinear);
1023 paint.setImageFilter(&filter);
1027 auto internal_filter =
1028 flutter::DlBlurImageFilter(10, 10, flutter::DlTileMode::kDecal)
1030 auto filter = flutter::DlLocalMatrixImageFilter(filter_matrix,
1032 paint.setImageFilter(&filter);
1039 flutter::DlImageSampling::kLinear, &paint);
1041 if (enable_savelayer) {
1045 return builder.Build();
1048 ASSERT_TRUE(OpenPlaygroundHere(callback));
1052 auto callback = [&]() {
1053 static float translation[2] = {0, 0};
1054 static bool enable_save_layer =
true;
1056 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1057 ImGui::SliderFloat2(
"Translation", translation, -130, 130);
1058 ImGui::Checkbox(
"Enable save layer", &enable_save_layer);
1061 flutter::DisplayListBuilder builder;
1063 builder.Scale(2.0, 2.0);
1064 flutter::DlPaint paint;
1065 paint.setColor(flutter::DlColor::kYellow());
1066 builder.DrawRect(DlRect::MakeWH(300, 300), paint);
1067 paint.setStrokeWidth(1.0);
1068 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1069 paint.setColor(flutter::DlColor::kBlack().withAlpha(0x80));
1073 flutter::DlPaint save_paint;
1074 DlRect bounds = DlRect::MakeXYWH(100, 100, 100, 100);
1075 Matrix translate_matrix =
1077 if (enable_save_layer) {
1078 auto filter = flutter::DlMatrixImageFilter(
1079 translate_matrix, flutter::DlImageSampling::kNearestNeighbor);
1080 save_paint.setImageFilter(filter.shared());
1081 builder.SaveLayer(bounds, &save_paint);
1084 builder.Transform(translate_matrix);
1089 filter_matrix.
Scale({0.2f, 0.2f});
1091 auto filter = flutter::DlMatrixImageFilter(
1092 filter_matrix, flutter::DlImageSampling::kNearestNeighbor);
1094 save_paint.setImageFilter(filter.shared());
1096 builder.SaveLayer(bounds, &save_paint);
1097 flutter::DlPaint paint2;
1098 paint2.setColor(flutter::DlColor::kBlue());
1099 builder.DrawRect(bounds, paint2);
1102 return builder.Build();
1105 ASSERT_TRUE(OpenPlaygroundHere(callback));
1109 flutter::DlPaint paint;
1110 paint.setColor(flutter::DlColor(0xFF2196F3).withAlpha(128));
1111 flutter::DisplayListBuilder builder;
1112 paint.setColorFilter(flutter::DlColorFilter::MakeLinearToSrgbGamma());
1113 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
1114 builder.Translate(0, 200);
1116 paint.setColorFilter(flutter::DlColorFilter::MakeSrgbToLinearGamma());
1117 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
1119 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1123 const flutter::DlColor colors[2] = {
1124 flutter::DlColor(0xFFF44336),
1125 flutter::DlColor(0xFF2196F3),
1127 const float stops[2] = {0.0, 1.0};
1128 flutter::DlPaint paint;
1129 flutter::DisplayListBuilder builder;
1130 auto clip_bounds = DlRect::MakeWH(300.0, 300.0);
1132 builder.Translate(100, 100);
1133 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1135 flutter::DlColorSource::MakeLinear({0.0, 0.0}, {100.0, 100.0}, 2, colors,
1136 stops, flutter::DlTileMode::kRepeat);
1137 paint.setColorSource(linear);
1138 builder.DrawPaint(paint);
1142 builder.Translate(500, 100);
1143 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1144 auto radial = flutter::DlColorSource::MakeRadial(
1145 {100.0, 100.0}, 100.0, 2, colors, stops, flutter::DlTileMode::kRepeat);
1146 paint.setColorSource(radial);
1147 builder.DrawPaint(paint);
1151 builder.Translate(100, 500);
1152 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1154 flutter::DlColorSource::MakeSweep({100.0, 100.0}, 180.0, 270.0, 2, colors,
1155 stops, flutter::DlTileMode::kRepeat);
1156 paint.setColorSource(sweep);
1157 builder.DrawPaint(paint);
1161 builder.Translate(500, 500);
1162 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1163 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
1165 flutter::DlTileMode::kRepeat,
1166 flutter::DlTileMode::kRepeat);
1167 paint.setColorSource(image);
1168 builder.DrawPaint(paint);
1171 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1175 flutter::DisplayListBuilder builder;
1178 builder.SaveLayer(std::nullopt,
nullptr);
1179 builder.Translate(100, 100);
1180 flutter::DlPaint paint;
1181 paint.setColor(flutter::DlColor::kRed());
1182 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1183 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1184 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
1185 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1189 builder.SaveLayer(std::nullopt,
nullptr);
1190 builder.Translate(300, 100);
1191 flutter::DlPaint paint;
1192 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1193 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1194 paint.setColor(flutter::DlColor::kRed());
1195 paint.setBlendMode(flutter::DlBlendMode::kDstOver);
1196 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1200 builder.SaveLayer(std::nullopt,
nullptr);
1201 builder.Translate(100, 300);
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::kSrc);
1207 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1211 builder.SaveLayer(std::nullopt,
nullptr);
1212 builder.Translate(300, 300);
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::kDst);
1218 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1222 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1226 flutter::DisplayListBuilder builder;
1227 const float green_color_matrix[20] = {
1233 const float blue_color_matrix[20] = {
1239 auto green_color_filter =
1240 flutter::DlColorFilter::MakeMatrix(green_color_matrix);
1241 auto blue_color_filter =
1242 flutter::DlColorFilter::MakeMatrix(blue_color_matrix);
1243 auto blue_image_filter =
1244 flutter::DlImageFilter::MakeColorFilter(blue_color_filter);
1246 flutter::DlPaint paint;
1247 paint.setColor(flutter::DlColor::kRed());
1248 paint.setColorFilter(green_color_filter);
1249 paint.setImageFilter(blue_image_filter);
1250 builder.DrawRect(DlRect::MakeLTRB(100, 100, 500, 500), paint);
1251 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1255 auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
1256 flutter::DlBlurStyle::kNormal, 10);
1258 flutter::DisplayListBuilder builder;
1260 std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
1261 flutter::DlColor::kGreen()};
1262 std::array<float, 2> stops = {0, 1};
1263 auto texture = CreateTextureForFixture(
"airplane.jpg");
1264 auto matrix = flutter::DlMatrix::MakeTranslation({-300, -110});
1265 std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
1266 flutter::DlColorSource::MakeImage(
1268 flutter::DlTileMode::kRepeat, flutter::DlImageSampling::kLinear,
1270 flutter::DlColorSource::MakeLinear(
1272 stops.data(), flutter::DlTileMode::kClamp),
1276 builder.Translate(0, 100);
1277 for (
const auto& color_source : color_sources) {
1278 flutter::DlPaint paint;
1279 paint.setColorSource(color_source);
1280 paint.setMaskFilter(blur_filter);
1283 builder.Translate(100, 0);
1284 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1285 builder.DrawRoundRect(
1286 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 30, 30), paint);
1288 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1289 paint.setStrokeWidth(10);
1290 builder.Translate(200, 0);
1291 builder.DrawRoundRect(
1292 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 30, 30), paint);
1295 builder.Translate(0, 100);
1299 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1303 flutter::DisplayListBuilder builder;
1304 std::vector<flutter::DlStrokeJoin> joins = {
1305 flutter::DlStrokeJoin::kBevel,
1306 flutter::DlStrokeJoin::kRound,
1307 flutter::DlStrokeJoin::kMiter,
1309 flutter::DlPaint paint =
1311 .setColor(flutter::DlColor::kWhite())
1312 .setDrawStyle(flutter::DlDrawStyle::kFill)
1313 .setStrokeWidth(10);
1314 flutter::DlPaint stroke_paint =
1316 .setColor(flutter::DlColor::kWhite())
1317 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1318 .setStrokeWidth(10);
1319 DlPath path = DlPath::MakeLine({150, 50}, {160, 50});
1321 builder.Translate(300, 50);
1322 builder.Scale(0.8, 0.8);
1323 for (
auto join : joins) {
1324 paint.setStrokeJoin(join);
1325 stroke_paint.setStrokeJoin(join);
1326 builder.DrawRect(DlRect::MakeXYWH(0, 0, 100, 100), paint);
1327 builder.DrawRect(DlRect::MakeXYWH(0, 150, 100, 100), stroke_paint);
1328 builder.DrawRoundRect(
1329 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(150, 0, 100, 100), 30, 30),
1331 builder.DrawRoundRect(
1332 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(150, 150, 100, 100), 30, 30),
1334 builder.DrawCircle(
DlPoint(350, 50), 50, paint);
1335 builder.DrawCircle(
DlPoint(350, 200), 50, stroke_paint);
1336 builder.Translate(0, 300);
1338 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1342 flutter::DisplayListBuilder builder;
1344 flutter::DlPaint fill_paint =
1346 .setColor(flutter::DlColor::kBlue())
1347 .setDrawStyle(flutter::DlDrawStyle::kFill)
1348 .setStrokeWidth(10);
1349 flutter::DlPaint stroke_paint =
1351 .setColor(flutter::DlColor::kGreen())
1352 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1353 .setStrokeWidth(10);
1355 builder.DrawRoundRect(
1356 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1358 builder.DrawRoundRect(
1359 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1362 builder.DrawRoundRect(
1363 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1365 builder.DrawRoundRect(
1366 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1369 flutter::DlPaint reference_paint =
1371 .setColor(flutter::DlColor::kMidGrey())
1372 .setDrawStyle(flutter::DlDrawStyle::kFill)
1373 .setStrokeWidth(10);
1375 builder.DrawRoundRect(
1376 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 500, 300, 300), 40, 40),
1378 builder.DrawRoundRect(
1379 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 100, 300, 300), 120, 120),
1382 flutter::DlPaint clip_fill_paint =
1384 .setColor(flutter::DlColor::kCyan())
1385 .setDrawStyle(flutter::DlDrawStyle::kFill)
1386 .setStrokeWidth(10);
1389 builder.ClipRoundRect(
1390 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(900, 100, 300, 300), 120, 40));
1391 builder.DrawPaint(clip_fill_paint);
1395 builder.ClipRoundRect(
1396 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 900, 300, 300), 40, 120));
1397 builder.DrawPaint(clip_fill_paint);
1400 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1404 std::vector<const char*> blend_mode_names;
1405 std::vector<flutter::DlBlendMode> blend_mode_values;
1407 const std::vector<std::tuple<const char*, flutter::DlBlendMode>> blends = {
1409 {
"Clear", flutter::DlBlendMode::kClear},
1410 {
"Source", flutter::DlBlendMode::kSrc},
1411 {
"Destination", flutter::DlBlendMode::kDst},
1412 {
"SourceOver", flutter::DlBlendMode::kSrcOver},
1413 {
"DestinationOver", flutter::DlBlendMode::kDstOver},
1414 {
"SourceIn", flutter::DlBlendMode::kSrcIn},
1415 {
"DestinationIn", flutter::DlBlendMode::kDstIn},
1416 {
"SourceOut", flutter::DlBlendMode::kSrcOut},
1417 {
"DestinationOut", flutter::DlBlendMode::kDstOut},
1418 {
"SourceATop", flutter::DlBlendMode::kSrcATop},
1419 {
"DestinationATop", flutter::DlBlendMode::kDstATop},
1420 {
"Xor", flutter::DlBlendMode::kXor},
1421 {
"Plus", flutter::DlBlendMode::kPlus},
1422 {
"Modulate", flutter::DlBlendMode::kModulate},
1424 {
"Screen", flutter::DlBlendMode::kScreen},
1425 {
"Overlay", flutter::DlBlendMode::kOverlay},
1426 {
"Darken", flutter::DlBlendMode::kDarken},
1427 {
"Lighten", flutter::DlBlendMode::kLighten},
1428 {
"ColorDodge", flutter::DlBlendMode::kColorDodge},
1429 {
"ColorBurn", flutter::DlBlendMode::kColorBurn},
1430 {
"HardLight", flutter::DlBlendMode::kHardLight},
1431 {
"SoftLight", flutter::DlBlendMode::kSoftLight},
1432 {
"Difference", flutter::DlBlendMode::kDifference},
1433 {
"Exclusion", flutter::DlBlendMode::kExclusion},
1434 {
"Multiply", flutter::DlBlendMode::kMultiply},
1435 {
"Hue", flutter::DlBlendMode::kHue},
1436 {
"Saturation", flutter::DlBlendMode::kSaturation},
1437 {
"Color", flutter::DlBlendMode::kColor},
1438 {
"Luminosity", flutter::DlBlendMode::kLuminosity},
1440 assert(blends.size() ==
1441 static_cast<size_t>(flutter::DlBlendMode::kLastMode) + 1);
1442 for (
const auto& [name, mode] : blends) {
1443 blend_mode_names.push_back(name);
1444 blend_mode_values.push_back(mode);
1448 auto callback = [&]() {
1449 static int current_blend_index = 3;
1450 static float dst_alpha = 1;
1451 static float src_alpha = 1;
1452 static float color0[4] = {1.0f, 0.0f, 0.0f, 1.0f};
1453 static float color1[4] = {0.0f, 1.0f, 0.0f, 1.0f};
1454 static float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
1455 static float src_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1457 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1459 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
1460 blend_mode_names.data(), blend_mode_names.size());
1461 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
1462 ImGui::ColorEdit4(
"Color A", color0);
1463 ImGui::ColorEdit4(
"Color B", color1);
1464 ImGui::ColorEdit4(
"Color C", color2);
1465 ImGui::ColorEdit4(
"Source Color", src_color);
1466 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
1470 std::vector<DlPoint> positions = {
DlPoint(100, 300),
1473 std::vector<flutter::DlColor> colors = {
1474 toColor(color0).modulateOpacity(dst_alpha),
1475 toColor(color1).modulateOpacity(dst_alpha),
1476 toColor(color2).modulateOpacity(dst_alpha)};
1478 auto vertices = flutter::DlVertices::Make(
1479 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1480 nullptr, colors.data());
1482 flutter::DisplayListBuilder builder;
1483 flutter::DlPaint paint;
1485 paint.setColor(
toColor(src_color).modulateOpacity(src_alpha));
1486 builder.DrawVertices(vertices, blend_mode_values[current_blend_index],
1488 return builder.Build();
1491 ASSERT_TRUE(OpenPlaygroundHere(callback));
1495 flutter::DisplayListBuilder builder;
1496 builder.DrawPaint(flutter::DlPaint().setColor(flutter::DlColor::kWhite()));
1498 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
1499 builder.DrawCircle(
DlPoint(300, 300), 200,
1500 flutter::DlPaint().setMaskFilter(&filter));
1502 std::vector<flutter::DlColor> colors = {flutter::DlColor::kGreen(),
1503 flutter::DlColor::kGreen()};
1504 const float stops[2] = {0.0, 1.0};
1505 auto linear = flutter::DlColorSource::MakeLinear(
1506 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
1507 flutter::DlTileMode::kRepeat);
1508 flutter::DlPaint blend_paint =
1510 .setColorSource(linear)
1511 .setBlendMode(flutter::DlBlendMode::kScreen);
1512 builder.DrawPaint(blend_paint);
1514 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1518 flutter::DisplayListBuilder builder;
1519 builder.DrawColor(flutter::DlColor::kWhite(), flutter::DlBlendMode::kSrc);
1525 builder.Translate(1.0f, 1.0f);
1527 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kSolid, 5.0f);
1528 flutter::DlPaint solid_alpha_paint =
1530 .setMaskFilter(solid_filter)
1531 .setColor(flutter::DlColor::kBlue())
1533 for (
int x = 1;
x <= 4;
x++) {
1534 for (
int y = 1; y <= 4; y++) {
1535 builder.DrawRect(DlRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1542 builder.Translate(500.0f, 0.0f);
1543 auto normal_filter =
1544 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kNormal, 5.0f);
1545 auto rotate_if = flutter::DlMatrixImageFilter::Make(
1547 flutter::DlPaint normal_if_paint =
1549 .setMaskFilter(solid_filter)
1550 .setImageFilter(rotate_if)
1551 .setColor(flutter::DlColor::kGreen())
1553 for (
int x = 1;
x <= 4;
x++) {
1554 for (
int y = 1; y <= 4; y++) {
1555 builder.DrawRect(DlRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1561 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
const Scalar stroke_width
static constexpr 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)