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