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"
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::DlColorFilter::MakeBlend(
526 flutter::DlColor::kYellow(), flutter::DlBlendMode::kModulate);
527 paint.setColorFilter(filter);
529 flutter::DlImageSampling::kNearestNeighbor, &paint);
534 auto filter = flutter::DlColorFilter::MakeBlend(
535 flutter::DlColor::kRed(), 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;
555 auto color_filter = flutter::DlColorFilter::MakeMatrix(invert_color_matrix);
556 auto image_filter = flutter::DlImageFilter::MakeColorFilter(color_filter);
558 paint.setImageFilter(image_filter);
560 flutter::DlImageSampling::kNearestNeighbor, &paint);
562 builder.Translate(0, 700);
563 paint.setColorFilter(color_filter);
565 flutter::DlImageSampling::kNearestNeighbor, &paint);
566 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
570 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
572 auto callback = [&]() {
573 static float sigma[] = {10, 10};
575 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
576 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
579 flutter::DisplayListBuilder builder;
580 flutter::DlPaint paint;
582 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
583 flutter::DlTileMode::kClamp);
584 paint.setImageFilter(&filter);
586 flutter::DlImageSampling::kNearestNeighbor, &paint);
588 return builder.Build();
591 ASSERT_TRUE(OpenPlaygroundHere(callback));
595 auto texture = CreateTextureForFixture(
"boston.jpg");
596 flutter::DisplayListBuilder builder;
597 flutter::DlPaint paint;
599 auto dilate = std::make_shared<flutter::DlDilateImageFilter>(10.0, 10.0);
600 auto erode = std::make_shared<flutter::DlErodeImageFilter>(10.0, 10.0);
601 auto open = std::make_shared<flutter::DlComposeImageFilter>(dilate, erode);
602 auto close = std::make_shared<flutter::DlComposeImageFilter>(erode, dilate);
604 paint.setImageFilter(open.get());
606 flutter::DlImageSampling::kNearestNeighbor, &paint);
607 builder.Translate(0, 700);
608 paint.setImageFilter(close.get());
610 flutter::DlImageSampling::kNearestNeighbor, &paint);
611 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
615 auto texture = CreateTextureForFixture(
"boston.jpg");
616 const float inner_color_matrix[20] = {
622 const float outer_color_matrix[20] = {
628 auto inner_color_filter =
629 flutter::DlColorFilter::MakeMatrix(inner_color_matrix);
630 auto outer_color_filter =
631 flutter::DlColorFilter::MakeMatrix(outer_color_matrix);
632 auto inner = flutter::DlImageFilter::MakeColorFilter(inner_color_filter);
633 auto outer = flutter::DlImageFilter::MakeColorFilter(outer_color_filter);
634 auto compose = std::make_shared<flutter::DlComposeImageFilter>(outer, inner);
636 flutter::DisplayListBuilder builder;
637 flutter::DlPaint paint;
638 paint.setImageFilter(compose.get());
640 flutter::DlImageSampling::kNearestNeighbor, &paint);
641 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
645 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
647 auto callback = [&]() {
648 static float sigma[] = {10, 10};
649 static float ctm_scale = 1;
650 static bool use_bounds =
true;
651 static bool draw_circle =
true;
652 static bool add_clip =
true;
654 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
655 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
656 ImGui::SliderFloat(
"Scale", &ctm_scale, 0, 10);
659 "If everything is working correctly, none of the options below should "
660 "impact the filter's appearance.");
661 ImGui::Checkbox(
"Use SaveLayer bounds", &use_bounds);
662 ImGui::Checkbox(
"Draw child element", &draw_circle);
663 ImGui::Checkbox(
"Add pre-clip", &add_clip);
666 flutter::DisplayListBuilder builder;
671 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
672 flutter::DlTileMode::kClamp);
674 std::optional<SkRect> bounds;
679 bounds = SkRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
685 builder.ClipRect(SkRect::MakeLTRB(0, 0, 99999, 99999),
686 flutter::DlCanvas::ClipOp::kIntersect,
true);
690 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
691 builder.SaveLayer(bounds.has_value() ? &bounds.value() :
nullptr,
nullptr,
698 flutter::DlPaint paint;
699 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
700 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
701 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
702 paint.setStrokeWidth(10);
703 paint.setColor(flutter::DlColor::kRed().withAlpha(100));
704 builder.DrawCircle(SkPoint{circle_center.x, circle_center.y}, 100, paint);
707 return builder.Build();
710 ASSERT_TRUE(OpenPlaygroundHere(callback));
715 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
716 flutter::DisplayListBuilder builder;
717 auto size = texture->GetSize();
718 builder.DrawImageNine(
720 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
721 size.height * 3 / 4),
722 SkRect::MakeLTRB(0, 0, size.width * 2, size.height * 2),
723 flutter::DlFilterMode::kNearest,
nullptr);
724 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
731 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
732 flutter::DisplayListBuilder builder;
733 auto size = texture->GetSize();
734 builder.DrawImageNine(
736 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
737 size.height * 3 / 4),
738 SkRect::MakeLTRB(0, 0, size.width / 2, size.height),
739 flutter::DlFilterMode::kNearest,
nullptr);
740 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
747 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
748 flutter::DisplayListBuilder builder;
749 auto size = texture->GetSize();
750 builder.DrawImageNine(
752 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
753 size.height * 3 / 4),
754 SkRect::MakeLTRB(0, 0, size.width, size.height / 2),
755 flutter::DlFilterMode::kNearest,
nullptr);
756 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
762 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
763 flutter::DisplayListBuilder builder;
764 auto size = texture->GetSize();
765 builder.DrawImageNine(
767 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
768 size.height * 3 / 4),
769 SkRect::MakeLTRB(0, 0, size.width / 2, size.height / 2),
770 flutter::DlFilterMode::kNearest,
nullptr);
771 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
777 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
778 flutter::DisplayListBuilder builder;
779 auto size = texture->GetSize();
780 builder.DrawImageNine(
782 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
783 size.height * 3 / 4),
784 SkRect::MakeLTRB(0, 0, size.width / 4, size.height / 4),
785 flutter::DlFilterMode::kNearest,
nullptr);
786 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
792 auto texture = CreateTextureForFixture(
"nine_patch_corners.png");
793 flutter::DisplayListBuilder builder;
795 SkIRect::MakeXYWH(10, 10, 1, 1),
796 SkRect::MakeXYWH(0, 0, 200, 100),
797 flutter::DlFilterMode::kNearest,
nullptr);
798 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
802 flutter::DisplayListBuilder builder;
803 SkPoint points[7] = {
812 std::vector<flutter::DlStrokeCap> caps = {
813 flutter::DlStrokeCap::kButt,
814 flutter::DlStrokeCap::kRound,
815 flutter::DlStrokeCap::kSquare,
817 flutter::DlPaint paint =
819 .setColor(flutter::DlColor::kYellow().withAlpha(127))
821 builder.Translate(50, 50);
822 for (
auto cap : caps) {
823 paint.setStrokeCap(cap);
825 builder.DrawPoints(flutter::DlCanvas::PointMode::kPoints, 7, points, paint);
826 builder.Translate(150, 0);
827 builder.DrawPoints(flutter::DlCanvas::PointMode::kLines, 5, points, paint);
828 builder.Translate(150, 0);
829 builder.DrawPoints(flutter::DlCanvas::PointMode::kPolygon, 5, points,
832 builder.Translate(0, 150);
834 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
838 flutter::DisplayListBuilder builder;
839 std::vector<flutter::DlStrokeCap> caps = {
840 flutter::DlStrokeCap::kButt,
841 flutter::DlStrokeCap::kRound,
842 flutter::DlStrokeCap::kSquare,
844 flutter::DlPaint paint =
846 .setColor(flutter::DlColor::kYellow().withAlpha(127))
847 .setDrawStyle(flutter::DlDrawStyle::kStroke)
848 .setStrokeCap(flutter::DlStrokeCap::kButt)
850 SkPath path = SkPath().addPoly({{150, 50}, {150, 50}},
false);
851 for (
auto cap : caps) {
852 paint.setStrokeCap(cap);
853 builder.DrawLine(SkPoint{50, 50}, SkPoint{50, 50}, paint);
854 builder.DrawPath(path, paint);
855 builder.Translate(0, 150);
857 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
861 flutter::DisplayListBuilder builder;
862 flutter::DlPaint paint;
864 auto content_scale = GetContentScale() * 0.8;
865 builder.Scale(content_scale.x, content_scale.y);
867 constexpr
size_t star_spikes = 5;
868 constexpr SkScalar half_spike_rotation =
kPi / star_spikes;
869 constexpr SkScalar radius = 40;
870 constexpr SkScalar spike_size = 10;
871 constexpr SkScalar outer_radius = radius + spike_size;
872 constexpr SkScalar inner_radius = radius - spike_size;
873 std::array<SkPoint, star_spikes * 2> star;
874 for (
size_t i = 0; i < star_spikes; i++) {
875 const SkScalar rotation = half_spike_rotation * i * 2;
876 star[i * 2] = SkPoint::Make(50 + std::sin(rotation) * outer_radius,
877 50 - std::cos(rotation) * outer_radius);
878 star[i * 2 + 1] = SkPoint::Make(
879 50 + std::sin(rotation + half_spike_rotation) * inner_radius,
880 50 - std::cos(rotation + half_spike_rotation) * inner_radius);
883 std::array<SkPath, 4> paths = {
884 SkPath{}.addRect(SkRect::MakeXYWH(0, 0, 200, 100)),
886 SkRRect::MakeRectXY(SkRect::MakeXYWH(20, 0, 200, 100), 30, 30)),
887 SkPath{}.addCircle(100, 50, 50),
888 SkPath{}.addPoly(star.data(), star.size(),
true),
890 paint.setColor(flutter::DlColor::kWhite());
891 builder.DrawPaint(paint);
892 paint.setColor(flutter::DlColor::kCyan());
893 builder.Translate(100, 50);
894 for (
size_t x = 0;
x < paths.size();
x++) {
896 for (
size_t y = 0; y < 6; y++) {
897 builder.DrawShadow(paths[
x], flutter::DlColor::kBlack(), 3 + y * 8,
false,
899 builder.DrawPath(paths[
x], paint);
900 builder.Translate(0, 150);
903 builder.Translate(250, 0);
906 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
910 flutter::DisplayListBuilder builder;
911 std::vector<flutter::DlStrokeCap> caps = {
912 flutter::DlStrokeCap::kButt,
913 flutter::DlStrokeCap::kRound,
914 flutter::DlStrokeCap::kSquare,
916 flutter::DlPaint paint =
918 .setColor(flutter::DlColor::kWhite())
919 .setDrawStyle(flutter::DlDrawStyle::kStroke)
921 flutter::DlPaint outline_paint =
923 .setColor(flutter::DlColor::kYellow())
924 .setDrawStyle(flutter::DlDrawStyle::kStroke)
925 .setStrokeCap(flutter::DlStrokeCap::kSquare)
927 SkPath path = SkPath().addPoly({{150, 50}, {160, 50}},
false);
928 for (
auto cap : caps) {
929 paint.setStrokeCap(cap);
930 builder.DrawLine(SkPoint{50, 50}, SkPoint{60, 50}, paint);
931 builder.DrawRect(SkRect{45, 45, 65, 55}, outline_paint);
932 builder.DrawLine(SkPoint{100, 50}, SkPoint{100, 50}, paint);
933 if (cap != flutter::DlStrokeCap::kButt) {
934 builder.DrawRect(SkRect{95, 45, 105, 55}, outline_paint);
936 builder.DrawPath(path, paint);
937 builder.DrawRect(path.getBounds().makeOutset(5, 5), outline_paint);
938 builder.Translate(0, 150);
940 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
944 auto boston = CreateTextureForFixture(
"boston.jpg");
946 auto callback = [&]() {
947 static int selected_matrix_type = 0;
948 const char* matrix_type_names[] = {
"Matrix",
"Local Matrix"};
950 static float ctm_translation[2] = {200, 200};
951 static float ctm_scale[2] = {0.65, 0.65};
952 static float ctm_skew[2] = {0, 0};
954 static bool enable =
true;
955 static float translation[2] = {100, 100};
956 static float scale[2] = {0.8, 0.8};
957 static float skew[2] = {0.2, 0.2};
959 static bool enable_savelayer =
true;
961 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
963 ImGui::Combo(
"Filter type", &selected_matrix_type, matrix_type_names,
964 sizeof(matrix_type_names) /
sizeof(
char*));
966 ImGui::TextWrapped(
"Current Transform");
967 ImGui::SliderFloat2(
"CTM Translation", ctm_translation, 0, 1000);
968 ImGui::SliderFloat2(
"CTM Scale", ctm_scale, 0, 3);
969 ImGui::SliderFloat2(
"CTM Skew", ctm_skew, -3, 3);
972 "MatrixFilter and LocalMatrixFilter modify the CTM in the same way. "
973 "The only difference is that MatrixFilter doesn't affect the effect "
974 "transform, whereas LocalMatrixFilter does.");
977 ImGui::Checkbox(
"Enable", &enable);
978 ImGui::SliderFloat2(
"Filter Translation", translation, 0, 1000);
979 ImGui::SliderFloat2(
"Filter Scale",
scale, 0, 3);
980 ImGui::SliderFloat2(
"Filter Skew", skew, -3, 3);
983 "Rendering the filtered image within a layer can expose bounds "
984 "issues. If the rendered image gets cut off when this setting is "
985 "enabled, there's a coverage bug in the filter.");
986 ImGui::Checkbox(
"Render in layer", &enable_savelayer);
990 flutter::DisplayListBuilder builder;
991 flutter::DlPaint paint;
993 if (enable_savelayer) {
994 builder.SaveLayer(
nullptr,
nullptr);
997 auto content_scale = GetContentScale();
998 builder.Scale(content_scale.x, content_scale.y);
1002 SkMatrix::MakeAll(ctm_scale[0], ctm_skew[0], ctm_translation[0],
1003 ctm_skew[1], ctm_scale[1], ctm_translation[1],
1005 builder.Transform(ctm_matrix);
1008 auto filter_matrix =
1010 skew[1],
scale[1], 0.0f, translation[1],
1011 0.0f, 0.0f, 1.0f, 0.0f,
1012 0.0f, 0.0f, 0.0f, 1.0f);
1015 switch (selected_matrix_type) {
1017 auto filter = flutter::DlMatrixImageFilter(
1018 filter_matrix, flutter::DlImageSampling::kLinear);
1019 paint.setImageFilter(&filter);
1023 auto internal_filter =
1024 flutter::DlBlurImageFilter(10, 10, flutter::DlTileMode::kDecal)
1026 auto filter = flutter::DlLocalMatrixImageFilter(filter_matrix,
1028 paint.setImageFilter(&filter);
1035 flutter::DlImageSampling::kLinear, &paint);
1037 if (enable_savelayer) {
1041 return builder.Build();
1044 ASSERT_TRUE(OpenPlaygroundHere(callback));
1048 auto callback = [&]() {
1049 static float translation[2] = {0, 0};
1050 static bool enable_save_layer =
true;
1052 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1053 ImGui::SliderFloat2(
"Translation", translation, -130, 130);
1054 ImGui::Checkbox(
"Enable save layer", &enable_save_layer);
1057 flutter::DisplayListBuilder builder;
1059 builder.Scale(2.0, 2.0);
1060 flutter::DlPaint paint;
1061 paint.setColor(flutter::DlColor::kYellow());
1062 builder.DrawRect(SkRect::MakeWH(300, 300), paint);
1063 paint.setStrokeWidth(1.0);
1064 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1065 paint.setColor(flutter::DlColor::kBlack().withAlpha(0x80));
1066 builder.DrawLine(SkPoint::Make(150, 0), SkPoint::Make(150, 300), paint);
1067 builder.DrawLine(SkPoint::Make(0, 150), SkPoint::Make(300, 150), paint);
1069 flutter::DlPaint save_paint;
1070 SkRect bounds = SkRect::MakeXYWH(100, 100, 100, 100);
1071 Matrix translate_matrix =
1073 if (enable_save_layer) {
1074 auto filter = flutter::DlMatrixImageFilter(
1075 translate_matrix, flutter::DlImageSampling::kNearestNeighbor);
1076 save_paint.setImageFilter(filter.shared());
1077 builder.SaveLayer(&bounds, &save_paint);
1080 builder.Transform(translate_matrix);
1085 filter_matrix.
Scale({0.2f, 0.2f});
1087 auto filter = flutter::DlMatrixImageFilter(
1088 filter_matrix, flutter::DlImageSampling::kNearestNeighbor);
1090 save_paint.setImageFilter(filter.shared());
1092 builder.SaveLayer(&bounds, &save_paint);
1093 flutter::DlPaint paint2;
1094 paint2.setColor(flutter::DlColor::kBlue());
1095 builder.DrawRect(bounds, paint2);
1098 return builder.Build();
1101 ASSERT_TRUE(OpenPlaygroundHere(callback));
1105 flutter::DlPaint paint;
1106 paint.setColor(flutter::DlColor(0xFF2196F3).withAlpha(128));
1107 flutter::DisplayListBuilder builder;
1108 paint.setColorFilter(flutter::DlColorFilter::MakeLinearToSrgbGamma());
1109 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint);
1110 builder.Translate(0, 200);
1112 paint.setColorFilter(flutter::DlColorFilter::MakeSrgbToLinearGamma());
1113 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint);
1115 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1119 const flutter::DlColor colors[2] = {
1120 flutter::DlColor(0xFFF44336),
1121 flutter::DlColor(0xFF2196F3),
1123 const float stops[2] = {0.0, 1.0};
1124 flutter::DlPaint paint;
1125 flutter::DisplayListBuilder builder;
1126 auto clip_bounds = SkRect::MakeWH(300.0, 300.0);
1128 builder.Translate(100, 100);
1129 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1131 flutter::DlColorSource::MakeLinear({0.0, 0.0}, {100.0, 100.0}, 2, colors,
1132 stops, flutter::DlTileMode::kRepeat);
1133 paint.setColorSource(linear);
1134 builder.DrawPaint(paint);
1138 builder.Translate(500, 100);
1139 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1140 auto radial = flutter::DlColorSource::MakeRadial(
1141 {100.0, 100.0}, 100.0, 2, colors, stops, flutter::DlTileMode::kRepeat);
1142 paint.setColorSource(radial);
1143 builder.DrawPaint(paint);
1147 builder.Translate(100, 500);
1148 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1150 flutter::DlColorSource::MakeSweep({100.0, 100.0}, 180.0, 270.0, 2, colors,
1151 stops, flutter::DlTileMode::kRepeat);
1152 paint.setColorSource(sweep);
1153 builder.DrawPaint(paint);
1157 builder.Translate(500, 500);
1158 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1159 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
1161 flutter::DlTileMode::kRepeat,
1162 flutter::DlTileMode::kRepeat);
1163 paint.setColorSource(image);
1164 builder.DrawPaint(paint);
1167 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1171 flutter::DisplayListBuilder builder;
1174 builder.SaveLayer(
nullptr,
nullptr);
1175 builder.Translate(100, 100);
1176 flutter::DlPaint paint;
1177 paint.setColor(flutter::DlColor::kRed());
1178 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1179 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1180 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
1181 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1185 builder.SaveLayer(
nullptr,
nullptr);
1186 builder.Translate(300, 100);
1187 flutter::DlPaint paint;
1188 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1189 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1190 paint.setColor(flutter::DlColor::kRed());
1191 paint.setBlendMode(flutter::DlBlendMode::kDstOver);
1192 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1196 builder.SaveLayer(
nullptr,
nullptr);
1197 builder.Translate(100, 300);
1198 flutter::DlPaint paint;
1199 paint.setColor(flutter::DlColor::kRed());
1200 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1201 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1202 paint.setBlendMode(flutter::DlBlendMode::kSrc);
1203 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1207 builder.SaveLayer(
nullptr,
nullptr);
1208 builder.Translate(300, 300);
1209 flutter::DlPaint paint;
1210 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1211 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1212 paint.setColor(flutter::DlColor::kRed());
1213 paint.setBlendMode(flutter::DlBlendMode::kDst);
1214 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1218 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1222 flutter::DisplayListBuilder builder;
1223 const float green_color_matrix[20] = {
1229 const float blue_color_matrix[20] = {
1235 auto green_color_filter =
1236 flutter::DlColorFilter::MakeMatrix(green_color_matrix);
1237 auto blue_color_filter =
1238 flutter::DlColorFilter::MakeMatrix(blue_color_matrix);
1239 auto blue_image_filter =
1240 flutter::DlImageFilter::MakeColorFilter(blue_color_filter);
1242 flutter::DlPaint paint;
1243 paint.setColor(flutter::DlColor::kRed());
1244 paint.setColorFilter(green_color_filter);
1245 paint.setImageFilter(blue_image_filter);
1246 builder.DrawRect(SkRect::MakeLTRB(100, 100, 500, 500), paint);
1247 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1251 auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
1252 flutter::DlBlurStyle::kNormal, 10);
1254 flutter::DisplayListBuilder builder;
1256 std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
1257 flutter::DlColor::kGreen()};
1258 std::array<float, 2> stops = {0, 1};
1259 auto texture = CreateTextureForFixture(
"airplane.jpg");
1260 auto matrix = flutter::DlMatrix::MakeTranslation({-300, -110});
1261 std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
1262 flutter::DlColorSource::MakeImage(
1264 flutter::DlTileMode::kRepeat, flutter::DlImageSampling::kLinear,
1266 flutter::DlColorSource::MakeLinear(
1268 stops.data(), flutter::DlTileMode::kClamp),
1272 builder.Translate(0, 100);
1273 for (
const auto& color_source : color_sources) {
1274 flutter::DlPaint paint;
1275 paint.setColorSource(color_source);
1276 paint.setMaskFilter(blur_filter);
1279 builder.Translate(100, 0);
1280 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1281 builder.DrawRRect(SkRRect::MakeRectXY(SkRect::MakeWH(100, 50), 30, 30),
1284 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1285 paint.setStrokeWidth(10);
1286 builder.Translate(200, 0);
1287 builder.DrawRRect(SkRRect::MakeRectXY(SkRect::MakeWH(100, 50), 30, 30),
1291 builder.Translate(0, 100);
1295 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1299 flutter::DisplayListBuilder builder;
1300 std::vector<flutter::DlStrokeJoin> joins = {
1301 flutter::DlStrokeJoin::kBevel,
1302 flutter::DlStrokeJoin::kRound,
1303 flutter::DlStrokeJoin::kMiter,
1305 flutter::DlPaint paint =
1307 .setColor(flutter::DlColor::kWhite())
1308 .setDrawStyle(flutter::DlDrawStyle::kFill)
1309 .setStrokeWidth(10);
1310 flutter::DlPaint stroke_paint =
1312 .setColor(flutter::DlColor::kWhite())
1313 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1314 .setStrokeWidth(10);
1315 SkPath path = SkPath().addPoly({{150, 50}, {160, 50}},
false);
1317 builder.Translate(300, 50);
1318 builder.Scale(0.8, 0.8);
1319 for (
auto join : joins) {
1320 paint.setStrokeJoin(join);
1321 stroke_paint.setStrokeJoin(join);
1322 builder.DrawRect(SkRect::MakeXYWH(0, 0, 100, 100), paint);
1323 builder.DrawRect(SkRect::MakeXYWH(0, 150, 100, 100), stroke_paint);
1325 SkRRect::MakeRectXY(SkRect::MakeXYWH(150, 0, 100, 100), 30, 30), paint);
1327 SkRRect::MakeRectXY(SkRect::MakeXYWH(150, 150, 100, 100), 30, 30),
1329 builder.DrawCircle(SkPoint{350, 50}, 50, paint);
1330 builder.DrawCircle(SkPoint{350, 200}, 50, stroke_paint);
1331 builder.Translate(0, 300);
1333 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1337 flutter::DisplayListBuilder builder;
1339 flutter::DlPaint fill_paint =
1341 .setColor(flutter::DlColor::kBlue())
1342 .setDrawStyle(flutter::DlDrawStyle::kFill)
1343 .setStrokeWidth(10);
1344 flutter::DlPaint stroke_paint =
1346 .setColor(flutter::DlColor::kGreen())
1347 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1348 .setStrokeWidth(10);
1351 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1354 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1358 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1361 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1364 flutter::DlPaint reference_paint =
1366 .setColor(flutter::DlColor::kMidGrey())
1367 .setDrawStyle(flutter::DlDrawStyle::kFill)
1368 .setStrokeWidth(10);
1371 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 500, 300, 300), 40, 40),
1374 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 100, 300, 300), 120, 120),
1377 flutter::DlPaint clip_fill_paint =
1379 .setColor(flutter::DlColor::kCyan())
1380 .setDrawStyle(flutter::DlDrawStyle::kFill)
1381 .setStrokeWidth(10);
1385 SkRRect::MakeRectXY(SkRect::MakeXYWH(900, 100, 300, 300), 120, 40));
1386 builder.DrawPaint(clip_fill_paint);
1391 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 900, 300, 300), 40, 120));
1392 builder.DrawPaint(clip_fill_paint);
1395 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1399 std::vector<const char*> blend_mode_names;
1400 std::vector<flutter::DlBlendMode> blend_mode_values;
1402 const std::vector<std::tuple<const char*, flutter::DlBlendMode>> blends = {
1404 {
"Clear", flutter::DlBlendMode::kClear},
1405 {
"Source", flutter::DlBlendMode::kSrc},
1406 {
"Destination", flutter::DlBlendMode::kDst},
1407 {
"SourceOver", flutter::DlBlendMode::kSrcOver},
1408 {
"DestinationOver", flutter::DlBlendMode::kDstOver},
1409 {
"SourceIn", flutter::DlBlendMode::kSrcIn},
1410 {
"DestinationIn", flutter::DlBlendMode::kDstIn},
1411 {
"SourceOut", flutter::DlBlendMode::kSrcOut},
1412 {
"DestinationOut", flutter::DlBlendMode::kDstOut},
1413 {
"SourceATop", flutter::DlBlendMode::kSrcATop},
1414 {
"DestinationATop", flutter::DlBlendMode::kDstATop},
1415 {
"Xor", flutter::DlBlendMode::kXor},
1416 {
"Plus", flutter::DlBlendMode::kPlus},
1417 {
"Modulate", flutter::DlBlendMode::kModulate},
1419 {
"Screen", flutter::DlBlendMode::kScreen},
1420 {
"Overlay", flutter::DlBlendMode::kOverlay},
1421 {
"Darken", flutter::DlBlendMode::kDarken},
1422 {
"Lighten", flutter::DlBlendMode::kLighten},
1423 {
"ColorDodge", flutter::DlBlendMode::kColorDodge},
1424 {
"ColorBurn", flutter::DlBlendMode::kColorBurn},
1425 {
"HardLight", flutter::DlBlendMode::kHardLight},
1426 {
"SoftLight", flutter::DlBlendMode::kSoftLight},
1427 {
"Difference", flutter::DlBlendMode::kDifference},
1428 {
"Exclusion", flutter::DlBlendMode::kExclusion},
1429 {
"Multiply", flutter::DlBlendMode::kMultiply},
1430 {
"Hue", flutter::DlBlendMode::kHue},
1431 {
"Saturation", flutter::DlBlendMode::kSaturation},
1432 {
"Color", flutter::DlBlendMode::kColor},
1433 {
"Luminosity", flutter::DlBlendMode::kLuminosity},
1435 assert(blends.size() ==
1436 static_cast<size_t>(flutter::DlBlendMode::kLastMode) + 1);
1437 for (
const auto& [name, mode] : blends) {
1438 blend_mode_names.push_back(name);
1439 blend_mode_values.push_back(mode);
1443 auto callback = [&]() {
1444 static int current_blend_index = 3;
1445 static float dst_alpha = 1;
1446 static float src_alpha = 1;
1447 static float color0[4] = {1.0f, 0.0f, 0.0f, 1.0f};
1448 static float color1[4] = {0.0f, 1.0f, 0.0f, 1.0f};
1449 static float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
1450 static float src_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1452 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1454 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
1455 blend_mode_names.data(), blend_mode_names.size());
1456 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
1457 ImGui::ColorEdit4(
"Color A", color0);
1458 ImGui::ColorEdit4(
"Color B", color1);
1459 ImGui::ColorEdit4(
"Color C", color2);
1460 ImGui::ColorEdit4(
"Source Color", src_color);
1461 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
1465 std::vector<DlPoint> positions = {
DlPoint(100, 300),
1468 std::vector<flutter::DlColor> colors = {
1469 toColor(color0).modulateOpacity(dst_alpha),
1470 toColor(color1).modulateOpacity(dst_alpha),
1471 toColor(color2).modulateOpacity(dst_alpha)};
1473 auto vertices = flutter::DlVertices::Make(
1474 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1475 nullptr, colors.data());
1477 flutter::DisplayListBuilder builder;
1478 flutter::DlPaint paint;
1480 paint.setColor(
toColor(src_color).modulateOpacity(src_alpha));
1481 builder.DrawVertices(vertices, blend_mode_values[current_blend_index],
1483 return builder.Build();
1486 ASSERT_TRUE(OpenPlaygroundHere(callback));
1490 flutter::DisplayListBuilder builder;
1491 builder.DrawPaint(flutter::DlPaint().setColor(flutter::DlColor::kWhite()));
1493 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
1494 builder.DrawCircle(SkPoint{300, 300}, 200,
1495 flutter::DlPaint().setMaskFilter(&filter));
1497 std::vector<flutter::DlColor> colors = {flutter::DlColor::kGreen(),
1498 flutter::DlColor::kGreen()};
1499 const float stops[2] = {0.0, 1.0};
1500 auto linear = flutter::DlColorSource::MakeLinear(
1501 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
1502 flutter::DlTileMode::kRepeat);
1503 flutter::DlPaint blend_paint =
1505 .setColorSource(linear)
1506 .setBlendMode(flutter::DlBlendMode::kScreen);
1507 builder.DrawPaint(blend_paint);
1509 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1513 flutter::DisplayListBuilder builder;
1514 builder.DrawColor(flutter::DlColor::kWhite(), flutter::DlBlendMode::kSrc);
1520 builder.Translate(1.0f, 1.0f);
1522 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kSolid, 5.0f);
1523 flutter::DlPaint solid_alpha_paint =
1525 .setMaskFilter(solid_filter)
1526 .setColor(flutter::DlColor::kBlue())
1528 for (
int x = 1;
x <= 4;
x++) {
1529 for (
int y = 1; y <= 4; y++) {
1530 builder.DrawRect(SkRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1537 builder.Translate(500.0f, 0.0f);
1538 auto normal_filter =
1539 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kNormal, 5.0f);
1540 auto rotate_if = flutter::DlMatrixImageFilter::Make(
1542 flutter::DlPaint normal_if_paint =
1544 .setMaskFilter(solid_filter)
1545 .setImageFilter(rotate_if)
1546 .setColor(flutter::DlColor::kGreen())
1548 for (
int x = 1;
x <= 4;
x++) {
1549 for (
int y = 1; y <= 4; y++) {
1550 builder.DrawRect(SkRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1556 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)
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)