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_filter.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"
33 #include "third_party/skia/include/core/SkBlurTypes.h"
34 #include "third_party/skia/include/core/SkClipOp.h"
35 #include "third_party/skia/include/core/SkPathBuilder.h"
36 #include "third_party/skia/include/core/SkRRect.h"
41 flutter::DlColor
toColor(
const float* components) {
43 Color(components[0], components[1], components[2], components[3])));
50 flutter::DisplayListBuilder builder;
51 builder.DrawRect(SkRect::MakeXYWH(10, 10, 100, 100),
52 flutter::DlPaint(flutter::DlColor::kBlue()));
53 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
57 flutter::DisplayListBuilder builder;
58 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello", CreateTestFont()),
59 100, 100, flutter::DlPaint(flutter::DlColor::kBlue()));
60 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
64 flutter::DisplayListBuilder builder;
66 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
67 flutter::DlColor::kRed()};
68 const float stops[2] = {0.0, 1.0};
70 auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {300.0, 300.0},
71 2, colors.data(), stops,
72 flutter::DlTileMode::kClamp);
73 flutter::DlPaint paint;
74 paint.setColorSource(linear);
77 SkTextBlob::MakeFromString(
"Hello World", CreateTestFont()), 100, 100,
79 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
83 flutter::DisplayListBuilder builder;
84 builder.DrawTextBlob(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(
nullptr, &save_paint);
91 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello with half alpha",
92 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());
115 SkPathBuilder{}.moveTo(-50, 0).lineTo(0, -50).lineTo(50, 0).snapshot();
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;
157 static bool use_center =
true;
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*));
169 ImGui::Checkbox(
"Use center", &use_center);
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;
196 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
197 paint.setStrokeCap(cap);
198 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
199 paint.setStrokeMiter(10);
200 auto rect = SkRect::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());
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);
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);
270 builder.Scale(1.5f, 1.5f);
273 builder.Translate(100, 100);
274 builder.DrawRect(SkRect::MakeSize({100, 100}), paint);
277 builder.Translate(150, 0);
278 builder.DrawRRect(SkRRect::MakeRectXY(SkRect::MakeSize({100, 50}), 10, 10),
282 builder.Translate(150, 0);
284 SkRRect::MakeRectXY(SkRect::MakeSize({100, 50}), 10, 10),
285 SkRRect::MakeRectXY(SkRect::MakeXYWH(10, 10, 80, 30), 10, 10), paint);
289 builder.Translate(150, 0);
293 path.lineTo({100, 0});
294 path.lineTo({100, 0});
295 path.lineTo({100, 100});
296 builder.DrawPath(path, paint);
302 builder.Translate(200, 0);
307 line_path.moveTo(0, 0);
308 line_path.moveTo(0, 0);
309 line_path.lineTo({0, 0});
310 line_path.lineTo({0, 0});
311 line_path.lineTo({50, 50});
312 line_path.lineTo({50, 50});
313 line_path.lineTo({100, 0});
314 line_path.lineTo({100, 0});
315 builder.DrawPath(line_path, paint);
317 builder.Translate(0, 100);
318 builder.DrawPath(line_path, paint);
320 builder.Translate(0, 100);
322 line_path2.moveTo(0, 0);
323 line_path2.lineTo(0, 0);
324 line_path2.lineTo(0, 0);
325 builder.DrawPath(line_path2, paint);
331 builder.Translate(150, 0);
336 cubic_path.moveTo({0, 0});
337 cubic_path.cubicTo(0, 0, 140.0, 100.0, 140, 20);
338 builder.DrawPath(cubic_path, paint);
340 builder.Translate(0, 100);
342 cubic_path2.moveTo({0, 0});
343 cubic_path2.cubicTo(0, 0, 0, 0, 150, 150);
344 builder.DrawPath(cubic_path2, paint);
346 builder.Translate(0, 100);
348 cubic_path3.moveTo({0, 0});
349 cubic_path3.cubicTo(0, 0, 0, 0, 0, 0);
350 builder.DrawPath(cubic_path3, paint);
356 builder.Translate(200, 0);
361 quad_path.moveTo(0, 0);
362 quad_path.moveTo(0, 0);
363 quad_path.quadTo({100, 40}, {50, 80});
364 builder.DrawPath(quad_path, paint);
366 builder.Translate(0, 150);
368 quad_path2.moveTo(0, 0);
369 quad_path2.moveTo(0, 0);
370 quad_path2.quadTo({0, 0}, {100, 100});
371 builder.DrawPath(quad_path2, paint);
373 builder.Translate(0, 100);
375 quad_path3.moveTo(0, 0);
376 quad_path3.quadTo({0, 0}, {0, 0});
377 builder.DrawPath(quad_path3, paint);
381 return builder.Build();
383 ASSERT_TRUE(OpenPlaygroundHere(callback));
387 flutter::DisplayListBuilder builder;
388 flutter::DlPaint paint;
390 paint.setColor(flutter::DlColor::kRed());
391 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
393 builder.Translate(300, 300);
395 path.setFillType(SkPathFillType::kEvenOdd);
396 path.addCircle(0, 0, 100);
397 path.addCircle(0, 0, 50);
398 builder.DrawPath(path, paint);
400 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
407 flutter::DisplayListBuilder builder;
408 flutter::DlPaint paint;
410 paint.setColor(flutter::DlColor::kRed());
411 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
412 paint.setStrokeWidth(10);
414 builder.Translate(300, 300);
422 path.lineTo(50, 100);
423 path.lineTo(100, 100);
424 path.lineTo(100, 50);
425 builder.DrawPath(path, paint);
427 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
431 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
432 flutter::DisplayListBuilder builder;
433 flutter::DlPaint paint;
438 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
439 paint.setMaskFilter(&filter);
441 flutter::DlImageSampling::kNearestNeighbor, &paint);
446 paint.setColor(flutter::DlColor::kYellow());
448 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kOuter, 10.0f);
449 paint.setMaskFilter(&filter);
450 builder.DrawArc(SkRect::MakeXYWH(410, 110, 100, 100), 45, 270,
true, paint);
456 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kSolid, 10.0f);
457 paint.setMaskFilter(&filter);
458 builder.DrawTextBlob(
459 SkTextBlob::MakeFromString(
"Testing", CreateTestFont()), 220, 170,
463 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
467 flutter::DisplayListBuilder builder;
468 flutter::DlPaint paint;
470 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
471 paint.setColor(flutter::DlColor::kRed());
472 builder.DrawTextBlob(
473 SkTextBlob::MakeFromString(
"stoked about stroked text", CreateTestFont()),
476 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
481 flutter::DisplayListBuilder builder;
482 flutter::DlPaint paint;
483 auto const& text_blob = SkTextBlob::MakeFromString(
"00000", CreateTestFont());
486 auto const& mat_blue = flutter::DlColor(0xFF2196f3);
489 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
490 paint.setColor(mat_blue);
491 builder.DrawRect(SkRect::MakeXYWH(0, 0, 500, 500), paint);
494 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
495 paint.setColor(flutter::DlColor::kWhite());
496 builder.DrawTextBlob(text_blob, 250, 250, paint);
498 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
499 paint.setColor(flutter::DlColor::kBlack());
500 builder.DrawTextBlob(text_blob, 250, 250, paint);
502 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
506 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
507 flutter::DisplayListBuilder builder;
508 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
509 flutter::DlPaint paint;
510 paint.setMaskFilter(&filter);
511 builder.SaveLayer(
nullptr, &paint);
513 flutter::DlImageSampling::kNearestNeighbor);
515 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
519 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
520 flutter::DisplayListBuilder builder;
521 flutter::DlPaint paint;
525 auto filter = flutter::DlBlendColorFilter(flutter::DlColor::kYellow(),
526 flutter::DlBlendMode::kModulate);
527 paint.setColorFilter(&filter);
529 flutter::DlImageSampling::kNearestNeighbor, &paint);
534 auto filter = flutter::DlBlendColorFilter(flutter::DlColor::kRed(),
535 flutter::DlBlendMode::kScreen);
536 paint.setColorFilter(&filter);
538 flutter::DlImageSampling::kNearestNeighbor, &paint);
541 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
545 const float invert_color_matrix[20] = {
551 auto texture = CreateTextureForFixture(
"boston.jpg");
552 flutter::DisplayListBuilder builder;
553 flutter::DlPaint paint;
556 std::make_shared<flutter::DlMatrixColorFilter>(invert_color_matrix);
558 std::make_shared<flutter::DlColorFilterImageFilter>(color_filter);
560 paint.setImageFilter(image_filter.get());
562 flutter::DlImageSampling::kNearestNeighbor, &paint);
564 builder.Translate(0, 700);
565 paint.setColorFilter(color_filter.get());
567 flutter::DlImageSampling::kNearestNeighbor, &paint);
568 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
572 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
574 auto callback = [&]() {
575 static float sigma[] = {10, 10};
577 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
578 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
581 flutter::DisplayListBuilder builder;
582 flutter::DlPaint paint;
584 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
585 flutter::DlTileMode::kClamp);
586 paint.setImageFilter(&filter);
588 flutter::DlImageSampling::kNearestNeighbor, &paint);
590 return builder.Build();
593 ASSERT_TRUE(OpenPlaygroundHere(callback));
597 auto texture = CreateTextureForFixture(
"boston.jpg");
598 flutter::DisplayListBuilder builder;
599 flutter::DlPaint paint;
601 auto dilate = std::make_shared<flutter::DlDilateImageFilter>(10.0, 10.0);
602 auto erode = std::make_shared<flutter::DlErodeImageFilter>(10.0, 10.0);
603 auto open = std::make_shared<flutter::DlComposeImageFilter>(dilate, erode);
604 auto close = std::make_shared<flutter::DlComposeImageFilter>(erode, dilate);
606 paint.setImageFilter(open.get());
608 flutter::DlImageSampling::kNearestNeighbor, &paint);
609 builder.Translate(0, 700);
610 paint.setImageFilter(close.get());
612 flutter::DlImageSampling::kNearestNeighbor, &paint);
613 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
617 auto texture = CreateTextureForFixture(
"boston.jpg");
618 const float inner_color_matrix[20] = {
624 const float outer_color_matrix[20] = {
630 auto inner_color_filter =
631 std::make_shared<flutter::DlMatrixColorFilter>(inner_color_matrix);
632 auto outer_color_filter =
633 std::make_shared<flutter::DlMatrixColorFilter>(outer_color_matrix);
635 std::make_shared<flutter::DlColorFilterImageFilter>(inner_color_filter);
637 std::make_shared<flutter::DlColorFilterImageFilter>(outer_color_filter);
638 auto compose = std::make_shared<flutter::DlComposeImageFilter>(outer, inner);
640 flutter::DisplayListBuilder builder;
641 flutter::DlPaint paint;
642 paint.setImageFilter(compose.get());
644 flutter::DlImageSampling::kNearestNeighbor, &paint);
645 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
649 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
651 auto callback = [&]() {
652 static float sigma[] = {10, 10};
653 static float ctm_scale = 1;
654 static bool use_bounds =
true;
655 static bool draw_circle =
true;
656 static bool add_clip =
true;
658 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
659 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
660 ImGui::SliderFloat(
"Scale", &ctm_scale, 0, 10);
663 "If everything is working correctly, none of the options below should "
664 "impact the filter's appearance.");
665 ImGui::Checkbox(
"Use SaveLayer bounds", &use_bounds);
666 ImGui::Checkbox(
"Draw child element", &draw_circle);
667 ImGui::Checkbox(
"Add pre-clip", &add_clip);
670 flutter::DisplayListBuilder builder;
675 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
676 flutter::DlTileMode::kClamp);
678 std::optional<SkRect> bounds;
683 bounds = SkRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
689 builder.ClipRect(SkRect::MakeLTRB(0, 0, 99999, 99999),
690 flutter::DlCanvas::ClipOp::kIntersect,
true);
694 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
695 builder.SaveLayer(bounds.has_value() ? &bounds.value() :
nullptr,
nullptr,
702 flutter::DlPaint paint;
703 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
704 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
705 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
706 paint.setStrokeWidth(10);
707 paint.setColor(flutter::DlColor::kRed().withAlpha(100));
708 builder.DrawCircle({circle_center.x, circle_center.y}, 100, paint);
711 return builder.Build();
714 ASSERT_TRUE(OpenPlaygroundHere(callback));
719 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
720 flutter::DisplayListBuilder builder;
721 auto size = texture->GetSize();
722 builder.DrawImageNine(
724 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
725 size.height * 3 / 4),
726 SkRect::MakeLTRB(0, 0, size.width * 2, size.height * 2),
727 flutter::DlFilterMode::kNearest,
nullptr);
728 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
735 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
736 flutter::DisplayListBuilder builder;
737 auto size = texture->GetSize();
738 builder.DrawImageNine(
740 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
741 size.height * 3 / 4),
742 SkRect::MakeLTRB(0, 0, size.width / 2, size.height),
743 flutter::DlFilterMode::kNearest,
nullptr);
744 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
751 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
752 flutter::DisplayListBuilder builder;
753 auto size = texture->GetSize();
754 builder.DrawImageNine(
756 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
757 size.height * 3 / 4),
758 SkRect::MakeLTRB(0, 0, size.width, size.height / 2),
759 flutter::DlFilterMode::kNearest,
nullptr);
760 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
766 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
767 flutter::DisplayListBuilder builder;
768 auto size = texture->GetSize();
769 builder.DrawImageNine(
771 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
772 size.height * 3 / 4),
773 SkRect::MakeLTRB(0, 0, size.width / 2, size.height / 2),
774 flutter::DlFilterMode::kNearest,
nullptr);
775 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
781 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
782 flutter::DisplayListBuilder builder;
783 auto size = texture->GetSize();
784 builder.DrawImageNine(
786 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
787 size.height * 3 / 4),
788 SkRect::MakeLTRB(0, 0, size.width / 4, size.height / 4),
789 flutter::DlFilterMode::kNearest,
nullptr);
790 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
796 auto texture = CreateTextureForFixture(
"nine_patch_corners.png");
797 flutter::DisplayListBuilder builder;
799 SkIRect::MakeXYWH(10, 10, 1, 1),
800 SkRect::MakeXYWH(0, 0, 200, 100),
801 flutter::DlFilterMode::kNearest,
nullptr);
802 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
806 flutter::DisplayListBuilder builder;
807 SkPoint points[7] = {
816 std::vector<flutter::DlStrokeCap> caps = {
817 flutter::DlStrokeCap::kButt,
818 flutter::DlStrokeCap::kRound,
819 flutter::DlStrokeCap::kSquare,
821 flutter::DlPaint paint =
823 .setColor(flutter::DlColor::kYellow().withAlpha(127))
825 builder.Translate(50, 50);
826 for (
auto cap : caps) {
827 paint.setStrokeCap(cap);
829 builder.DrawPoints(flutter::DlCanvas::PointMode::kPoints, 7, points, paint);
830 builder.Translate(150, 0);
831 builder.DrawPoints(flutter::DlCanvas::PointMode::kLines, 5, points, paint);
832 builder.Translate(150, 0);
833 builder.DrawPoints(flutter::DlCanvas::PointMode::kPolygon, 5, points,
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 SkPath path = SkPath().addPoly({{150, 50}, {150, 50}},
false);
855 for (
auto cap : caps) {
856 paint.setStrokeCap(cap);
857 builder.DrawLine({50, 50}, {50, 50}, paint);
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 SkScalar half_spike_rotation =
kPi / star_spikes;
873 constexpr SkScalar radius = 40;
874 constexpr SkScalar spike_size = 10;
875 constexpr SkScalar outer_radius = radius + spike_size;
876 constexpr SkScalar inner_radius = radius - spike_size;
877 std::array<SkPoint, star_spikes * 2> star;
878 for (
size_t i = 0; i < star_spikes; i++) {
879 const SkScalar rotation = half_spike_rotation * i * 2;
880 star[i * 2] = SkPoint::Make(50 + std::sin(rotation) * outer_radius,
881 50 - std::cos(rotation) * outer_radius);
882 star[i * 2 + 1] = SkPoint::Make(
883 50 + std::sin(rotation + half_spike_rotation) * inner_radius,
884 50 - std::cos(rotation + half_spike_rotation) * inner_radius);
887 std::array<SkPath, 4> paths = {
888 SkPath{}.addRect(SkRect::MakeXYWH(0, 0, 200, 100)),
890 SkRRect::MakeRectXY(SkRect::MakeXYWH(20, 0, 200, 100), 30, 30)),
891 SkPath{}.addCircle(100, 50, 50),
892 SkPath{}.addPoly(star.data(), star.size(),
true),
894 paint.setColor(flutter::DlColor::kWhite());
895 builder.DrawPaint(paint);
896 paint.setColor(flutter::DlColor::kCyan());
897 builder.Translate(100, 50);
898 for (
size_t x = 0; x < paths.size(); x++) {
900 for (
size_t y = 0; y < 6; y++) {
901 builder.DrawShadow(paths[x], flutter::DlColor::kBlack(), 3 + y * 8,
false,
903 builder.DrawPath(paths[x], paint);
904 builder.Translate(0, 150);
907 builder.Translate(250, 0);
910 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
914 flutter::DisplayListBuilder builder;
915 std::vector<flutter::DlStrokeCap> caps = {
916 flutter::DlStrokeCap::kButt,
917 flutter::DlStrokeCap::kRound,
918 flutter::DlStrokeCap::kSquare,
920 flutter::DlPaint paint =
922 .setColor(flutter::DlColor::kWhite())
923 .setDrawStyle(flutter::DlDrawStyle::kStroke)
925 flutter::DlPaint outline_paint =
927 .setColor(flutter::DlColor::kYellow())
928 .setDrawStyle(flutter::DlDrawStyle::kStroke)
929 .setStrokeCap(flutter::DlStrokeCap::kSquare)
931 SkPath path = SkPath().addPoly({{150, 50}, {160, 50}},
false);
932 for (
auto cap : caps) {
933 paint.setStrokeCap(cap);
934 builder.DrawLine({50, 50}, {60, 50}, paint);
935 builder.DrawRect({45, 45, 65, 55}, outline_paint);
936 builder.DrawLine({100, 50}, {100, 50}, paint);
937 if (cap != flutter::DlStrokeCap::kButt) {
938 builder.DrawRect({95, 45, 105, 55}, outline_paint);
940 builder.DrawPath(path, paint);
941 builder.DrawRect(path.getBounds().makeOutset(5, 5), outline_paint);
942 builder.Translate(0, 150);
944 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
948 auto boston = CreateTextureForFixture(
"boston.jpg");
950 auto callback = [&]() {
951 static int selected_matrix_type = 0;
952 const char* matrix_type_names[] = {
"Matrix",
"Local Matrix"};
954 static float ctm_translation[2] = {200, 200};
955 static float ctm_scale[2] = {0.65, 0.65};
956 static float ctm_skew[2] = {0, 0};
958 static bool enable =
true;
959 static float translation[2] = {100, 100};
960 static float scale[2] = {0.8, 0.8};
961 static float skew[2] = {0.2, 0.2};
963 static bool enable_savelayer =
true;
965 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
967 ImGui::Combo(
"Filter type", &selected_matrix_type, matrix_type_names,
968 sizeof(matrix_type_names) /
sizeof(
char*));
970 ImGui::TextWrapped(
"Current Transform");
971 ImGui::SliderFloat2(
"CTM Translation", ctm_translation, 0, 1000);
972 ImGui::SliderFloat2(
"CTM Scale", ctm_scale, 0, 3);
973 ImGui::SliderFloat2(
"CTM Skew", ctm_skew, -3, 3);
976 "MatrixFilter and LocalMatrixFilter modify the CTM in the same way. "
977 "The only difference is that MatrixFilter doesn't affect the effect "
978 "transform, whereas LocalMatrixFilter does.");
981 ImGui::Checkbox(
"Enable", &enable);
982 ImGui::SliderFloat2(
"Filter Translation", translation, 0, 1000);
983 ImGui::SliderFloat2(
"Filter Scale",
scale, 0, 3);
984 ImGui::SliderFloat2(
"Filter Skew", skew, -3, 3);
987 "Rendering the filtered image within a layer can expose bounds "
988 "issues. If the rendered image gets cut off when this setting is "
989 "enabled, there's a coverage bug in the filter.");
990 ImGui::Checkbox(
"Render in layer", &enable_savelayer);
994 flutter::DisplayListBuilder builder;
995 flutter::DlPaint paint;
997 if (enable_savelayer) {
998 builder.SaveLayer(
nullptr,
nullptr);
1001 auto content_scale = GetContentScale();
1002 builder.Scale(content_scale.x, content_scale.y);
1006 SkMatrix::MakeAll(ctm_scale[0], ctm_skew[0], ctm_translation[0],
1007 ctm_skew[1], ctm_scale[1], ctm_translation[1],
1009 builder.Transform(ctm_matrix);
1012 auto filter_matrix =
1013 SkMatrix::MakeAll(
scale[0], skew[0], translation[0],
1014 skew[1],
scale[1], translation[1],
1018 switch (selected_matrix_type) {
1020 auto filter = flutter::DlMatrixImageFilter(
1021 filter_matrix, flutter::DlImageSampling::kLinear);
1022 paint.setImageFilter(&filter);
1026 auto internal_filter =
1027 flutter::DlBlurImageFilter(10, 10, flutter::DlTileMode::kDecal)
1029 auto filter = flutter::DlLocalMatrixImageFilter(filter_matrix,
1031 paint.setImageFilter(&filter);
1038 flutter::DlImageSampling::kLinear, &paint);
1040 if (enable_savelayer) {
1044 return builder.Build();
1047 ASSERT_TRUE(OpenPlaygroundHere(callback));
1051 auto callback = [&]() {
1052 static float translation[2] = {0, 0};
1053 static bool enable_save_layer =
true;
1055 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1056 ImGui::SliderFloat2(
"Translation", translation, -130, 130);
1057 ImGui::Checkbox(
"Enable save layer", &enable_save_layer);
1060 flutter::DisplayListBuilder builder;
1062 builder.Scale(2.0, 2.0);
1063 flutter::DlPaint paint;
1064 paint.setColor(flutter::DlColor::kYellow());
1065 builder.DrawRect(SkRect::MakeWH(300, 300), paint);
1066 paint.setStrokeWidth(1.0);
1067 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1068 paint.setColor(flutter::DlColor::kBlack().withAlpha(0x80));
1069 builder.DrawLine(SkPoint::Make(150, 0), SkPoint::Make(150, 300), paint);
1070 builder.DrawLine(SkPoint::Make(0, 150), SkPoint::Make(300, 150), paint);
1072 flutter::DlPaint save_paint;
1073 SkRect bounds = SkRect::MakeXYWH(100, 100, 100, 100);
1074 SkMatrix translate_matrix =
1075 SkMatrix::Translate(translation[0], translation[1]);
1076 if (enable_save_layer) {
1077 auto filter = flutter::DlMatrixImageFilter(
1078 translate_matrix, flutter::DlImageSampling::kNearestNeighbor);
1079 save_paint.setImageFilter(filter.shared());
1080 builder.SaveLayer(&bounds, &save_paint);
1083 builder.Transform(translate_matrix);
1086 SkMatrix filter_matrix = SkMatrix::I();
1087 filter_matrix.postTranslate(-150, -150);
1088 filter_matrix.postScale(0.2f, 0.2f);
1089 filter_matrix.postTranslate(150, 150);
1090 auto filter = flutter::DlMatrixImageFilter(
1091 filter_matrix, flutter::DlImageSampling::kNearestNeighbor);
1093 save_paint.setImageFilter(filter.shared());
1095 builder.SaveLayer(&bounds, &save_paint);
1096 flutter::DlPaint paint2;
1097 paint2.setColor(flutter::DlColor::kBlue());
1098 builder.DrawRect(bounds, paint2);
1101 return builder.Build();
1104 ASSERT_TRUE(OpenPlaygroundHere(callback));
1108 flutter::DlPaint paint;
1109 paint.setColor(flutter::DlColor(0xFF2196F3).withAlpha(128));
1110 flutter::DisplayListBuilder builder;
1111 paint.setColorFilter(
1112 flutter::DlLinearToSrgbGammaColorFilter::kInstance.get());
1113 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint);
1114 builder.Translate(0, 200);
1116 paint.setColorFilter(
1117 flutter::DlSrgbToLinearGammaColorFilter::kInstance.get());
1118 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint);
1120 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1124 const flutter::DlColor colors[2] = {
1125 flutter::DlColor(0xFFF44336),
1126 flutter::DlColor(0xFF2196F3),
1128 const float stops[2] = {0.0, 1.0};
1129 flutter::DlPaint paint;
1130 flutter::DisplayListBuilder builder;
1131 auto clip_bounds = SkRect::MakeWH(300.0, 300.0);
1133 builder.Translate(100, 100);
1134 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1136 flutter::DlColorSource::MakeLinear({0.0, 0.0}, {100.0, 100.0}, 2, colors,
1137 stops, flutter::DlTileMode::kRepeat);
1138 paint.setColorSource(linear);
1139 builder.DrawPaint(paint);
1143 builder.Translate(500, 100);
1144 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1145 auto radial = flutter::DlColorSource::MakeRadial(
1146 {100.0, 100.0}, 100.0, 2, colors, stops, flutter::DlTileMode::kRepeat);
1147 paint.setColorSource(radial);
1148 builder.DrawPaint(paint);
1152 builder.Translate(100, 500);
1153 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1155 flutter::DlColorSource::MakeSweep({100.0, 100.0}, 180.0, 270.0, 2, colors,
1156 stops, flutter::DlTileMode::kRepeat);
1157 paint.setColorSource(sweep);
1158 builder.DrawPaint(paint);
1162 builder.Translate(500, 500);
1163 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1164 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
1165 auto image = std::make_shared<flutter::DlImageColorSource>(
1167 flutter::DlTileMode::kRepeat);
1168 paint.setColorSource(image);
1169 builder.DrawPaint(paint);
1172 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1176 flutter::DisplayListBuilder builder;
1179 builder.SaveLayer(
nullptr,
nullptr);
1180 builder.Translate(100, 100);
1181 flutter::DlPaint paint;
1182 paint.setColor(flutter::DlColor::kRed());
1183 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1184 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1185 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
1186 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1190 builder.SaveLayer(
nullptr,
nullptr);
1191 builder.Translate(300, 100);
1192 flutter::DlPaint paint;
1193 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1194 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1195 paint.setColor(flutter::DlColor::kRed());
1196 paint.setBlendMode(flutter::DlBlendMode::kDstOver);
1197 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1201 builder.SaveLayer(
nullptr,
nullptr);
1202 builder.Translate(100, 300);
1203 flutter::DlPaint paint;
1204 paint.setColor(flutter::DlColor::kRed());
1205 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1206 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1207 paint.setBlendMode(flutter::DlBlendMode::kSrc);
1208 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1212 builder.SaveLayer(
nullptr,
nullptr);
1213 builder.Translate(300, 300);
1214 flutter::DlPaint paint;
1215 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1216 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1217 paint.setColor(flutter::DlColor::kRed());
1218 paint.setBlendMode(flutter::DlBlendMode::kDst);
1219 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1223 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1227 flutter::DisplayListBuilder builder;
1228 const float green_color_matrix[20] = {
1234 const float blue_color_matrix[20] = {
1240 auto green_color_filter =
1241 std::make_shared<flutter::DlMatrixColorFilter>(green_color_matrix);
1242 auto blue_color_filter =
1243 std::make_shared<flutter::DlMatrixColorFilter>(blue_color_matrix);
1244 auto blue_image_filter =
1245 std::make_shared<flutter::DlColorFilterImageFilter>(blue_color_filter);
1247 flutter::DlPaint paint;
1248 paint.setColor(flutter::DlColor::kRed());
1249 paint.setColorFilter(green_color_filter);
1250 paint.setImageFilter(blue_image_filter);
1251 builder.DrawRect(SkRect::MakeLTRB(100, 100, 500, 500), paint);
1252 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1256 auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
1257 flutter::DlBlurStyle::kNormal, 10);
1259 flutter::DisplayListBuilder builder;
1261 std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
1262 flutter::DlColor::kGreen()};
1263 std::array<float, 2> stops = {0, 1};
1264 std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
1265 std::make_shared<flutter::DlColorColorSource>(flutter::DlColor::kWhite()),
1266 flutter::DlColorSource::MakeLinear(
1267 SkPoint::Make(0, 0), SkPoint::Make(100, 50), 2, colors.data(),
1268 stops.data(), flutter::DlTileMode::kClamp)};
1271 for (
const auto& color_source : color_sources) {
1272 flutter::DlPaint paint;
1273 paint.setColorSource(color_source);
1274 paint.setMaskFilter(blur_filter);
1276 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1278 SkRRect::MakeRectXY(SkRect::MakeXYWH(100,
offset, 100, 50), 30, 30),
1280 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1281 paint.setStrokeWidth(10);
1283 SkRRect::MakeRectXY(SkRect::MakeXYWH(300,
offset, 100, 50), 30, 30),
1289 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1293 flutter::DisplayListBuilder builder;
1294 std::vector<flutter::DlStrokeJoin> joins = {
1295 flutter::DlStrokeJoin::kBevel,
1296 flutter::DlStrokeJoin::kRound,
1297 flutter::DlStrokeJoin::kMiter,
1299 flutter::DlPaint paint =
1301 .setColor(flutter::DlColor::kWhite())
1302 .setDrawStyle(flutter::DlDrawStyle::kFill)
1303 .setStrokeWidth(10);
1304 flutter::DlPaint stroke_paint =
1306 .setColor(flutter::DlColor::kWhite())
1307 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1308 .setStrokeWidth(10);
1309 SkPath path = SkPath().addPoly({{150, 50}, {160, 50}},
false);
1311 builder.Translate(300, 50);
1312 builder.Scale(0.8, 0.8);
1313 for (
auto join : joins) {
1314 paint.setStrokeJoin(join);
1315 stroke_paint.setStrokeJoin(join);
1316 builder.DrawRect(SkRect::MakeXYWH(0, 0, 100, 100), paint);
1317 builder.DrawRect(SkRect::MakeXYWH(0, 150, 100, 100), stroke_paint);
1319 SkRRect::MakeRectXY(SkRect::MakeXYWH(150, 0, 100, 100), 30, 30), paint);
1321 SkRRect::MakeRectXY(SkRect::MakeXYWH(150, 150, 100, 100), 30, 30),
1323 builder.DrawCircle({350, 50}, 50, paint);
1324 builder.DrawCircle({350, 200}, 50, stroke_paint);
1325 builder.Translate(0, 300);
1327 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1331 flutter::DisplayListBuilder builder;
1333 flutter::DlPaint fill_paint =
1335 .setColor(flutter::DlColor::kBlue())
1336 .setDrawStyle(flutter::DlDrawStyle::kFill)
1337 .setStrokeWidth(10);
1338 flutter::DlPaint stroke_paint =
1340 .setColor(flutter::DlColor::kGreen())
1341 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1342 .setStrokeWidth(10);
1345 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1348 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1352 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1355 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1358 flutter::DlPaint reference_paint =
1360 .setColor(flutter::DlColor::kMidGrey())
1361 .setDrawStyle(flutter::DlDrawStyle::kFill)
1362 .setStrokeWidth(10);
1365 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 500, 300, 300), 40, 40),
1368 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 100, 300, 300), 120, 120),
1371 flutter::DlPaint clip_fill_paint =
1373 .setColor(flutter::DlColor::kCyan())
1374 .setDrawStyle(flutter::DlDrawStyle::kFill)
1375 .setStrokeWidth(10);
1379 SkRRect::MakeRectXY(SkRect::MakeXYWH(900, 100, 300, 300), 120, 40));
1380 builder.DrawPaint(clip_fill_paint);
1385 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 900, 300, 300), 40, 120));
1386 builder.DrawPaint(clip_fill_paint);
1389 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1393 std::vector<const char*> blend_mode_names;
1394 std::vector<flutter::DlBlendMode> blend_mode_values;
1396 const std::vector<std::tuple<const char*, flutter::DlBlendMode>> blends = {
1398 {
"Clear", flutter::DlBlendMode::kClear},
1399 {
"Source", flutter::DlBlendMode::kSrc},
1400 {
"Destination", flutter::DlBlendMode::kDst},
1401 {
"SourceOver", flutter::DlBlendMode::kSrcOver},
1402 {
"DestinationOver", flutter::DlBlendMode::kDstOver},
1403 {
"SourceIn", flutter::DlBlendMode::kSrcIn},
1404 {
"DestinationIn", flutter::DlBlendMode::kDstIn},
1405 {
"SourceOut", flutter::DlBlendMode::kSrcOut},
1406 {
"DestinationOut", flutter::DlBlendMode::kDstOut},
1407 {
"SourceATop", flutter::DlBlendMode::kSrcATop},
1408 {
"DestinationATop", flutter::DlBlendMode::kDstATop},
1409 {
"Xor", flutter::DlBlendMode::kXor},
1410 {
"Plus", flutter::DlBlendMode::kPlus},
1411 {
"Modulate", flutter::DlBlendMode::kModulate},
1413 {
"Screen", flutter::DlBlendMode::kScreen},
1414 {
"Overlay", flutter::DlBlendMode::kOverlay},
1415 {
"Darken", flutter::DlBlendMode::kDarken},
1416 {
"Lighten", flutter::DlBlendMode::kLighten},
1417 {
"ColorDodge", flutter::DlBlendMode::kColorDodge},
1418 {
"ColorBurn", flutter::DlBlendMode::kColorBurn},
1419 {
"HardLight", flutter::DlBlendMode::kHardLight},
1420 {
"SoftLight", flutter::DlBlendMode::kSoftLight},
1421 {
"Difference", flutter::DlBlendMode::kDifference},
1422 {
"Exclusion", flutter::DlBlendMode::kExclusion},
1423 {
"Multiply", flutter::DlBlendMode::kMultiply},
1424 {
"Hue", flutter::DlBlendMode::kHue},
1425 {
"Saturation", flutter::DlBlendMode::kSaturation},
1426 {
"Color", flutter::DlBlendMode::kColor},
1427 {
"Luminosity", flutter::DlBlendMode::kLuminosity},
1429 assert(blends.size() ==
1430 static_cast<size_t>(flutter::DlBlendMode::kLastMode) + 1);
1431 for (
const auto& [name, mode] : blends) {
1432 blend_mode_names.push_back(name);
1433 blend_mode_values.push_back(mode);
1437 auto callback = [&]() {
1438 static int current_blend_index = 3;
1439 static float dst_alpha = 1;
1440 static float src_alpha = 1;
1441 static float color0[4] = {1.0f, 0.0f, 0.0f, 1.0f};
1442 static float color1[4] = {0.0f, 1.0f, 0.0f, 1.0f};
1443 static float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
1444 static float src_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1446 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1448 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
1449 blend_mode_names.data(), blend_mode_names.size());
1450 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
1451 ImGui::ColorEdit4(
"Color A", color0);
1452 ImGui::ColorEdit4(
"Color B", color1);
1453 ImGui::ColorEdit4(
"Color C", color2);
1454 ImGui::ColorEdit4(
"Source Color", src_color);
1455 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
1459 std::vector<SkPoint> positions = {SkPoint::Make(100, 300),
1460 SkPoint::Make(200, 100),
1461 SkPoint::Make(300, 300)};
1462 std::vector<flutter::DlColor> colors = {
1463 toColor(color0).modulateOpacity(dst_alpha),
1464 toColor(color1).modulateOpacity(dst_alpha),
1465 toColor(color2).modulateOpacity(dst_alpha)};
1467 auto vertices = flutter::DlVertices::Make(
1468 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1469 nullptr, colors.data());
1471 flutter::DisplayListBuilder builder;
1472 flutter::DlPaint paint;
1474 paint.setColor(
toColor(src_color).modulateOpacity(src_alpha));
1475 builder.DrawVertices(vertices, blend_mode_values[current_blend_index],
1477 return builder.Build();
1480 ASSERT_TRUE(OpenPlaygroundHere(callback));
1484 flutter::DisplayListBuilder builder;
1485 builder.DrawPaint(flutter::DlPaint().setColor(flutter::DlColor::kWhite()));
1487 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
1488 builder.DrawCircle({300, 300}, 200,
1489 flutter::DlPaint().setMaskFilter(&filter));
1491 std::vector<flutter::DlColor> colors = {flutter::DlColor::kGreen(),
1492 flutter::DlColor::kGreen()};
1493 const float stops[2] = {0.0, 1.0};
1494 auto linear = flutter::DlColorSource::MakeLinear(
1495 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
1496 flutter::DlTileMode::kRepeat);
1497 flutter::DlPaint blend_paint =
1499 .setColorSource(linear)
1500 .setBlendMode(flutter::DlBlendMode::kScreen);
1501 builder.DrawPaint(blend_paint);
1503 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1507 flutter::DisplayListBuilder builder;
1508 builder.DrawColor(flutter::DlColor::kWhite(), flutter::DlBlendMode::kSrc);
1514 builder.Translate(1.0f, 1.0f);
1516 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kSolid, 5.0f);
1517 flutter::DlPaint solid_alpha_paint =
1519 .setMaskFilter(solid_filter)
1520 .setColor(flutter::DlColor::kBlue())
1522 for (
int x = 1; x <= 4; x++) {
1523 for (
int y = 1; y <= 4; y++) {
1524 builder.DrawRect(SkRect::MakeXYWH(x * 100, y * 100, 80, 80),
1531 builder.Translate(500.0f, 0.0f);
1532 auto normal_filter =
1533 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kNormal, 5.0f);
1534 auto rotate_if = flutter::DlMatrixImageFilter::Make(
1535 SkMatrix::RotateDeg(10), flutter::DlImageSampling::kLinear);
1536 flutter::DlPaint normal_if_paint =
1538 .setMaskFilter(solid_filter)
1539 .setImageFilter(rotate_if)
1540 .setColor(flutter::DlColor::kGreen())
1542 for (
int x = 1; x <= 4; x++) {
1543 for (
int y = 1; y <= 4; y++) {
1544 builder.DrawRect(SkRect::MakeXYWH(x * 100, y * 100, 80, 80),
1550 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));