5 #include "display_list/dl_sampling_options.h" 
    6 #include "display_list/dl_tile_mode.h" 
    7 #include "display_list/effects/dl_color_source.h" 
    8 #include "display_list/effects/dl_mask_filter.h" 
   11 #include "flutter/display_list/dl_blend_mode.h" 
   12 #include "flutter/display_list/dl_builder.h" 
   13 #include "flutter/display_list/dl_color.h" 
   14 #include "flutter/display_list/dl_paint.h" 
   15 #include "flutter/display_list/effects/dl_color_filter.h" 
   16 #include "flutter/display_list/geometry/dl_path_builder.h" 
   17 #include "flutter/testing/testing.h" 
   28   DisplayListBuilder builder;
 
   29   builder.Transform(DlMatrix::MakeTranslation(
DlPoint(300, 300)) *
 
   30                     DlMatrix::MakeRotationZ(DlDegrees(90)));
 
   32   DlPathBuilder arrow_stem;
 
   33   DlPathBuilder arrow_head;
 
   36   arrow_head.MoveTo(
DlPoint(50, 120))
 
   41       DlColorFilter::MakeBlend(DlColor::kAliceBlue(), DlBlendMode::kSrcIn);
 
   44   paint.setStrokeWidth(15.0);
 
   45   paint.setStrokeCap(DlStrokeCap::kRound);
 
   46   paint.setStrokeJoin(DlStrokeJoin::kRound);
 
   47   paint.setDrawStyle(DlDrawStyle::kStroke);
 
   48   paint.setColorFilter(filter);
 
   49   paint.setColor(DlColor::kBlack());
 
   51   builder.DrawPath(arrow_stem.TakePath(), paint);
 
   52   builder.DrawPath(arrow_head.TakePath(), paint);
 
   54   auto dl = builder.Build();
 
   55   ASSERT_TRUE(OpenPlaygroundHere(dl));
 
   59   DisplayListBuilder builder;
 
   61   paint.setColor(DlColor::kRed());
 
   62   paint.setStrokeWidth(20);
 
   63   paint.setDrawStyle(DlDrawStyle::kStroke);
 
   65   builder.DrawPath(DlPath::MakeLine(
DlPoint(200, 100), 
DlPoint(800, 100)),
 
   68   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
   72   DisplayListBuilder builder;
 
   74   paint.setColor(DlColor::kRed());
 
   75   paint.setStrokeWidth(25);
 
   76   paint.setDrawStyle(DlDrawStyle::kStroke);
 
   78   builder.DrawPath(DlPath::MakeCircle(
DlPoint(500, 500), 250), paint);
 
   80   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
   84   DisplayListBuilder builder;
 
   86   paint.setColor(DlColor::kRed());
 
   87   paint.setStrokeWidth(100);
 
   88   paint.setDrawStyle(DlDrawStyle::kStroke);
 
   90   builder.DrawPath(DlPath::MakeCircle(
DlPoint(100, 100), 50), paint);
 
   92   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
   96   DisplayListBuilder builder;
 
   98   paint.setColor(DlColor::kRed());
 
   99   paint.setStrokeWidth(0.01);
 
  100   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  102   builder.DrawPath(DlPath::MakeCircle(
DlPoint(100, 100), 50), paint);
 
  104   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  108   DisplayListBuilder builder;
 
  110   paint.setColor(DlColor::kRed());
 
  111   paint.setStrokeWidth(200);
 
  112   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  114   DlPath path = DlPath::MakeArc(DlRect::MakeXYWH(100, 100, 200, 200),  
 
  115                                 DlDegrees(0), DlDegrees(90), 
false);
 
  117   builder.DrawPath(path, paint);
 
  119   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  123   DisplayListBuilder builder;
 
  126   paint.setColor(DlColor::kRed());
 
  127   paint.setStrokeWidth(20);
 
  128   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  130   DlPathBuilder path_builder;
 
  131   path_builder.MoveTo(
DlPoint(0, 200));
 
  135   builder.DrawPath(path_builder.TakePath(), paint);
 
  136   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  140   DisplayListBuilder builder;
 
  143   paint.setColor(DlColor::kRed());
 
  144   paint.setStrokeWidth(50);
 
  145   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  146   paint.setStrokeCap(DlStrokeCap::kRound);
 
  150   DlPathBuilder path_builder;
 
  151   path_builder.MoveTo(
DlPoint(250, 250));
 
  152   path_builder.QuadraticCurveTo(
DlPoint(100, 100), 
DlPoint(250, 250));
 
  154   builder.DrawPath(path_builder.TakePath(), paint);
 
  156   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  160   DisplayListBuilder builder;
 
  161   builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  164   paint.setColor(DlColor::kRed());
 
  165   paint.setDrawStyle(DlDrawStyle::kFill);
 
  167   DlPaint reference_paint;
 
  168   reference_paint.setColor(DlColor::kGreen());
 
  169   reference_paint.setDrawStyle(DlDrawStyle::kFill);
 
  171   DlPathBuilder path_builder;
 
  172   DlPathBuilder reference_builder;
 
  175   path_builder.MoveTo(
DlPoint(100, 100));
 
  176   path_builder.ConicCurveTo(
DlPoint(150, 150), 
DlPoint(200, 100), 1.0f);
 
  177   reference_builder.MoveTo(
DlPoint(300, 100));
 
  178   reference_builder.QuadraticCurveTo(
DlPoint(350, 150), 
DlPoint(400, 100));
 
  181   path_builder.MoveTo(
DlPoint(100, 200));
 
  183   reference_builder.MoveTo(
DlPoint(300, 200));
 
  184   auto magic = DlPathBuilder::kArcApproximationMagic;
 
  185   reference_builder.CubicCurveTo(
DlPoint(300, 200) + 
DlPoint(50, 50) * magic,
 
  190   path_builder.MoveTo(
DlPoint(100, 300));
 
  191   path_builder.ConicCurveTo(
DlPoint(150, 350), 
DlPoint(200, 300), 0.01f);
 
  192   reference_builder.MoveTo(
DlPoint(300, 300));
 
  193   reference_builder.LineTo(
DlPoint(350, 300.5));
 
  194   reference_builder.LineTo(
DlPoint(400, 300));
 
  197   path_builder.MoveTo(
DlPoint(100, 400));
 
  198   path_builder.ConicCurveTo(
DlPoint(150, 450), 
DlPoint(200, 400), 100.0f);
 
  199   reference_builder.MoveTo(
DlPoint(300, 400));
 
  200   reference_builder.LineTo(
DlPoint(350, 450));
 
  201   reference_builder.LineTo(
DlPoint(400, 400));
 
  203   builder.DrawPath(path_builder.TakePath(), paint);
 
  204   builder.DrawPath(reference_builder.TakePath(), reference_paint);
 
  206   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  210   DisplayListBuilder builder;
 
  211   builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  214   paint.setColor(DlColor::kRed());
 
  215   paint.setStrokeWidth(10);
 
  216   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  217   paint.setStrokeCap(DlStrokeCap::kRound);
 
  218   paint.setStrokeJoin(DlStrokeJoin::kRound);
 
  220   DlPaint reference_paint;
 
  221   reference_paint.setColor(DlColor::kGreen());
 
  222   reference_paint.setStrokeWidth(10);
 
  223   reference_paint.setDrawStyle(DlDrawStyle::kStroke);
 
  224   reference_paint.setStrokeCap(DlStrokeCap::kRound);
 
  225   reference_paint.setStrokeJoin(DlStrokeJoin::kRound);
 
  227   DlPathBuilder path_builder;
 
  228   DlPathBuilder reference_builder;
 
  231   path_builder.MoveTo(
DlPoint(100, 100));
 
  232   path_builder.ConicCurveTo(
DlPoint(150, 150), 
DlPoint(200, 100), 1.0f);
 
  233   reference_builder.MoveTo(
DlPoint(300, 100));
 
  234   reference_builder.QuadraticCurveTo(
DlPoint(350, 150), 
DlPoint(400, 100));
 
  237   path_builder.MoveTo(
DlPoint(100, 200));
 
  239   reference_builder.MoveTo(
DlPoint(300, 200));
 
  240   auto magic = DlPathBuilder::kArcApproximationMagic;
 
  241   reference_builder.CubicCurveTo(
DlPoint(300, 200) + 
DlPoint(50, 50) * magic,
 
  246   path_builder.MoveTo(
DlPoint(100, 300));
 
  247   path_builder.ConicCurveTo(
DlPoint(150, 350), 
DlPoint(200, 300), 0.0f);
 
  248   reference_builder.MoveTo(
DlPoint(300, 300));
 
  249   reference_builder.LineTo(
DlPoint(400, 300));
 
  252   path_builder.MoveTo(
DlPoint(100, 400));
 
  253   path_builder.ConicCurveTo(
DlPoint(150, 450), 
DlPoint(200, 400), 100.0f);
 
  254   reference_builder.MoveTo(
DlPoint(300, 400));
 
  255   reference_builder.LineTo(
DlPoint(350, 450));
 
  256   reference_builder.LineTo(
DlPoint(400, 400));
 
  258   builder.DrawPath(path_builder.TakePath(), paint);
 
  259   builder.DrawPath(reference_builder.TakePath(), reference_paint);
 
  261   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  268   auto callback = [&]() -> sk_sp<DisplayList> {
 
  270                              ImGuiWindowFlags_AlwaysAutoResize)) {
 
  271       ImGui::SliderFloat(
"Scale", &scale, 0, 6);
 
  272       ImGui::SliderFloat(
"Rotate", &rotation, 0, 90);
 
  273       ImGui::SliderFloat(
"Offset", &offset, 0, 2);
 
  277     DisplayListBuilder builder;
 
  278     builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  279     builder.DrawPaint(DlPaint(DlColor(0xff111111)));
 
  282     paint.setStrokeWidth(0.f);
 
  283     paint.setColor(DlColor::kWhite());
 
  284     paint.setStrokeCap(DlStrokeCap::kRound);
 
  285     paint.setStrokeJoin(DlStrokeJoin::kRound);
 
  286     paint.setDrawStyle(DlDrawStyle::kStroke);
 
  288     builder.Translate(512, 384);
 
  289     builder.Scale(scale, scale);
 
  290     builder.Rotate(rotation);
 
  291     builder.Translate(-512, -384 + offset);
 
  293     for (
int i = 0; i < 5; ++i) {
 
  294       Scalar yoffset = i * 25.25f + 300.f;
 
  295       DlPathBuilder path_builder;
 
  297       path_builder.MoveTo(
DlPoint(100, yoffset));
 
  298       path_builder.LineTo(
DlPoint(924, yoffset));
 
  299       builder.DrawPath(path_builder.TakePath(), paint);
 
  302     return builder.Build();
 
  305   ASSERT_TRUE(OpenPlaygroundHere(callback));
 
  312   auto callback = [&]() -> sk_sp<DisplayList> {
 
  314                              ImGuiWindowFlags_AlwaysAutoResize)) {
 
  315       ImGui::SliderFloat(
"Scale", &scale, 0, 6);
 
  316       ImGui::SliderFloat(
"Rotate", &rotation, 0, 90);
 
  317       ImGui::SliderFloat(
"Offset", &offset, 0, 2);
 
  321     DisplayListBuilder builder;
 
  322     builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  323     builder.DrawPaint(DlPaint(DlColor(0xff111111)));
 
  326     paint.setStrokeWidth(0.f);
 
  327     paint.setColor(DlColor::kWhite());
 
  329     builder.Translate(512, 384);
 
  330     builder.Scale(scale, scale);
 
  331     builder.Rotate(rotation);
 
  332     builder.Translate(-512, -384 + offset);
 
  334     for (
int i = 0; i < 5; ++i) {
 
  335       Scalar yoffset = i * 25.25f + 300.f;
 
  337       builder.DrawLine(
DlPoint(100, yoffset), 
DlPoint(924, yoffset), paint);
 
  340     return builder.Build();
 
  343   ASSERT_TRUE(OpenPlaygroundHere(callback));
 
  347   DisplayListBuilder builder;
 
  348   builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  351   paint.setColor(DlColor::kRed());
 
  352   paint.setDrawStyle(DlDrawStyle::kFill);
 
  354   DlPaint reference_paint;
 
  355   reference_paint.setColor(DlColor::kGreen());
 
  356   reference_paint.setDrawStyle(DlDrawStyle::kFill);
 
  358   DlPathBuilder path_builder;
 
  360   path_builder.MoveTo(
DlPoint(100, 100));
 
  361   path_builder.ConicCurveTo(
DlPoint(150, 450), 
DlPoint(200, 100), 5.0f);
 
  363   DlPathBuilder reference_builder;
 
  368   reference_builder.MoveTo(component.p1);
 
  369   constexpr 
int N = 100;
 
  370   for (
int i = 1; i < N; i++) {
 
  371     reference_builder.LineTo(component.Solve(
static_cast<Scalar>(i) / N));
 
  373   reference_builder.LineTo(component.p2);
 
  376   line_paint.setColor(DlColor::kYellow());
 
  377   line_paint.setDrawStyle(DlDrawStyle::kStroke);
 
  378   line_paint.setStrokeWidth(1.0f);
 
  382   builder.DrawLine(
DlPoint(145, 100), 
DlPoint(145, 450), line_paint);
 
  383   builder.DrawLine(
DlPoint(155, 100), 
DlPoint(155, 450), line_paint);
 
  384   builder.DrawLine(
DlPoint(345, 100), 
DlPoint(345, 450), line_paint);
 
  385   builder.DrawLine(
DlPoint(355, 100), 
DlPoint(355, 450), line_paint);
 
  386   builder.DrawLine(
DlPoint(100, 392.5f), 
DlPoint(400, 392.5f), line_paint);
 
  389   builder.DrawPath(path_builder.TakePath(), paint);
 
  390   builder.DrawPath(reference_builder.TakePath(), reference_paint);
 
  392   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  396   DisplayListBuilder builder;
 
  399   paint.setColor(DlColor::kRed());
 
  403       .top_right = {25, 50},
 
  404       .bottom_left = {25, 50},
 
  405       .bottom_right = {50, 25},
 
  407   DlPathBuilder path_builder;
 
  409       DlRoundRect::MakeRectRadii(DlRect::MakeXYWH(100, 100, 200, 200), radii);
 
  412   path_builder.AddPath(DlPath::MakeRoundRect(rrect));
 
  413   path_builder.AddPath(DlPath::MakeCircle(
DlPoint(200, 200), 50));
 
  414   path_builder.SetFillType(DlPathFillType::kOdd);
 
  415   DlPath path = path_builder.TakePath();
 
  420   builder.DrawPath(path, paint);
 
  422   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  429   DisplayListBuilder builder;
 
  435   DlPathBuilder path_builder;
 
  436   path_builder.MoveTo(
DlPoint(50, 50));
 
  437   path_builder.LineTo(
DlPoint(50, 100));
 
  438   path_builder.LineTo(
DlPoint(100, 100));
 
  439   path_builder.LineTo(
DlPoint(100, 50));
 
  442   paint.setColor(DlColor::kRed());
 
  443   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  444   paint.setStrokeWidth(10);
 
  446   builder.DrawPath(path_builder.TakePath(), paint);
 
  448   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  452   DisplayListBuilder builder;
 
  456   DlPathBuilder path_builder;
 
  457   path_builder.MoveTo(
DlPoint(50, 50));
 
  458   path_builder.LineTo(
DlPoint(520, 120));
 
  459   path_builder.LineTo(
DlPoint(300, 310));
 
  460   path_builder.LineTo(
DlPoint(100, 50));
 
  461   path_builder.Close();
 
  464   paint.setColor(DlColor::kRed());
 
  465   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  466   paint.setStrokeWidth(10);
 
  468   builder.DrawPath(path_builder.TakePath(), paint);
 
  470   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  475   auto callback = [&]() -> sk_sp<DisplayList> {
 
  477     static float scale = 3;
 
  478     static bool add_circle_clip = 
true;
 
  481                              ImGuiWindowFlags_AlwaysAutoResize)) {
 
  482       ImGui::ColorEdit4(
"Color", 
reinterpret_cast<float*
>(&color));
 
  483       ImGui::SliderFloat(
"Scale", &scale, 0, 6);
 
  484       ImGui::Checkbox(
"Circle clip", &add_circle_clip);
 
  488     DisplayListBuilder builder;
 
  489     builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  492     paint.setColor(DlColor::kWhite());
 
  493     builder.DrawPaint(paint);
 
  497     paint.setDrawStyle(DlDrawStyle::kStroke);
 
  498     paint.setStrokeWidth(10);
 
  500     DlPathBuilder path_builder;
 
  501     path_builder.MoveTo(
DlPoint(20, 20));
 
  503     path_builder.Close();
 
  504     path_builder.MoveTo(
DlPoint(60, 20));
 
  506     DlPath path = path_builder.TakePath();
 
  508     builder.Scale(scale, scale);
 
  510     if (add_circle_clip) {
 
  515       auto [handle_a, handle_b] =
 
  518       Matrix screen_to_canvas = builder.GetMatrix();
 
  522       screen_to_canvas = screen_to_canvas.
Invert();
 
  524       Point point_a = screen_to_canvas * handle_a;
 
  525       Point point_b = screen_to_canvas * handle_b;
 
  527       Point middle = point_a + point_b;
 
  528       middle *= GetContentScale().
x / 2;
 
  532       builder.ClipPath(DlPath::MakeCircle(middle, radius));
 
  536          {DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
 
  537       paint.setStrokeJoin(join);
 
  539            {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
 
  540         paint.setStrokeCap(cap);
 
  541         builder.DrawPath(path, paint);
 
  542         builder.Translate(80, 0);
 
  544       builder.Translate(-240, 60);
 
  547     return builder.Build();
 
  550   ASSERT_TRUE(OpenPlaygroundHere(callback));
 
  554   DisplayListBuilder builder;
 
  555   builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  558   paint.setColor(DlColor::kBlue());
 
  559   paint.setStrokeWidth(10);
 
  561   auto draw = [&builder](DlPaint& paint) {
 
  563          {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
 
  564       paint.setStrokeCap(cap);
 
  567       for (
int d = 15; d < 90; d += 15) {
 
  569         Point origin = {100, 100};
 
  572         auto a = origin + m * p0;
 
  573         auto b = origin + m * p1;
 
  575         builder.DrawLine(a, 
b, paint);
 
  578       builder.DrawCircle(origin, 35, paint);
 
  582       builder.Translate(250, 0);
 
  584     builder.Translate(-750, 250);
 
  587   std::vector<DlColor> colors = {
 
  588       DlColor::ARGB(1, 0x1f / 255.0, 0.0, 0x5c / 255.0),
 
  589       DlColor::ARGB(1, 0x5b / 255.0, 0.0, 0x60 / 255.0),
 
  590       DlColor::ARGB(1, 0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0),
 
  591       DlColor::ARGB(1, 0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0),
 
  592       DlColor::ARGB(1, 0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0),
 
  593       DlColor::ARGB(1, 0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0),
 
  594       DlColor::ARGB(1, 0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0)};
 
  595   std::vector<Scalar> stops = {
 
  606       CreateTextureForFixture(
"airplane.jpg",
 
  611   paint.setColorSource(DlColorSource::MakeRadial({100, 100}, 200, stops.size(),
 
  612                                                  colors.data(), stops.data(),
 
  613                                                  DlTileMode::kMirror));
 
  616   DlMatrix matrix = DlMatrix::MakeTranslation({-150, 75});
 
  617   paint.setColorSource(DlColorSource::MakeImage(
 
  618       texture, DlTileMode::kRepeat, DlTileMode::kRepeat,
 
  619       DlImageSampling::kMipmapLinear, &matrix));
 
  622   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  631   auto callback = [&]() -> sk_sp<DisplayList> {
 
  633                              ImGuiWindowFlags_AlwaysAutoResize)) {
 
  634       ImGui::SliderFloat(
"Scale", &scale, 0.001, 5);
 
  635       ImGui::SliderFloat(
"Width", &line_width, 1, 20);
 
  639     DisplayListBuilder builder;
 
  640     builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  642     builder.DrawPaint(DlPaint(DlColor(0xff111111)));
 
  646       paint.setColor(DlColor::kGreenYellow());
 
  647       paint.setStrokeWidth(line_width);
 
  653       builder.Translate(100, 300);
 
  654       builder.Scale(scale, scale);
 
  655       builder.Translate(-100, -300);
 
  663       paint.setColor(DlColor::kGreenYellow());
 
  664       paint.setStrokeWidth(2.0);
 
  667       builder.Translate(100, 500);
 
  668       builder.Scale(0.2, 0.2);
 
  669       builder.Translate(-100, -500);
 
  675     return builder.Build();
 
  677   ASSERT_TRUE(OpenPlaygroundHere(callback));
 
  682   float line_width = 10.f;
 
  683   float rotation = 0.f;
 
  685   auto callback = [&]() -> sk_sp<DisplayList> {
 
  687                              ImGuiWindowFlags_AlwaysAutoResize)) {
 
  689       ImGui::SliderFloat(
"Scale", &scale, 0.001f, 5.0f);
 
  690       ImGui::SliderFloat(
"Width", &line_width, 1.0f, 20.0f);
 
  691       ImGui::SliderFloat(
"Rotation", &rotation, 0.0f, 180.0f);
 
  695     DisplayListBuilder builder;
 
  696     builder.Scale(
static_cast<float>(GetContentScale().
x),
 
  697                   static_cast<float>(GetContentScale().y));
 
  699     builder.DrawPaint(DlPaint(DlColor(0xff111111)));  
 
  705       hex_paint.setStrokeWidth(line_width);  
 
  711       float r_sin60 = r * std::sqrt(3.0f) / 2.0f;
 
  712       float r_cos60 = r / 2.0f;
 
  722           DlPoint(cx + r_cos60, cy + r_sin60);  
 
  725       builder.Translate(cx, cy);
 
  726       builder.Scale(scale, scale);
 
  727       builder.Rotate(rotation);
 
  728       builder.Translate(-cx, -cy);
 
  730       builder.DrawLine(v0, v1, hex_paint);
 
  731       builder.DrawLine(v1, v2, hex_paint);  
 
  732       builder.DrawLine(v2, v3, hex_paint);
 
  733       builder.DrawLine(v3, v4, hex_paint);
 
  734       builder.DrawLine(v4, v5, hex_paint);  
 
  735       builder.DrawLine(v5, v0, hex_paint);  
 
  738     return builder.Build();
 
  740   ASSERT_TRUE(OpenPlaygroundHere(callback));
 
  744   DisplayListBuilder builder;
 
  745   builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  747   builder.DrawPaint(DlPaint(DlColor(0xff111111)));
 
  750   paint.setColor(DlColor::kGreenYellow());
 
  751   paint.setStrokeWidth(10);
 
  753   auto draw = [&builder](DlPaint& paint) {
 
  755          {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
 
  756       paint.setStrokeCap(cap);
 
  759       for (
int d = 15; d < 90; d += 15) {
 
  761         Point origin = {100, 100};
 
  764         auto a = origin + m * p0;
 
  765         auto b = origin + m * p1;
 
  767         builder.DrawLine(a, 
b, paint);
 
  770       builder.DrawCircle(origin, 35, paint);
 
  774       builder.Translate(250, 0);
 
  776     builder.Translate(-750, 250);
 
  781   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  785   DisplayListBuilder builder;
 
  787   paint.setColor(DlColor::kRed());
 
  788   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  789   paint.setStrokeWidth(10);
 
  791   builder.Translate(100, 100);
 
  792   builder.DrawPath(DlPath::MakeRect(DlRect::MakeSize(DlSize(100, 100))), paint);
 
  794   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  798   DisplayListBuilder builder;
 
  800   paint.setColor(DlColor::kRed());
 
  801   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  802   paint.setStrokeWidth(10);
 
  803   paint.setStrokeJoin(DlStrokeJoin::kBevel);
 
  805   builder.Translate(100, 100);
 
  806   builder.DrawPath(DlPath::MakeRect(DlRect::MakeSize(DlSize(100, 100))), paint);
 
  808   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  812   DlPathBuilder path_builder;
 
  813   for (
auto i = 0; i < 10; i++) {
 
  818           DlPath::MakeCircle(
DlPoint(100 + 50 * i, 100 + 50 * i), 100);
 
  819       path_builder.AddPath(circle);
 
  820       path_builder.Close();
 
  822       path_builder.MoveTo(
DlPoint(100.f + 50.f * i - 100, 100.f + 50.f * i));
 
  823       path_builder.LineTo(
DlPoint(100.f + 50.f * i, 100.f + 50.f * i - 100));
 
  824       path_builder.LineTo(
DlPoint(100.f + 50.f * i - 100,  
 
  825                                   100.f + 50.f * i - 100));
 
  826       path_builder.Close();
 
  829   DlPath path = path_builder.TakePath();
 
  831   DisplayListBuilder builder;
 
  833   paint.setColor(DlColor::kRed().withAlpha(102));
 
  834   builder.DrawPath(path, paint);
 
  836   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  840   DisplayListBuilder builder;
 
  841   builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  844   paint.setColor(DlColor::kRed());
 
  846   std::vector<DlColor> colors = {DlColor::RGBA(1.0, 0.0, 0.0, 1.0),
 
  847                                  DlColor::RGBA(0.0, 0.0, 0.0, 1.0)};
 
  848   std::vector<Scalar> stops = {0.0, 1.0};
 
  850   paint.setColorSource(
 
  851       DlColorSource::MakeSweep({100, 100}, 45, 135, stops.size(), colors.data(),
 
  852                                stops.data(), DlTileMode::kMirror));
 
  853   paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
 
  855   DlPathBuilder path_builder;
 
  856   path_builder.AddArc(DlRect::MakeXYWH(10, 10, 100, 100),  
 
  857                       DlDegrees(0), DlDegrees(0));
 
  858   builder.DrawPath(path_builder.TakePath(), paint);
 
  865   DisplayListBuilder builder;
 
  867   paint.setColor(DlColor::kFuchsia());
 
  869   builder.ClipPath(DlPath::MakeRect(DlRect::MakeXYWH(0, 0, 500, 500)));
 
  870   builder.DrawPath(DlPath::MakeCircle(
DlPoint(500, 500), 250), paint);
 
  872   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  880   auto callback = [&]() -> sk_sp<DisplayList> {
 
  882                              ImGuiWindowFlags_AlwaysAutoResize)) {
 
  883       ImGui::SliderFloat(
"Stroke Width", &stroke_width, 1, 300);
 
  884       ImGui::SliderFloat(
"Aspect", &aspect, 0.5, 2.0);
 
  885       ImGui::SliderFloat(
"Start Angle", &start_angle, 0, 360);
 
  886       ImGui::SliderFloat(
"End Angle", &end_angle, 0, 360);
 
  890     DisplayListBuilder builder;
 
  892     grey_paint.setColor(DlColor(0xff111111));
 
  893     builder.DrawPaint(grey_paint);
 
  896     white_paint.setColor(DlColor::kWhite());
 
  897     white_paint.setStrokeWidth(stroke_width);
 
  898     white_paint.setDrawStyle(DlDrawStyle::kStroke);
 
  900     red_paint.setColor(DlColor::kRed());
 
  903     builder.DrawRect(rect, red_paint);
 
  904     builder.DrawArc(rect, start_angle, end_angle,
 
  907     builder.DrawLine(
Point(frontier, 0), 
Point(frontier, 150), red_paint);
 
  909     return builder.Build();
 
  911   ASSERT_TRUE(OpenPlaygroundHere(callback));
 
  915   DisplayListBuilder builder;
 
  918   paint.setColor(DlColor::kRed());
 
  922       .top_right = DlSize(50, 50),
 
  923       .bottom_left = DlSize(50, 50),
 
  924       .bottom_right = DlSize(50, 50),
 
  927   const Scalar kTriangleHeight = 100;
 
  929       DlRect::MakeXYWH(-kTriangleHeight / 2.0f, -kTriangleHeight / 2.0f,
 
  930                        kTriangleHeight, kTriangleHeight),
 
  935   DlPath rrect_path = DlPath::MakeRoundRect(rrect);
 
  937   builder.Translate(200, 200);
 
  941     DlPathBuilder path_builder;
 
  942     path_builder.MoveTo(
DlPoint(0, kTriangleHeight));
 
  943     path_builder.LineTo(
DlPoint(-kTriangleHeight / 2.0f, 0));
 
  944     path_builder.LineTo(
DlPoint(kTriangleHeight / 2.0f, 0));
 
  945     path_builder.Close();
 
  946     path_builder.AddPath(rrect_path);
 
  948     builder.DrawPath(path_builder.TakePath(), paint);
 
  950   builder.Translate(100, 0);
 
  953     DlPathBuilder path_builder;
 
  954     path_builder.MoveTo(
DlPoint(0, kTriangleHeight));
 
  955     path_builder.LineTo(
DlPoint(-kTriangleHeight / 2.0f, 0));
 
  956     path_builder.LineTo(
DlPoint(0, -10));
 
  957     path_builder.LineTo(
DlPoint(kTriangleHeight / 2.0f, 0));
 
  958     path_builder.Close();
 
  959     path_builder.AddPath(rrect_path);
 
  961     builder.DrawPath(path_builder.TakePath(), paint);
 
  964   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  968   DisplayListBuilder builder;
 
  971   paint.setColor(DlColor::kRed());
 
  972   paint.setDrawStyle(DlDrawStyle::kStroke);
 
  973   paint.setStrokeWidth(15.0);
 
  974   paint.setStrokeCap(DlStrokeCap::kRound);
 
  976   DlPathBuilder path_builder;
 
  977   path_builder.MoveTo(
DlPoint(100, 100));
 
  978   path_builder.LineTo(
DlPoint(150, 150));
 
  979   path_builder.MoveTo(
DlPoint(200, 200));
 
  980   path_builder.LineTo(
DlPoint(200, 200));
 
  982   builder.DrawPath(path_builder.TakePath(), paint);
 
  984   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
  988   DisplayListBuilder builder;
 
  989   builder.Scale(GetContentScale().
x, GetContentScale().y);
 
  991   builder.Translate(100, 0);
 
  994   for (
auto cap : std::vector<DlStrokeCap>{
 
  995            DlStrokeCap::kButt, DlStrokeCap::kRound, DlStrokeCap::kSquare}) {
 
  996     DlPathBuilder path_builder;
 
  997     path_builder.MoveTo({20, 50});
 
  998     path_builder.LineTo({50, 50});
 
  999     path_builder.MoveTo({120, 50});
 
 1000     path_builder.LineTo({120, 80});
 
 1001     path_builder.MoveTo({180, 50});
 
 1002     path_builder.LineTo({180, 50});
 
 1003     DlPath path = path_builder.TakePath();
 
 1006     paint.setColor(DlColor::kRed());
 
 1007     paint.setDrawStyle(DlDrawStyle::kStroke);
 
 1008     paint.setStrokeWidth(20.0f);
 
 1009     paint.setStrokeCap(cap);
 
 1010     paint.setStrokeJoin(DlStrokeJoin::kBevel);
 
 1012     builder.DrawPath(path, paint);
 
 1014     paint.setColor(DlColor::kYellow());
 
 1015     paint.setStrokeWidth(1.0f);
 
 1016     paint.setStrokeCap(DlStrokeCap::kButt);
 
 1018     builder.DrawPath(path, paint);
 
 1020     builder.Translate(250, 0);
 
 1024   builder.Translate(0, 100);
 
 1027   for (
auto join : std::vector<DlStrokeJoin>{
 
 1028            DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
 
 1029     DlPathBuilder path_builder;
 
 1030     path_builder.MoveTo({20, 50});  
 
 1031     path_builder.LineTo({50, 50});
 
 1032     path_builder.LineTo({80, 50});
 
 1033     path_builder.MoveTo({20, 150});  
 
 1034     path_builder.LineTo({50, 150});
 
 1035     path_builder.LineTo({50, 180});
 
 1036     path_builder.MoveTo({20, 250});  
 
 1037     path_builder.LineTo({50, 250});
 
 1038     path_builder.LineTo({70, 270});
 
 1039     path_builder.MoveTo({20, 350});  
 
 1040     path_builder.LineTo({50, 350});
 
 1041     path_builder.LineTo({30, 370});
 
 1042     path_builder.MoveTo({20, 450});  
 
 1043     path_builder.LineTo({50, 450});
 
 1044     path_builder.LineTo({20, 450});
 
 1045     path_builder.MoveTo({120, 80});  
 
 1046     path_builder.LineTo({150, 80});
 
 1047     path_builder.LineTo({180, 80});
 
 1048     path_builder.MoveTo({120, 180});  
 
 1049     path_builder.LineTo({150, 180});
 
 1050     path_builder.LineTo({150, 150});
 
 1051     path_builder.MoveTo({120, 280});  
 
 1052     path_builder.LineTo({150, 280});
 
 1053     path_builder.LineTo({170, 260});
 
 1054     path_builder.MoveTo({120, 380});  
 
 1055     path_builder.LineTo({150, 380});
 
 1056     path_builder.LineTo({130, 360});
 
 1057     path_builder.MoveTo({120, 480});  
 
 1058     path_builder.LineTo({150, 480});
 
 1059     path_builder.LineTo({120, 480});
 
 1060     DlPath path = path_builder.TakePath();
 
 1064     paint.setColor(DlColor::kRed());
 
 1065     paint.setDrawStyle(DlDrawStyle::kStroke);
 
 1066     paint.setStrokeWidth(20.0f);
 
 1067     paint.setStrokeCap(DlStrokeCap::kSquare);
 
 1068     paint.setStrokeJoin(join);
 
 1069     builder.DrawPath(path, paint);
 
 1071     paint.setColor(DlColor::kYellow());
 
 1072     paint.setStrokeWidth(1.0f);
 
 1073     paint.setStrokeCap(DlStrokeCap::kButt);
 
 1074     builder.DrawPath(path, paint);
 
 1076     builder.Translate(250, 0);
 
 1080   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
 1084   DisplayListBuilder builder;
 
 1086   paint.setColor(DlColor::kGreen());
 
 1087   paint.setDrawStyle(DlDrawStyle::kStroke);
 
 1088   paint.setStrokeWidth(30);
 
 1089   paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 5));
 
 1091   builder.DrawCircle(
DlPoint(200, 200), 100, paint);
 
 1093   ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
 
static bool ImGuiBegin(const char *name, bool *p_open, ImGuiWindowFlags flags)
static sk_sp< DlImageImpeller > Make(std::shared_ptr< Texture > texture, OwningContext owning_context=OwningContext::kIO)
TEST_P(AiksTest, DrawAtlasNoColor)
std::tuple< Point, Point > DrawPlaygroundLine(PlaygroundPoint &point_a, PlaygroundPoint &point_b)
constexpr float kSqrt2Over2
flutter::DlRoundRect DlRoundRect
flutter::DlScalar DlScalar
static constexpr Color Black()
constexpr Color WithAlpha(Scalar new_alpha) const
static constexpr Color Red()
A 4x4 matrix using column-major storage.
bool IsInvertible() const
static Matrix MakeRotationZ(Radians r)
constexpr Type GetDistance(const TPoint &p) const
constexpr auto GetRight() const
constexpr static TRect MakeXYWH(Type x, Type y, Type width, Type height)