10 #include "flutter/display_list/dl_blend_mode.h"
11 #include "flutter/display_list/dl_builder.h"
12 #include "flutter/display_list/dl_color.h"
13 #include "flutter/display_list/dl_paint.h"
14 #include "flutter/display_list/dl_text_skia.h"
15 #include "flutter/display_list/dl_tile_mode.h"
16 #include "flutter/display_list/effects/dl_color_filter.h"
17 #include "flutter/display_list/effects/dl_color_source.h"
18 #include "flutter/display_list/effects/dl_image_filters.h"
19 #include "flutter/display_list/effects/dl_mask_filter.h"
20 #include "flutter/display_list/geometry/dl_path_builder.h"
21 #include "flutter/testing/testing.h"
22 #include "gtest/gtest.h"
34 #include "third_party/imgui/imgui.h"
39 flutter::DlColor
toColor(
const float* components) {
41 Color(components[0], components[1], components[2], components[3])));
48 flutter::DisplayListBuilder builder;
49 builder.DrawRect(DlRect::MakeXYWH(10, 10, 100, 100),
50 flutter::DlPaint(flutter::DlColor::kBlue()));
51 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
55 flutter::DisplayListBuilder builder;
56 builder.DrawText(flutter::DlTextSkia::Make(
57 SkTextBlob::MakeFromString(
"Hello", CreateTestFont())),
58 100, 100, flutter::DlPaint(flutter::DlColor::kBlue()));
59 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
63 flutter::DisplayListBuilder builder;
65 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
66 flutter::DlColor::kRed()};
67 const float stops[2] = {0.0, 1.0};
69 auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {300.0, 300.0},
70 2, colors.data(), stops,
71 flutter::DlTileMode::kClamp);
72 flutter::DlPaint paint;
73 paint.setColorSource(linear);
75 builder.DrawText(flutter::DlTextSkia::Make(SkTextBlob::MakeFromString(
76 "Hello World", CreateTestFont())),
78 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
82 flutter::DisplayListBuilder builder;
83 builder.DrawText(flutter::DlTextSkia::Make(
84 SkTextBlob::MakeFromString(
"Hello", CreateTestFont())),
85 100, 100, flutter::DlPaint(flutter::DlColor::kRed()));
87 flutter::DlPaint save_paint;
89 save_paint.setAlpha(
static_cast<uint8_t
>(255 * alpha));
90 builder.SaveLayer(std::nullopt, &save_paint);
91 builder.DrawText(flutter::DlTextSkia::Make(SkTextBlob::MakeFromString(
92 "Hello with half alpha", CreateTestFontOfSize(100))),
93 100, 300, flutter::DlPaint(flutter::DlColor::kRed()));
95 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
99 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
100 flutter::DisplayListBuilder builder;
102 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
103 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
107 flutter::DisplayListBuilder builder;
108 flutter::DlPaint paint;
110 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
111 paint.setStrokeWidth(30);
112 paint.setColor(flutter::DlColor::kRed());
114 flutter::DlPathBuilder path_builder;
115 path_builder.MoveTo(
DlPoint(-50, 0));
116 path_builder.LineTo(
DlPoint(0, -50));
117 path_builder.LineTo(
DlPoint(50, 0));
120 builder.Translate(100, 100);
122 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
123 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
124 paint.setStrokeMiter(4);
125 builder.DrawPath(path, paint);
130 builder.Translate(0, 100);
133 paint.setStrokeMiter(1);
134 builder.DrawPath(path, paint);
138 builder.Translate(150, 0);
140 paint.setStrokeCap(flutter::DlStrokeCap::kSquare);
141 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
142 builder.DrawPath(path, paint);
145 builder.Translate(150, 0);
147 paint.setStrokeCap(flutter::DlStrokeCap::kRound);
148 paint.setStrokeJoin(flutter::DlStrokeJoin::kRound);
149 builder.DrawPath(path, paint);
152 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
156 auto callback = [&]() {
157 static float start_angle = 45;
158 static float sweep_angle = 270;
159 static float stroke_width = 10;
162 static int selected_cap = 0;
163 const char* cap_names[] = {
"Butt",
"Round",
"Square"};
164 flutter::DlStrokeCap cap;
166 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
167 ImGui::SliderFloat(
"Start angle", &start_angle, -360, 360);
168 ImGui::SliderFloat(
"Sweep angle", &sweep_angle, -360, 360);
169 ImGui::SliderFloat(
"Stroke width", &stroke_width, 0, 300);
170 ImGui::Combo(
"Cap", &selected_cap, cap_names,
171 sizeof(cap_names) /
sizeof(
char*));
175 switch (selected_cap) {
177 cap = flutter::DlStrokeCap::kButt;
180 cap = flutter::DlStrokeCap::kRound;
183 cap = flutter::DlStrokeCap::kSquare;
186 cap = flutter::DlStrokeCap::kButt;
194 flutter::DisplayListBuilder builder;
195 flutter::DlPaint paint;
197 Vector2 scale = GetContentScale();
198 builder.Scale(scale.
x, scale.
y);
199 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
200 paint.setStrokeCap(cap);
201 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
202 paint.setStrokeMiter(10);
203 auto rect = DlRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
204 paint.setColor(flutter::DlColor::kGreen());
205 paint.setStrokeWidth(2);
206 builder.DrawRect(rect, paint);
207 paint.setColor(flutter::DlColor::kRed());
208 paint.setStrokeWidth(stroke_width);
209 builder.DrawArc(rect, start_angle, sweep_angle,
use_center, paint);
211 return builder.Build();
213 ASSERT_TRUE(OpenPlaygroundHere(callback));
217 auto callback = [&]() {
218 flutter::DisplayListBuilder builder;
219 flutter::DlPaint paint;
221 paint.setColor(flutter::DlColor::kRed());
222 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
224 static float stroke_width = 10.0f;
225 static int selected_stroke_type = 0;
226 static int selected_join_type = 0;
227 const char* stroke_types[] = {
"Butte",
"Round",
"Square"};
228 const char* join_type[] = {
"kMiter",
"Round",
"kBevel"};
230 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
231 ImGui::Combo(
"Cap", &selected_stroke_type, stroke_types,
232 sizeof(stroke_types) /
sizeof(
char*));
233 ImGui::Combo(
"Join", &selected_join_type, join_type,
234 sizeof(join_type) /
sizeof(
char*));
235 ImGui::SliderFloat(
"Stroke Width", &stroke_width, 10.0f, 50.0f);
238 flutter::DlStrokeCap cap;
239 flutter::DlStrokeJoin join;
240 switch (selected_stroke_type) {
242 cap = flutter::DlStrokeCap::kButt;
245 cap = flutter::DlStrokeCap::kRound;
248 cap = flutter::DlStrokeCap::kSquare;
251 cap = flutter::DlStrokeCap::kButt;
254 switch (selected_join_type) {
256 join = flutter::DlStrokeJoin::kMiter;
259 join = flutter::DlStrokeJoin::kRound;
262 join = flutter::DlStrokeJoin::kBevel;
265 join = flutter::DlStrokeJoin::kMiter;
268 paint.setStrokeCap(cap);
269 paint.setStrokeJoin(join);
270 paint.setStrokeWidth(stroke_width);
273 builder.Scale(1.5f, 1.5f);
276 builder.Translate(100, 100);
277 builder.DrawRect(DlRect::MakeWH(100, 100), paint);
280 builder.Translate(150, 0);
281 builder.DrawRoundRect(
282 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 10, 10), paint);
285 builder.Translate(150, 0);
286 builder.DrawDiffRoundRect(
287 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 10, 10),
288 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(10, 10, 80, 30), 10, 10),
293 builder.Translate(150, 0);
294 flutter::DlPathBuilder path_builder;
295 path_builder.MoveTo(
DlPoint(0, 0));
296 path_builder.LineTo(
DlPoint(0, 0));
297 path_builder.LineTo(
DlPoint(100, 0));
298 path_builder.LineTo(
DlPoint(100, 0));
299 path_builder.LineTo(
DlPoint(100, 100));
300 builder.DrawPath(path_builder.TakePath(), paint);
306 builder.Translate(200, 0);
310 flutter::DlPathBuilder line_path_builder;
311 line_path_builder.MoveTo(
DlPoint(0, 0));
312 line_path_builder.MoveTo(
DlPoint(0, 0));
313 line_path_builder.LineTo(
DlPoint(0, 0));
314 line_path_builder.LineTo(
DlPoint(0, 0));
315 line_path_builder.LineTo(
DlPoint(50, 50));
316 line_path_builder.LineTo(
DlPoint(50, 50));
317 line_path_builder.LineTo(
DlPoint(100, 0));
318 line_path_builder.LineTo(
DlPoint(100, 0));
319 DlPath line_path = line_path_builder.TakePath();
320 builder.DrawPath(line_path, paint);
322 builder.Translate(0, 100);
323 builder.DrawPath(line_path, paint);
325 builder.Translate(0, 100);
326 flutter::DlPathBuilder line_path_builder2;
327 line_path_builder2.MoveTo(
DlPoint(0, 0));
328 line_path_builder2.LineTo(
DlPoint(0, 0));
329 line_path_builder2.LineTo(
DlPoint(0, 0));
330 builder.DrawPath(line_path_builder2.TakePath(), paint);
336 builder.Translate(150, 0);
340 flutter::DlPathBuilder cubic_path;
341 cubic_path.MoveTo(
DlPoint(0, 0));
342 cubic_path.CubicCurveTo(
DlPoint(0, 0),
345 builder.DrawPath(cubic_path.TakePath(), paint);
347 builder.Translate(0, 100);
348 flutter::DlPathBuilder cubic_path2;
349 cubic_path2.MoveTo(
DlPoint(0, 0));
350 cubic_path2.CubicCurveTo(
DlPoint(0, 0),
353 builder.DrawPath(cubic_path2.TakePath(), paint);
355 builder.Translate(0, 100);
356 flutter::DlPathBuilder cubic_path3;
357 cubic_path3.MoveTo(
DlPoint(0, 0));
358 cubic_path3.CubicCurveTo(
DlPoint(0, 0),
361 builder.DrawPath(cubic_path3.TakePath(), paint);
367 builder.Translate(200, 0);
371 flutter::DlPathBuilder quad_path;
372 quad_path.MoveTo(
DlPoint(0, 0));
373 quad_path.MoveTo(
DlPoint(0, 0));
375 builder.DrawPath(quad_path.TakePath(), paint);
377 builder.Translate(0, 150);
378 flutter::DlPathBuilder quad_path2;
379 quad_path2.MoveTo(
DlPoint(0, 0));
380 quad_path2.MoveTo(
DlPoint(0, 0));
382 builder.DrawPath(quad_path2.TakePath(), paint);
384 builder.Translate(0, 100);
385 flutter::DlPathBuilder quad_path3;
386 quad_path3.MoveTo(
DlPoint(0, 0));
388 builder.DrawPath(quad_path3.TakePath(), paint);
392 return builder.Build();
394 ASSERT_TRUE(OpenPlaygroundHere(callback));
398 flutter::DisplayListBuilder builder;
399 flutter::DlPaint paint;
401 paint.setColor(flutter::DlColor::kRed());
402 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
404 builder.Translate(300, 300);
405 flutter::DlPathBuilder path_builder;
406 path_builder.AddCircle(
DlPoint(0, 0), 100);
407 path_builder.AddCircle(
DlPoint(0, 0), 50);
408 path_builder.SetFillType(flutter::DlPathFillType::kOdd);
409 builder.DrawPath(path_builder.TakePath(), paint);
411 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
418 flutter::DisplayListBuilder builder;
419 flutter::DlPaint paint;
421 paint.setColor(flutter::DlColor::kRed());
422 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
423 paint.setStrokeWidth(10);
425 builder.Translate(300, 300);
431 flutter::DlPathBuilder path_builder;
432 path_builder.MoveTo(
DlPoint(50, 50));
433 path_builder.LineTo(
DlPoint(50, 100));
434 path_builder.LineTo(
DlPoint(100, 100));
435 path_builder.LineTo(
DlPoint(100, 50));
436 builder.DrawPath(path_builder.TakePath(), paint);
438 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
442 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
443 flutter::DisplayListBuilder builder;
444 flutter::DlPaint paint;
449 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
450 paint.setMaskFilter(&filter);
452 flutter::DlImageSampling::kNearestNeighbor, &paint);
457 paint.setColor(flutter::DlColor::kYellow());
459 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kOuter, 10.0f);
460 paint.setMaskFilter(&filter);
461 builder.DrawArc(DlRect::MakeXYWH(410, 110, 100, 100), 45, 270,
true, paint);
467 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kSolid, 10.0f);
468 paint.setMaskFilter(&filter);
469 builder.DrawText(flutter::DlTextSkia::Make(SkTextBlob::MakeFromString(
470 "Testing", CreateTestFont())),
474 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
478 flutter::DisplayListBuilder builder;
479 flutter::DlPaint paint;
481 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
482 paint.setColor(flutter::DlColor::kRed());
483 builder.DrawText(flutter::DlTextSkia::Make(SkTextBlob::MakeFromString(
484 "stoked about stroked text", CreateTestFont())),
487 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
492 flutter::DisplayListBuilder builder;
493 flutter::DlPaint paint;
494 auto const& text_blob = SkTextBlob::MakeFromString(
"00000", CreateTestFont());
495 auto text = flutter::DlTextSkia::Make(text_blob);
498 auto const& mat_blue = flutter::DlColor(0xFF2196f3);
501 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
502 paint.setColor(mat_blue);
503 builder.DrawRect(DlRect::MakeXYWH(0, 0, 500, 500), paint);
506 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
507 paint.setColor(flutter::DlColor::kWhite());
508 builder.DrawText(text, 250, 250, paint);
510 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
511 paint.setColor(flutter::DlColor::kBlack());
512 builder.DrawText(text, 250, 250, paint);
514 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
518 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
519 flutter::DisplayListBuilder builder;
520 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
521 flutter::DlPaint paint;
522 paint.setMaskFilter(&filter);
523 builder.SaveLayer(std::nullopt, &paint);
525 flutter::DlImageSampling::kNearestNeighbor);
527 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
531 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
532 flutter::DisplayListBuilder builder;
533 flutter::DlPaint paint;
537 auto filter = flutter::DlColorFilter::MakeBlend(
538 flutter::DlColor::kYellow(), flutter::DlBlendMode::kModulate);
539 paint.setColorFilter(filter);
541 flutter::DlImageSampling::kNearestNeighbor, &paint);
546 auto filter = flutter::DlColorFilter::MakeBlend(
547 flutter::DlColor::kRed(), flutter::DlBlendMode::kScreen);
548 paint.setColorFilter(filter);
550 flutter::DlImageSampling::kNearestNeighbor, &paint);
553 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
557 const float invert_color_matrix[20] = {
563 auto texture = CreateTextureForFixture(
"boston.jpg");
564 flutter::DisplayListBuilder builder;
565 flutter::DlPaint paint;
567 auto color_filter = flutter::DlColorFilter::MakeMatrix(invert_color_matrix);
568 auto image_filter = flutter::DlImageFilter::MakeColorFilter(color_filter);
570 paint.setImageFilter(image_filter);
572 flutter::DlImageSampling::kNearestNeighbor, &paint);
574 builder.Translate(0, 700);
575 paint.setColorFilter(color_filter);
577 flutter::DlImageSampling::kNearestNeighbor, &paint);
578 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
582 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
584 auto callback = [&]() {
585 static float sigma[] = {10, 10};
587 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
588 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
591 flutter::DisplayListBuilder builder;
592 flutter::DlPaint paint;
594 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
595 flutter::DlTileMode::kClamp);
596 paint.setImageFilter(&filter);
598 flutter::DlImageSampling::kNearestNeighbor, &paint);
600 return builder.Build();
603 ASSERT_TRUE(OpenPlaygroundHere(callback));
607 auto texture = CreateTextureForFixture(
"boston.jpg");
608 flutter::DisplayListBuilder builder;
609 flutter::DlPaint paint;
611 auto dilate = std::make_shared<flutter::DlDilateImageFilter>(10.0, 10.0);
612 auto erode = std::make_shared<flutter::DlErodeImageFilter>(10.0, 10.0);
613 auto open = std::make_shared<flutter::DlComposeImageFilter>(dilate, erode);
614 auto close = std::make_shared<flutter::DlComposeImageFilter>(erode, dilate);
616 paint.setImageFilter(open.get());
618 flutter::DlImageSampling::kNearestNeighbor, &paint);
619 builder.Translate(0, 700);
620 paint.setImageFilter(close.get());
622 flutter::DlImageSampling::kNearestNeighbor, &paint);
623 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
627 auto texture = CreateTextureForFixture(
"boston.jpg");
628 const float inner_color_matrix[20] = {
634 const float outer_color_matrix[20] = {
640 auto inner_color_filter =
641 flutter::DlColorFilter::MakeMatrix(inner_color_matrix);
642 auto outer_color_filter =
643 flutter::DlColorFilter::MakeMatrix(outer_color_matrix);
644 auto inner = flutter::DlImageFilter::MakeColorFilter(inner_color_filter);
645 auto outer = flutter::DlImageFilter::MakeColorFilter(outer_color_filter);
646 auto compose = std::make_shared<flutter::DlComposeImageFilter>(outer, inner);
648 flutter::DisplayListBuilder builder;
649 flutter::DlPaint paint;
650 paint.setImageFilter(compose.get());
652 flutter::DlImageSampling::kNearestNeighbor, &paint);
653 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
657 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
659 auto callback = [&]() {
660 static float sigma[] = {10, 10};
661 static float ctm_scale = 1;
662 static bool use_bounds =
true;
663 static bool draw_circle =
true;
664 static bool add_clip =
true;
666 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
667 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
668 ImGui::SliderFloat(
"Scale", &ctm_scale, 0, 10);
671 "If everything is working correctly, none of the options below should "
672 "impact the filter's appearance.");
673 ImGui::Checkbox(
"Use SaveLayer bounds", &use_bounds);
674 ImGui::Checkbox(
"Draw child element", &draw_circle);
675 ImGui::Checkbox(
"Add pre-clip", &add_clip);
678 flutter::DisplayListBuilder builder;
680 Vector2 scale = ctm_scale * GetContentScale();
681 builder.Scale(scale.
x, scale.
y);
683 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
684 flutter::DlTileMode::kClamp);
686 std::optional<DlRect> bounds;
691 bounds = DlRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
697 builder.ClipRect(DlRect::MakeLTRB(0, 0, 99999, 99999),
698 flutter::DlClipOp::kIntersect,
true);
702 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
703 builder.SaveLayer(bounds,
nullptr, &filter);
709 flutter::DlPaint paint;
710 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
711 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
712 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
713 paint.setStrokeWidth(10);
714 paint.setColor(flutter::DlColor::kRed().withAlpha(100));
715 builder.DrawCircle(
DlPoint(circle_center.x, circle_center.y), 100, paint);
718 return builder.Build();
721 ASSERT_TRUE(OpenPlaygroundHere(callback));
725 auto texture = CreateTextureForFixture(
"kalimba.jpg");
726 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
727 const flutter::DlTileMode tile_modes[] = {
728 flutter::DlTileMode::kClamp, flutter::DlTileMode::kRepeat,
729 flutter::DlTileMode::kMirror, flutter::DlTileMode::kDecal};
731 auto callback = [&]() {
732 static float sigma = 20;
733 static float bg_scale = 2.1;
734 static float rotate_degree = 0;
735 static float bounds_scale = 1.0;
736 static bool use_bounds =
true;
737 static int selected_tile_mode = 0;
739 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
740 ImGui::SliderFloat(
"Background scale", &bg_scale, 0, 10);
741 ImGui::SliderFloat(
"Sigma", &sigma, 0, 100);
742 ImGui::SliderFloat(
"Bounds rotate", &rotate_degree, -200, 200);
743 ImGui::SliderFloat(
"Bounds scale", &bounds_scale, 0.5f, 2.0f);
744 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
745 sizeof(tile_mode_names) /
sizeof(
char*));
747 ImGui::Checkbox(
"Bounded blur", &use_bounds);
755 Point p1_global = content_scale_transform * p1_raw;
756 Point p2_global = content_scale_transform * p2_raw;
758 flutter::DisplayListBuilder builder;
761 builder.
Scale(bg_scale, bg_scale);
763 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
772 Point p1 = inverse_transform * p1_global;
773 Point p2 = inverse_transform * p2_global;
775 DlRect::MakeLTRB(p2.
x, p1.
y, p1.
x, p2.
y).Scale(bounds_scale);
777 builder.ClipRect(bounds);
780 flutter::DlPaint save_paint;
781 save_paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
783 std::optional<DlRect> blur_bounds;
785 blur_bounds = bounds;
787 auto filter = flutter::DlBlurImageFilter(
788 sigma, sigma, tile_modes[selected_tile_mode], blur_bounds);
789 builder.SaveLayer(std::nullopt, &save_paint, &filter);
793 return builder.Build();
796 ASSERT_TRUE(OpenPlaygroundHere(callback));
801 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
802 flutter::DisplayListBuilder builder;
803 auto size = texture->GetSize();
804 builder.DrawImageNine(
806 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
807 size.height * 3 / 4),
808 DlRect::MakeLTRB(0, 0, size.width * 2, size.height * 2),
809 flutter::DlFilterMode::kNearest,
nullptr);
810 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
817 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
818 flutter::DisplayListBuilder builder;
819 auto size = texture->GetSize();
820 builder.DrawImageNine(
822 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
823 size.height * 3 / 4),
824 DlRect::MakeLTRB(0, 0, size.width / 2, size.height),
825 flutter::DlFilterMode::kNearest,
nullptr);
826 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
833 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
834 flutter::DisplayListBuilder builder;
835 auto size = texture->GetSize();
836 builder.DrawImageNine(
838 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
839 size.height * 3 / 4),
840 DlRect::MakeLTRB(0, 0, size.width, size.height / 2),
841 flutter::DlFilterMode::kNearest,
nullptr);
842 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
848 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
849 flutter::DisplayListBuilder builder;
850 auto size = texture->GetSize();
851 builder.DrawImageNine(
853 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
854 size.height * 3 / 4),
855 DlRect::MakeLTRB(0, 0, size.width / 2, size.height / 2),
856 flutter::DlFilterMode::kNearest,
nullptr);
857 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
863 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
864 flutter::DisplayListBuilder builder;
865 auto size = texture->GetSize();
866 builder.DrawImageNine(
868 DlIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
869 size.height * 3 / 4),
870 DlRect::MakeLTRB(0, 0, size.width / 4, size.height / 4),
871 flutter::DlFilterMode::kNearest,
nullptr);
872 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
878 auto texture = CreateTextureForFixture(
"nine_patch_corners.png");
879 flutter::DisplayListBuilder builder;
881 DlIRect::MakeXYWH(10, 10, 1, 1),
882 DlRect::MakeXYWH(0, 0, 200, 100),
883 flutter::DlFilterMode::kNearest,
nullptr);
884 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
888 auto texture = CreateTextureForFixture(
"nine_patch2.png");
890 auto filter = flutter::DlColorFilter::MakeBlend(flutter::DlColor::kGreen(),
891 flutter::DlBlendMode::kSrcIn);
892 flutter::DlPaint paint;
893 paint.setColorFilter(filter);
895 flutter::DisplayListBuilder builder;
897 DlIRect::MakeXYWH(10, 10, 1, 1),
898 DlRect::MakeXYWH(0, 0, 200, 100),
899 flutter::DlFilterMode::kNearest, &paint);
900 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
904 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::kYellow().withAlpha(127))
923 builder.Translate(50, 50);
924 for (
auto cap : caps) {
925 paint.setStrokeCap(cap);
927 builder.DrawPoints(flutter::DlPointMode::kPoints, 7,
points, paint);
928 builder.Translate(150, 0);
929 builder.DrawPoints(flutter::DlPointMode::kLines, 5,
points, paint);
930 builder.Translate(150, 0);
931 builder.DrawPoints(flutter::DlPointMode::kPolygon, 5,
points, paint);
933 builder.Translate(0, 150);
935 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
939 flutter::DisplayListBuilder builder;
940 std::vector<flutter::DlStrokeCap> caps = {
941 flutter::DlStrokeCap::kButt,
942 flutter::DlStrokeCap::kRound,
943 flutter::DlStrokeCap::kSquare,
945 flutter::DlPaint paint =
947 .setColor(flutter::DlColor::kYellow().withAlpha(127))
948 .setDrawStyle(flutter::DlDrawStyle::kStroke)
949 .setStrokeCap(flutter::DlStrokeCap::kButt)
951 DlPath path = DlPath::MakeLine({150, 50}, {150, 50});
952 for (
auto cap : caps) {
953 paint.setStrokeCap(cap);
955 builder.DrawPath(path, paint);
956 builder.Translate(0, 150);
958 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
962 flutter::DisplayListBuilder builder;
963 flutter::DlPaint paint;
965 auto content_scale = GetContentScale() * 0.8;
966 builder.Scale(content_scale.x, content_scale.y);
968 constexpr
size_t star_spikes = 5;
969 constexpr
DlScalar half_spike_rotation =
kPi / star_spikes;
972 constexpr
DlScalar outer_radius = radius + spike_size;
973 constexpr
DlScalar inner_radius = radius - spike_size;
974 std::array<DlPoint, star_spikes * 2> star;
975 for (
size_t i = 0; i < star_spikes; i++) {
976 const DlScalar rotation = half_spike_rotation * i * 2;
977 star[i * 2] =
DlPoint(50 + std::sin(rotation) * outer_radius,
978 50 - std::cos(rotation) * outer_radius);
980 DlPoint(50 + std::sin(rotation + half_spike_rotation) * inner_radius,
981 50 - std::cos(rotation + half_spike_rotation) * inner_radius);
984 std::array<DlPath, 4> paths = {
985 DlPath::MakeRect(DlRect::MakeXYWH(0, 0, 200, 100)),
986 DlPath::MakeRoundRectXY(DlRect::MakeXYWH(20, 0, 200, 100), 30, 30),
987 DlPath::MakeCircle(
DlPoint(100, 50), 50),
988 DlPath::MakePoly(star.data(), star.size(),
true),
990 paint.setColor(flutter::DlColor::kWhite());
991 builder.DrawPaint(paint);
992 paint.setColor(flutter::DlColor::kCyan());
993 builder.Translate(100, 50);
994 for (
size_t x = 0;
x < paths.size();
x++) {
996 for (
size_t y = 0; y < 6; y++) {
997 builder.DrawShadow(paths[
x], flutter::DlColor::kBlack(), 3 + y * 8,
false,
999 builder.DrawPath(paths[
x], paint);
1000 builder.Translate(0, 150);
1003 builder.Translate(250, 0);
1006 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1010 flutter::DisplayListBuilder builder;
1011 std::vector<flutter::DlStrokeCap> caps = {
1012 flutter::DlStrokeCap::kButt,
1013 flutter::DlStrokeCap::kRound,
1014 flutter::DlStrokeCap::kSquare,
1016 flutter::DlPaint paint =
1018 .setColor(flutter::DlColor::kWhite())
1019 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1021 flutter::DlPaint outline_paint =
1023 .setColor(flutter::DlColor::kYellow())
1024 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1025 .setStrokeCap(flutter::DlStrokeCap::kSquare)
1027 DlPath path = DlPath::MakeLine({150, 50}, {160, 50});
1028 for (
auto cap : caps) {
1029 paint.setStrokeCap(cap);
1031 builder.DrawRect(DlRect::MakeLTRB(45, 45, 65, 55), outline_paint);
1033 if (cap != flutter::DlStrokeCap::kButt) {
1034 builder.DrawRect(DlRect::MakeLTRB(95, 45, 105, 55), outline_paint);
1036 builder.DrawPath(path, paint);
1037 builder.DrawRect(path.GetBounds().Expand(5, 5), outline_paint);
1038 builder.Translate(0, 150);
1040 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1044 auto boston = CreateTextureForFixture(
"boston.jpg");
1046 auto callback = [&]() {
1047 static int selected_matrix_type = 0;
1048 const char* matrix_type_names[] = {
"Matrix",
"Local Matrix"};
1050 static float ctm_translation[2] = {200, 200};
1051 static float ctm_scale[2] = {0.65, 0.65};
1052 static float ctm_skew[2] = {0, 0};
1054 static bool enable =
true;
1055 static float translation[2] = {100, 100};
1056 static float scale[2] = {0.8, 0.8};
1057 static float skew[2] = {0.2, 0.2};
1059 static bool enable_savelayer =
true;
1061 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1063 ImGui::Combo(
"Filter type", &selected_matrix_type, matrix_type_names,
1064 sizeof(matrix_type_names) /
sizeof(
char*));
1066 ImGui::TextWrapped(
"Current Transform");
1067 ImGui::SliderFloat2(
"CTM Translation", ctm_translation, 0, 1000);
1068 ImGui::SliderFloat2(
"CTM Scale", ctm_scale, 0, 3);
1069 ImGui::SliderFloat2(
"CTM Skew", ctm_skew, -3, 3);
1072 "MatrixFilter and LocalMatrixFilter modify the CTM in the same way. "
1073 "The only difference is that MatrixFilter doesn't affect the effect "
1074 "transform, whereas LocalMatrixFilter does.");
1077 ImGui::Checkbox(
"Enable", &enable);
1078 ImGui::SliderFloat2(
"Filter Translation", translation, 0, 1000);
1079 ImGui::SliderFloat2(
"Filter Scale", scale, 0, 3);
1080 ImGui::SliderFloat2(
"Filter Skew", skew, -3, 3);
1083 "Rendering the filtered image within a layer can expose bounds "
1084 "issues. If the rendered image gets cut off when this setting is "
1085 "enabled, there's a coverage bug in the filter.");
1086 ImGui::Checkbox(
"Render in layer", &enable_savelayer);
1090 flutter::DisplayListBuilder builder;
1091 flutter::DlPaint paint;
1093 if (enable_savelayer) {
1094 builder.SaveLayer(std::nullopt,
nullptr);
1097 auto content_scale = GetContentScale();
1098 builder.Scale(content_scale.x, content_scale.y);
1102 ctm_scale[0], ctm_skew[0], 0.0f, ctm_translation[0],
1103 ctm_skew[1], ctm_scale[1], 0.0f, ctm_translation[1],
1106 builder.Transform(ctm_matrix);
1109 auto filter_matrix =
1111 skew[1], scale[1], 0.0f, translation[1],
1112 0.0f, 0.0f, 1.0f, 0.0f,
1113 0.0f, 0.0f, 0.0f, 1.0f);
1116 switch (selected_matrix_type) {
1118 auto filter = flutter::DlMatrixImageFilter(
1119 filter_matrix, flutter::DlImageSampling::kLinear);
1120 paint.setImageFilter(&filter);
1124 auto internal_filter =
1125 flutter::DlBlurImageFilter(10, 10, flutter::DlTileMode::kDecal)
1127 auto filter = flutter::DlLocalMatrixImageFilter(filter_matrix,
1129 paint.setImageFilter(&filter);
1136 flutter::DlImageSampling::kLinear, &paint);
1138 if (enable_savelayer) {
1142 return builder.Build();
1145 ASSERT_TRUE(OpenPlaygroundHere(callback));
1149 auto callback = [&]() {
1150 static float translation[2] = {0, 0};
1151 static bool enable_save_layer =
true;
1153 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1154 ImGui::SliderFloat2(
"Translation", translation, -130, 130);
1155 ImGui::Checkbox(
"Enable save layer", &enable_save_layer);
1158 flutter::DisplayListBuilder builder;
1160 builder.Scale(2.0, 2.0);
1161 flutter::DlPaint paint;
1162 paint.setColor(flutter::DlColor::kYellow());
1163 builder.DrawRect(DlRect::MakeWH(300, 300), paint);
1164 paint.setStrokeWidth(1.0);
1165 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1166 paint.setColor(flutter::DlColor::kBlack().withAlpha(0x80));
1170 flutter::DlPaint save_paint;
1171 DlRect bounds = DlRect::MakeXYWH(100, 100, 100, 100);
1172 Matrix translate_matrix =
1174 if (enable_save_layer) {
1175 auto filter = flutter::DlMatrixImageFilter(
1176 translate_matrix, flutter::DlImageSampling::kNearestNeighbor);
1177 save_paint.setImageFilter(filter.shared());
1178 builder.SaveLayer(bounds, &save_paint);
1181 builder.Transform(translate_matrix);
1186 filter_matrix.
Scale({0.2f, 0.2f});
1188 auto filter = flutter::DlMatrixImageFilter(
1189 filter_matrix, flutter::DlImageSampling::kNearestNeighbor);
1191 save_paint.setImageFilter(filter.shared());
1193 builder.SaveLayer(bounds, &save_paint);
1194 flutter::DlPaint paint2;
1195 paint2.setColor(flutter::DlColor::kBlue());
1196 builder.DrawRect(bounds, paint2);
1199 return builder.Build();
1202 ASSERT_TRUE(OpenPlaygroundHere(callback));
1206 flutter::DlPaint paint;
1207 paint.setColor(flutter::DlColor(0xFF2196F3).withAlpha(128));
1208 flutter::DisplayListBuilder builder;
1209 paint.setColorFilter(flutter::DlColorFilter::MakeLinearToSrgbGamma());
1210 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
1211 builder.Translate(0, 200);
1213 paint.setColorFilter(flutter::DlColorFilter::MakeSrgbToLinearGamma());
1214 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), paint);
1216 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1220 const flutter::DlColor colors[2] = {
1221 flutter::DlColor(0xFFF44336),
1222 flutter::DlColor(0xFF2196F3),
1224 const float stops[2] = {0.0, 1.0};
1225 flutter::DlPaint paint;
1226 flutter::DisplayListBuilder builder;
1227 auto clip_bounds = DlRect::MakeWH(300.0, 300.0);
1229 builder.Translate(100, 100);
1230 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1232 flutter::DlColorSource::MakeLinear({0.0, 0.0}, {100.0, 100.0}, 2, colors,
1233 stops, flutter::DlTileMode::kRepeat);
1234 paint.setColorSource(linear);
1235 builder.DrawPaint(paint);
1239 builder.Translate(500, 100);
1240 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1241 auto radial = flutter::DlColorSource::MakeRadial(
1242 {100.0, 100.0}, 100.0, 2, colors, stops, flutter::DlTileMode::kRepeat);
1243 paint.setColorSource(radial);
1244 builder.DrawPaint(paint);
1248 builder.Translate(100, 500);
1249 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1251 flutter::DlColorSource::MakeSweep({100.0, 100.0}, 180.0, 270.0, 2, colors,
1252 stops, flutter::DlTileMode::kRepeat);
1253 paint.setColorSource(sweep);
1254 builder.DrawPaint(paint);
1258 builder.Translate(500, 500);
1259 builder.ClipRect(clip_bounds, flutter::DlClipOp::kIntersect,
false);
1260 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
1262 flutter::DlTileMode::kRepeat,
1263 flutter::DlTileMode::kRepeat);
1264 paint.setColorSource(image);
1265 builder.DrawPaint(paint);
1268 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1272 flutter::DisplayListBuilder builder;
1275 builder.SaveLayer(std::nullopt,
nullptr);
1276 builder.Translate(100, 100);
1277 flutter::DlPaint paint;
1278 paint.setColor(flutter::DlColor::kRed());
1279 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1280 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1281 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
1282 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1286 builder.SaveLayer(std::nullopt,
nullptr);
1287 builder.Translate(300, 100);
1288 flutter::DlPaint paint;
1289 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1290 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1291 paint.setColor(flutter::DlColor::kRed());
1292 paint.setBlendMode(flutter::DlBlendMode::kDstOver);
1293 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1297 builder.SaveLayer(std::nullopt,
nullptr);
1298 builder.Translate(100, 300);
1299 flutter::DlPaint paint;
1300 paint.setColor(flutter::DlColor::kRed());
1301 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1302 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1303 paint.setBlendMode(flutter::DlBlendMode::kSrc);
1304 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1308 builder.SaveLayer(std::nullopt,
nullptr);
1309 builder.Translate(300, 300);
1310 flutter::DlPaint paint;
1311 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1312 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1313 paint.setColor(flutter::DlColor::kRed());
1314 paint.setBlendMode(flutter::DlBlendMode::kDst);
1315 builder.DrawRect(DlRect::MakeWH(200, 200), paint);
1319 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1323 flutter::DisplayListBuilder builder;
1324 const float green_color_matrix[20] = {
1330 const float blue_color_matrix[20] = {
1336 auto green_color_filter =
1337 flutter::DlColorFilter::MakeMatrix(green_color_matrix);
1338 auto blue_color_filter =
1339 flutter::DlColorFilter::MakeMatrix(blue_color_matrix);
1340 auto blue_image_filter =
1341 flutter::DlImageFilter::MakeColorFilter(blue_color_filter);
1343 flutter::DlPaint paint;
1344 paint.setColor(flutter::DlColor::kRed());
1345 paint.setColorFilter(green_color_filter);
1346 paint.setImageFilter(blue_image_filter);
1347 builder.DrawRect(DlRect::MakeLTRB(100, 100, 500, 500), paint);
1348 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1352 auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
1353 flutter::DlBlurStyle::kNormal, 10);
1355 flutter::DisplayListBuilder builder;
1357 std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
1358 flutter::DlColor::kGreen()};
1359 std::array<float, 2> stops = {0, 1};
1360 auto texture = CreateTextureForFixture(
"airplane.jpg");
1361 auto matrix = flutter::DlMatrix::MakeTranslation({-300, -110});
1362 std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
1363 flutter::DlColorSource::MakeImage(
1365 flutter::DlTileMode::kRepeat, flutter::DlImageSampling::kLinear,
1367 flutter::DlColorSource::MakeLinear(
1369 stops.data(), flutter::DlTileMode::kClamp),
1373 builder.Translate(0, 100);
1374 for (
const auto& color_source : color_sources) {
1375 flutter::DlPaint paint;
1376 paint.setColorSource(color_source);
1377 paint.setMaskFilter(blur_filter);
1380 builder.Translate(100, 0);
1381 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1382 builder.DrawRoundRect(
1383 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 30, 30), paint);
1385 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1386 paint.setStrokeWidth(10);
1387 builder.Translate(200, 0);
1388 builder.DrawRoundRect(
1389 DlRoundRect::MakeRectXY(DlRect::MakeWH(100, 50), 30, 30), paint);
1392 builder.Translate(0, 100);
1396 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1400 flutter::DisplayListBuilder builder;
1401 std::vector<flutter::DlStrokeJoin> joins = {
1402 flutter::DlStrokeJoin::kBevel,
1403 flutter::DlStrokeJoin::kRound,
1404 flutter::DlStrokeJoin::kMiter,
1406 flutter::DlPaint paint =
1408 .setColor(flutter::DlColor::kWhite())
1409 .setDrawStyle(flutter::DlDrawStyle::kFill)
1410 .setStrokeWidth(10);
1411 flutter::DlPaint stroke_paint =
1413 .setColor(flutter::DlColor::kWhite())
1414 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1415 .setStrokeWidth(10);
1416 DlPath path = DlPath::MakeLine({150, 50}, {160, 50});
1418 builder.Translate(300, 50);
1419 builder.Scale(0.8, 0.8);
1420 for (
auto join : joins) {
1421 paint.setStrokeJoin(join);
1422 stroke_paint.setStrokeJoin(join);
1423 builder.DrawRect(DlRect::MakeXYWH(0, 0, 100, 100), paint);
1424 builder.DrawRect(DlRect::MakeXYWH(0, 150, 100, 100), stroke_paint);
1425 builder.DrawRoundRect(
1426 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(150, 0, 100, 100), 30, 30),
1428 builder.DrawRoundRect(
1429 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(150, 150, 100, 100), 30, 30),
1431 builder.DrawCircle(
DlPoint(350, 50), 50, paint);
1432 builder.DrawCircle(
DlPoint(350, 200), 50, stroke_paint);
1433 builder.Translate(0, 300);
1435 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1439 auto callback = [&]() {
1440 static float filled_radius = 100.0;
1441 static float filled_alpha = 255.0;
1442 static float filled_scale[2] = {1.0, 1.0};
1443 static float stroked_radius = 20.0;
1444 static float stroke_width = 10.0;
1445 static float stroke_width_fine = 0.0;
1446 static float stroked_alpha = 255.0;
1447 static float stroked_scale[2] = {1.0, 1.0};
1449 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1451 ImGui::SliderFloat(
"Filled Radius", &filled_radius, 0, 500);
1452 ImGui::SliderFloat(
"Filled Alpha", &filled_alpha, 0, 255);
1453 ImGui::SliderFloat2(
"Filled Scale", filled_scale, 0, 10.0);
1454 ImGui::SliderFloat(
"Stroked Radius", &stroked_radius, 0, 500);
1455 ImGui::SliderFloat(
"Stroked Width", &stroke_width, 0, 500);
1456 ImGui::SliderFloat(
"Stroked Width Fine", &stroke_width_fine, 0, 5);
1457 ImGui::SliderFloat(
"Stroked Alpha", &stroked_alpha, 0, 10.0);
1458 ImGui::SliderFloat2(
"Stroked Scale", stroked_scale, 0, 10.0);
1462 flutter::DisplayListBuilder builder;
1463 flutter::DlPaint paint;
1465 paint.setColor(flutter::DlColor::kBlue().withAlpha(filled_alpha));
1466 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1468 builder.Scale(filled_scale[0], filled_scale[1]);
1469 builder.DrawCircle(
DlPoint(500, 750), filled_radius, paint);
1472 paint.setColor(flutter::DlColor::kRed().withAlpha(stroked_alpha));
1473 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1474 paint.setStrokeWidth(stroke_width + stroke_width_fine);
1476 builder.Scale(stroked_scale[0], stroked_scale[1]);
1477 builder.DrawCircle(
DlPoint(1250, 750), stroked_radius, paint);
1479 return builder.Build();
1482 ASSERT_TRUE(OpenPlaygroundHere(callback));
1486 flutter::DisplayListBuilder builder;
1488 flutter::DlPaint fill_paint =
1490 .setColor(flutter::DlColor::kBlue())
1491 .setDrawStyle(flutter::DlDrawStyle::kFill)
1492 .setStrokeWidth(10);
1493 flutter::DlPaint stroke_paint =
1495 .setColor(flutter::DlColor::kGreen())
1496 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1497 .setStrokeWidth(10);
1499 builder.DrawRoundRect(
1500 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1502 builder.DrawRoundRect(
1503 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1506 builder.DrawRoundRect(
1507 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1509 builder.DrawRoundRect(
1510 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1513 flutter::DlPaint reference_paint =
1515 .setColor(flutter::DlColor::kMidGrey())
1516 .setDrawStyle(flutter::DlDrawStyle::kFill)
1517 .setStrokeWidth(10);
1519 builder.DrawRoundRect(
1520 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(500, 500, 300, 300), 40, 40),
1522 builder.DrawRoundRect(
1523 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 100, 300, 300), 120, 120),
1526 flutter::DlPaint clip_fill_paint =
1528 .setColor(flutter::DlColor::kCyan())
1529 .setDrawStyle(flutter::DlDrawStyle::kFill)
1530 .setStrokeWidth(10);
1533 builder.ClipRoundRect(
1534 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(900, 100, 300, 300), 120, 40));
1535 builder.DrawPaint(clip_fill_paint);
1539 builder.ClipRoundRect(
1540 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(100, 900, 300, 300), 40, 120));
1541 builder.DrawPaint(clip_fill_paint);
1544 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1548 std::vector<const char*> blend_mode_names;
1549 std::vector<flutter::DlBlendMode> blend_mode_values;
1551 const std::vector<std::tuple<const char*, flutter::DlBlendMode>> blends = {
1553 {
"Clear", flutter::DlBlendMode::kClear},
1554 {
"Source", flutter::DlBlendMode::kSrc},
1555 {
"Destination", flutter::DlBlendMode::kDst},
1556 {
"SourceOver", flutter::DlBlendMode::kSrcOver},
1557 {
"DestinationOver", flutter::DlBlendMode::kDstOver},
1558 {
"SourceIn", flutter::DlBlendMode::kSrcIn},
1559 {
"DestinationIn", flutter::DlBlendMode::kDstIn},
1560 {
"SourceOut", flutter::DlBlendMode::kSrcOut},
1561 {
"DestinationOut", flutter::DlBlendMode::kDstOut},
1562 {
"SourceATop", flutter::DlBlendMode::kSrcATop},
1563 {
"DestinationATop", flutter::DlBlendMode::kDstATop},
1564 {
"Xor", flutter::DlBlendMode::kXor},
1565 {
"Plus", flutter::DlBlendMode::kPlus},
1566 {
"Modulate", flutter::DlBlendMode::kModulate},
1568 {
"Screen", flutter::DlBlendMode::kScreen},
1569 {
"Overlay", flutter::DlBlendMode::kOverlay},
1570 {
"Darken", flutter::DlBlendMode::kDarken},
1571 {
"Lighten", flutter::DlBlendMode::kLighten},
1572 {
"ColorDodge", flutter::DlBlendMode::kColorDodge},
1573 {
"ColorBurn", flutter::DlBlendMode::kColorBurn},
1574 {
"HardLight", flutter::DlBlendMode::kHardLight},
1575 {
"SoftLight", flutter::DlBlendMode::kSoftLight},
1576 {
"Difference", flutter::DlBlendMode::kDifference},
1577 {
"Exclusion", flutter::DlBlendMode::kExclusion},
1578 {
"Multiply", flutter::DlBlendMode::kMultiply},
1579 {
"Hue", flutter::DlBlendMode::kHue},
1580 {
"Saturation", flutter::DlBlendMode::kSaturation},
1581 {
"Color", flutter::DlBlendMode::kColor},
1582 {
"Luminosity", flutter::DlBlendMode::kLuminosity},
1584 assert(blends.size() ==
1585 static_cast<size_t>(flutter::DlBlendMode::kLastMode) + 1);
1586 for (
const auto& [name, mode] : blends) {
1587 blend_mode_names.push_back(name);
1588 blend_mode_values.push_back(mode);
1592 auto callback = [&]() {
1593 static int current_blend_index = 3;
1594 static float dst_alpha = 1;
1595 static float src_alpha = 1;
1596 static float color0[4] = {1.0f, 0.0f, 0.0f, 1.0f};
1597 static float color1[4] = {0.0f, 1.0f, 0.0f, 1.0f};
1598 static float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
1599 static float src_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1601 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1603 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
1604 blend_mode_names.data(), blend_mode_names.size());
1605 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
1606 ImGui::ColorEdit4(
"Color A", color0);
1607 ImGui::ColorEdit4(
"Color B", color1);
1608 ImGui::ColorEdit4(
"Color C", color2);
1609 ImGui::ColorEdit4(
"Source Color", src_color);
1610 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
1614 std::vector<DlPoint> positions = {
DlPoint(100, 300),
1617 std::vector<flutter::DlColor> colors = {
1618 toColor(color0).modulateOpacity(dst_alpha),
1619 toColor(color1).modulateOpacity(dst_alpha),
1620 toColor(color2).modulateOpacity(dst_alpha)};
1622 auto vertices = flutter::DlVertices::Make(
1623 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1624 nullptr, colors.data());
1626 flutter::DisplayListBuilder builder;
1627 flutter::DlPaint paint;
1629 paint.setColor(
toColor(src_color).modulateOpacity(src_alpha));
1630 builder.DrawVertices(vertices, blend_mode_values[current_blend_index],
1632 return builder.Build();
1635 ASSERT_TRUE(OpenPlaygroundHere(callback));
1639 flutter::DisplayListBuilder builder;
1640 builder.DrawPaint(flutter::DlPaint().setColor(flutter::DlColor::kWhite()));
1642 auto filter = flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
1643 builder.DrawCircle(
DlPoint(300, 300), 200,
1644 flutter::DlPaint().setMaskFilter(&filter));
1646 std::vector<flutter::DlColor> colors = {flutter::DlColor::kGreen(),
1647 flutter::DlColor::kGreen()};
1648 const float stops[2] = {0.0, 1.0};
1649 auto linear = flutter::DlColorSource::MakeLinear(
1650 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
1651 flutter::DlTileMode::kRepeat);
1652 flutter::DlPaint blend_paint =
1654 .setColorSource(linear)
1655 .setBlendMode(flutter::DlBlendMode::kScreen);
1656 builder.DrawPaint(blend_paint);
1658 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1662 flutter::DisplayListBuilder builder;
1663 builder.DrawColor(flutter::DlColor::kWhite(), flutter::DlBlendMode::kSrc);
1664 Vector2 scale = GetContentScale();
1665 builder.Scale(scale.
x, scale.
y);
1669 builder.Translate(1.0f, 1.0f);
1671 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kSolid, 5.0f);
1672 flutter::DlPaint solid_alpha_paint =
1674 .setMaskFilter(solid_filter)
1675 .setColor(flutter::DlColor::kBlue())
1677 for (
int x = 1;
x <= 4;
x++) {
1678 for (
int y = 1; y <= 4; y++) {
1679 builder.DrawRect(DlRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1686 builder.Translate(500.0f, 0.0f);
1687 auto normal_filter =
1688 flutter::DlBlurMaskFilter::Make(flutter::DlBlurStyle::kNormal, 5.0f);
1689 auto rotate_if = flutter::DlMatrixImageFilter::Make(
1691 flutter::DlPaint normal_if_paint =
1693 .setMaskFilter(solid_filter)
1694 .setImageFilter(rotate_if)
1695 .setColor(flutter::DlColor::kGreen())
1697 for (
int x = 1;
x <= 4;
x++) {
1698 for (
int y = 1; y <= 4; y++) {
1699 builder.DrawRect(DlRect::MakeXYWH(
x * 100, y * 100, 80, 80),
1705 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
static sk_sp< DlImageImpeller > Make(std::shared_ptr< Texture > texture, OwningContext owning_context=OwningContext::kIO)
TEST_P(AiksTest, DrawAtlasNoColor)
flutter::DlColor toColor(const float *components)
INSTANTIATE_PLAYGROUND_SUITE(AiksTest)
Point DrawPlaygroundPoint(PlaygroundPoint &point)
std::tuple< Point, Point > DrawPlaygroundLine(PlaygroundPoint &point_a, PlaygroundPoint &point_b)
flutter::DlScalar DlScalar
static uint32_t ToIColor(Color color)
Convert this color to a 32-bit representation.
static constexpr Color White()
static constexpr Color Red()
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
constexpr Matrix Translate(const Vector3 &t) const
static constexpr Matrix MakeRow(Scalar m0, Scalar m1, Scalar m2, Scalar m3, Scalar m4, Scalar m5, Scalar m6, Scalar m7, Scalar m8, Scalar m9, Scalar m10, Scalar m11, Scalar m12, Scalar m13, Scalar m14, Scalar m15)
constexpr Matrix Scale(const Vector3 &s) const
static Matrix MakeRotationZ(Radians r)
static constexpr Matrix MakeScale(const Vector3 &s)
std::vector< Point > points