10 #include "flutter/display_list/dl_blend_mode.h"
11 #include "flutter/display_list/dl_builder.h"
12 #include "flutter/display_list/dl_color.h"
13 #include "flutter/display_list/dl_paint.h"
14 #include "flutter/display_list/dl_tile_mode.h"
15 #include "flutter/display_list/effects/dl_color_filter.h"
16 #include "flutter/display_list/effects/dl_color_source.h"
17 #include "flutter/display_list/effects/dl_image_filter.h"
18 #include "flutter/display_list/effects/dl_mask_filter.h"
19 #include "flutter/testing/testing.h"
20 #include "gtest/gtest.h"
32 #include "third_party/imgui/imgui.h"
33 #include "third_party/skia/include/core/SkBlurTypes.h"
34 #include "third_party/skia/include/core/SkClipOp.h"
35 #include "third_party/skia/include/core/SkPathBuilder.h"
36 #include "third_party/skia/include/core/SkRRect.h"
41 flutter::DlColor
toColor(
const float* components) {
43 Color(components[0], components[1], components[2], components[3])));
50 flutter::DisplayListBuilder sub_builder;
51 sub_builder.ClipRect(SkRect::MakeXYWH(0, 0, 24, 24));
52 sub_builder.DrawPaint(flutter::DlPaint(flutter::DlColor::kBlue()));
54 auto display_list = sub_builder.Build();
55 flutter::DisplayListBuilder builder;
56 builder.DrawDisplayList(display_list);
57 builder.DrawRect(SkRect::MakeXYWH(30, 30, 24, 24),
58 flutter::DlPaint(flutter::DlColor::kRed()));
59 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
63 flutter::DisplayListBuilder builder;
64 builder.DrawRect(SkRect::MakeXYWH(10, 10, 100, 100),
65 flutter::DlPaint(flutter::DlColor::kBlue()));
66 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
70 flutter::DisplayListBuilder builder;
71 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello", CreateTestFont()),
72 100, 100, flutter::DlPaint(flutter::DlColor::kBlue()));
73 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
77 flutter::DisplayListBuilder builder;
79 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
80 flutter::DlColor::kRed()};
81 const float stops[2] = {0.0, 1.0};
83 auto linear = flutter::DlColorSource::MakeLinear({0.0, 0.0}, {300.0, 300.0},
84 2, colors.data(), stops,
85 flutter::DlTileMode::kClamp);
86 flutter::DlPaint paint;
87 paint.setColorSource(linear);
90 SkTextBlob::MakeFromString(
"Hello World", CreateTestFont()), 100, 100,
92 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
96 flutter::DisplayListBuilder builder;
97 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello", CreateTestFont()),
98 100, 100, flutter::DlPaint(flutter::DlColor::kRed()));
100 flutter::DlPaint save_paint;
102 save_paint.setAlpha(
static_cast<uint8_t
>(255 * alpha));
103 builder.SaveLayer(
nullptr, &save_paint);
104 builder.DrawTextBlob(SkTextBlob::MakeFromString(
"Hello with half alpha",
105 CreateTestFontOfSize(100)),
106 100, 300, flutter::DlPaint(flutter::DlColor::kRed()));
108 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
112 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
113 flutter::DisplayListBuilder builder;
115 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
116 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
120 flutter::DisplayListBuilder builder;
121 flutter::DlPaint paint;
123 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
124 paint.setStrokeWidth(30);
125 paint.setColor(flutter::DlColor::kRed());
128 SkPathBuilder{}.moveTo(-50, 0).lineTo(0, -50).lineTo(50, 0).snapshot();
130 builder.Translate(100, 100);
132 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
133 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
134 paint.setStrokeMiter(4);
135 builder.DrawPath(path, paint);
140 builder.Translate(0, 100);
143 paint.setStrokeMiter(1);
144 builder.DrawPath(path, paint);
148 builder.Translate(150, 0);
150 paint.setStrokeCap(flutter::DlStrokeCap::kSquare);
151 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
152 builder.DrawPath(path, paint);
155 builder.Translate(150, 0);
157 paint.setStrokeCap(flutter::DlStrokeCap::kRound);
158 paint.setStrokeJoin(flutter::DlStrokeJoin::kRound);
159 builder.DrawPath(path, paint);
162 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
166 auto callback = [&]() {
167 static float start_angle = 45;
168 static float sweep_angle = 270;
169 static float stroke_width = 10;
170 static bool use_center =
true;
172 static int selected_cap = 0;
173 const char* cap_names[] = {
"Butt",
"Round",
"Square"};
174 flutter::DlStrokeCap cap;
176 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
177 ImGui::SliderFloat(
"Start angle", &start_angle, -360, 360);
178 ImGui::SliderFloat(
"Sweep angle", &sweep_angle, -360, 360);
179 ImGui::SliderFloat(
"Stroke width", &stroke_width, 0, 300);
180 ImGui::Combo(
"Cap", &selected_cap, cap_names,
181 sizeof(cap_names) /
sizeof(
char*));
182 ImGui::Checkbox(
"Use center", &use_center);
185 switch (selected_cap) {
187 cap = flutter::DlStrokeCap::kButt;
190 cap = flutter::DlStrokeCap::kRound;
193 cap = flutter::DlStrokeCap::kSquare;
196 cap = flutter::DlStrokeCap::kButt;
203 flutter::DisplayListBuilder builder;
204 flutter::DlPaint paint;
206 Vector2 scale = GetContentScale();
207 builder.Scale(scale.
x, scale.
y);
208 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
209 paint.setStrokeCap(cap);
210 paint.setStrokeJoin(flutter::DlStrokeJoin::kMiter);
211 paint.setStrokeMiter(10);
212 auto rect = SkRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
213 paint.setColor(flutter::DlColor::kGreen());
214 paint.setStrokeWidth(2);
215 builder.DrawRect(rect, paint);
216 paint.setColor(flutter::DlColor::kRed());
217 paint.setStrokeWidth(stroke_width);
218 builder.DrawArc(rect, start_angle, sweep_angle, use_center, paint);
220 return builder.Build();
222 ASSERT_TRUE(OpenPlaygroundHere(callback));
226 auto callback = [&]() {
227 flutter::DisplayListBuilder builder;
228 flutter::DlPaint paint;
230 paint.setColor(flutter::DlColor::kRed());
231 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
233 static float stroke_width = 10.0f;
234 static int selected_stroke_type = 0;
235 static int selected_join_type = 0;
236 const char* stroke_types[] = {
"Butte",
"Round",
"Square"};
237 const char* join_type[] = {
"kMiter",
"Round",
"kBevel"};
239 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
240 ImGui::Combo(
"Cap", &selected_stroke_type, stroke_types,
241 sizeof(stroke_types) /
sizeof(
char*));
242 ImGui::Combo(
"Join", &selected_join_type, join_type,
243 sizeof(join_type) /
sizeof(
char*));
244 ImGui::SliderFloat(
"Stroke Width", &stroke_width, 10.0f, 50.0f);
247 flutter::DlStrokeCap cap;
248 flutter::DlStrokeJoin join;
249 switch (selected_stroke_type) {
251 cap = flutter::DlStrokeCap::kButt;
254 cap = flutter::DlStrokeCap::kRound;
257 cap = flutter::DlStrokeCap::kSquare;
260 cap = flutter::DlStrokeCap::kButt;
263 switch (selected_join_type) {
265 join = flutter::DlStrokeJoin::kMiter;
268 join = flutter::DlStrokeJoin::kRound;
271 join = flutter::DlStrokeJoin::kBevel;
274 join = flutter::DlStrokeJoin::kMiter;
277 paint.setStrokeCap(cap);
278 paint.setStrokeJoin(join);
279 paint.setStrokeWidth(stroke_width);
282 builder.Scale(1.5f, 1.5f);
285 builder.Translate(100, 100);
286 builder.DrawRect(SkRect::MakeSize({100, 100}), paint);
289 builder.Translate(150, 0);
290 builder.DrawRRect(SkRRect::MakeRectXY(SkRect::MakeSize({100, 50}), 10, 10),
294 builder.Translate(150, 0);
296 SkRRect::MakeRectXY(SkRect::MakeSize({100, 50}), 10, 10),
297 SkRRect::MakeRectXY(SkRect::MakeXYWH(10, 10, 80, 30), 10, 10), paint);
301 builder.Translate(150, 0);
305 path.lineTo({100, 0});
306 path.lineTo({100, 0});
307 path.lineTo({100, 100});
308 builder.DrawPath(path, paint);
314 builder.Translate(200, 0);
319 line_path.moveTo(0, 0);
320 line_path.moveTo(0, 0);
321 line_path.lineTo({0, 0});
322 line_path.lineTo({0, 0});
323 line_path.lineTo({50, 50});
324 line_path.lineTo({50, 50});
325 line_path.lineTo({100, 0});
326 line_path.lineTo({100, 0});
327 builder.DrawPath(line_path, paint);
329 builder.Translate(0, 100);
330 builder.DrawPath(line_path, paint);
332 builder.Translate(0, 100);
334 line_path2.moveTo(0, 0);
335 line_path2.lineTo(0, 0);
336 line_path2.lineTo(0, 0);
337 builder.DrawPath(line_path2, paint);
343 builder.Translate(150, 0);
348 cubic_path.moveTo({0, 0});
349 cubic_path.cubicTo(0, 0, 140.0, 100.0, 140, 20);
350 builder.DrawPath(cubic_path, paint);
352 builder.Translate(0, 100);
354 cubic_path2.moveTo({0, 0});
355 cubic_path2.cubicTo(0, 0, 0, 0, 150, 150);
356 builder.DrawPath(cubic_path2, paint);
358 builder.Translate(0, 100);
360 cubic_path3.moveTo({0, 0});
361 cubic_path3.cubicTo(0, 0, 0, 0, 0, 0);
362 builder.DrawPath(cubic_path3, paint);
368 builder.Translate(200, 0);
373 quad_path.moveTo(0, 0);
374 quad_path.moveTo(0, 0);
375 quad_path.quadTo({100, 40}, {50, 80});
376 builder.DrawPath(quad_path, paint);
378 builder.Translate(0, 150);
380 quad_path2.moveTo(0, 0);
381 quad_path2.moveTo(0, 0);
382 quad_path2.quadTo({0, 0}, {100, 100});
383 builder.DrawPath(quad_path2, paint);
385 builder.Translate(0, 100);
387 quad_path3.moveTo(0, 0);
388 quad_path3.quadTo({0, 0}, {0, 0});
389 builder.DrawPath(quad_path3, paint);
393 return builder.Build();
395 ASSERT_TRUE(OpenPlaygroundHere(callback));
399 flutter::DisplayListBuilder builder;
400 flutter::DlPaint paint;
402 paint.setColor(flutter::DlColor::kRed());
403 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
405 builder.Translate(300, 300);
407 path.setFillType(SkPathFillType::kEvenOdd);
408 path.addCircle(0, 0, 100);
409 path.addCircle(0, 0, 50);
410 builder.DrawPath(path, paint);
412 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
419 flutter::DisplayListBuilder builder;
420 flutter::DlPaint paint;
422 paint.setColor(flutter::DlColor::kRed());
423 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
424 paint.setStrokeWidth(10);
426 builder.Translate(300, 300);
434 path.lineTo(50, 100);
435 path.lineTo(100, 100);
436 path.lineTo(100, 50);
437 builder.DrawPath(path, paint);
439 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
443 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
444 flutter::DisplayListBuilder builder;
445 flutter::DlPaint paint;
450 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kNormal, 10.0f);
451 paint.setMaskFilter(&filter);
453 flutter::DlImageSampling::kNearestNeighbor, &paint);
458 paint.setColor(flutter::DlColor::kYellow());
460 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kOuter, 10.0f);
461 paint.setMaskFilter(&filter);
462 builder.DrawArc(SkRect::MakeXYWH(410, 110, 100, 100), 45, 270,
true, paint);
468 flutter::DlBlurMaskFilter(flutter::DlBlurStyle::kSolid, 10.0f);
469 paint.setMaskFilter(&filter);
470 builder.DrawTextBlob(
471 SkTextBlob::MakeFromString(
"Testing", CreateTestFont()), 220, 170,
475 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
479 flutter::DisplayListBuilder builder;
480 flutter::DlPaint paint;
482 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
483 paint.setColor(flutter::DlColor::kRed());
484 builder.DrawTextBlob(
485 SkTextBlob::MakeFromString(
"stoked about stroked text", CreateTestFont()),
488 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
493 flutter::DisplayListBuilder builder;
494 flutter::DlPaint paint;
495 auto const& text_blob = SkTextBlob::MakeFromString(
"00000", CreateTestFont());
498 auto const& mat_blue = flutter::DlColor(0xFF2196f3);
501 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
502 paint.setColor(mat_blue);
503 builder.DrawRect(SkRect::MakeXYWH(0, 0, 500, 500), paint);
506 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
507 paint.setColor(flutter::DlColor::kWhite());
508 builder.DrawTextBlob(text_blob, 250, 250, paint);
510 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
511 paint.setColor(flutter::DlColor::kBlack());
512 builder.DrawTextBlob(text_blob, 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(
nullptr, &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::DlBlendColorFilter(flutter::DlColor::kYellow(),
538 flutter::DlBlendMode::kModulate);
539 paint.setColorFilter(&filter);
541 flutter::DlImageSampling::kNearestNeighbor, &paint);
546 auto filter = flutter::DlBlendColorFilter(flutter::DlColor::kRed(),
547 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;
568 std::make_shared<flutter::DlMatrixColorFilter>(invert_color_matrix);
570 std::make_shared<flutter::DlColorFilterImageFilter>(color_filter);
572 paint.setImageFilter(image_filter.get());
574 flutter::DlImageSampling::kNearestNeighbor, &paint);
576 builder.Translate(0, 700);
577 paint.setColorFilter(color_filter.get());
579 flutter::DlImageSampling::kNearestNeighbor, &paint);
580 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
584 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
586 auto callback = [&]() {
587 static float sigma[] = {10, 10};
589 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
590 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
593 flutter::DisplayListBuilder builder;
594 flutter::DlPaint paint;
596 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
597 flutter::DlTileMode::kClamp);
598 paint.setImageFilter(&filter);
600 flutter::DlImageSampling::kNearestNeighbor, &paint);
602 return builder.Build();
605 ASSERT_TRUE(OpenPlaygroundHere(callback));
609 auto texture = CreateTextureForFixture(
"boston.jpg");
610 flutter::DisplayListBuilder builder;
611 flutter::DlPaint paint;
613 auto dilate = std::make_shared<flutter::DlDilateImageFilter>(10.0, 10.0);
614 auto erode = std::make_shared<flutter::DlErodeImageFilter>(10.0, 10.0);
615 auto open = std::make_shared<flutter::DlComposeImageFilter>(dilate, erode);
616 auto close = std::make_shared<flutter::DlComposeImageFilter>(erode, dilate);
618 paint.setImageFilter(open.get());
620 flutter::DlImageSampling::kNearestNeighbor, &paint);
621 builder.Translate(0, 700);
622 paint.setImageFilter(close.get());
624 flutter::DlImageSampling::kNearestNeighbor, &paint);
625 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
629 auto texture = CreateTextureForFixture(
"boston.jpg");
630 const float inner_color_matrix[20] = {
636 const float outer_color_matrix[20] = {
642 auto inner_color_filter =
643 std::make_shared<flutter::DlMatrixColorFilter>(inner_color_matrix);
644 auto outer_color_filter =
645 std::make_shared<flutter::DlMatrixColorFilter>(outer_color_matrix);
647 std::make_shared<flutter::DlColorFilterImageFilter>(inner_color_filter);
649 std::make_shared<flutter::DlColorFilterImageFilter>(outer_color_filter);
650 auto compose = std::make_shared<flutter::DlComposeImageFilter>(outer, inner);
652 flutter::DisplayListBuilder builder;
653 flutter::DlPaint paint;
654 paint.setImageFilter(compose.get());
656 flutter::DlImageSampling::kNearestNeighbor, &paint);
657 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
661 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
663 auto callback = [&]() {
664 static float sigma[] = {10, 10};
665 static float ctm_scale = 1;
666 static bool use_bounds =
true;
667 static bool draw_circle =
true;
668 static bool add_clip =
true;
670 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
671 ImGui::SliderFloat2(
"Sigma", sigma, 0, 100);
672 ImGui::SliderFloat(
"Scale", &ctm_scale, 0, 10);
675 "If everything is working correctly, none of the options below should "
676 "impact the filter's appearance.");
677 ImGui::Checkbox(
"Use SaveLayer bounds", &use_bounds);
678 ImGui::Checkbox(
"Draw child element", &draw_circle);
679 ImGui::Checkbox(
"Add pre-clip", &add_clip);
682 flutter::DisplayListBuilder builder;
684 Vector2 scale = ctm_scale * GetContentScale();
685 builder.Scale(scale.
x, scale.
y);
687 auto filter = flutter::DlBlurImageFilter(sigma[0], sigma[1],
688 flutter::DlTileMode::kClamp);
690 std::optional<SkRect> bounds;
694 bounds = SkRect::MakeLTRB(p1.x, p1.y, p2.x, p2.y);
700 builder.ClipRect(SkRect::MakeLTRB(0, 0, 99999, 99999),
701 flutter::DlCanvas::ClipOp::kIntersect,
true);
705 flutter::DlImageSampling::kNearestNeighbor,
nullptr);
706 builder.SaveLayer(bounds.has_value() ? &bounds.value() :
nullptr,
nullptr,
713 flutter::DlPaint paint;
714 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
715 paint.setStrokeCap(flutter::DlStrokeCap::kButt);
716 paint.setStrokeJoin(flutter::DlStrokeJoin::kBevel);
717 paint.setStrokeWidth(10);
718 paint.setColor(flutter::DlColor::kRed().withAlpha(100));
719 builder.DrawCircle({circle_center.x, circle_center.y}, 100, paint);
722 return builder.Build();
725 ASSERT_TRUE(OpenPlaygroundHere(callback));
730 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
731 flutter::DisplayListBuilder builder;
732 auto size = texture->GetSize();
733 builder.DrawImageNine(
735 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
736 size.height * 3 / 4),
737 SkRect::MakeLTRB(0, 0, size.width * 2, size.height * 2),
738 flutter::DlFilterMode::kNearest,
nullptr);
739 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
746 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
747 flutter::DisplayListBuilder builder;
748 auto size = texture->GetSize();
749 builder.DrawImageNine(
751 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
752 size.height * 3 / 4),
753 SkRect::MakeLTRB(0, 0, size.width / 2, size.height),
754 flutter::DlFilterMode::kNearest,
nullptr);
755 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
762 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
763 flutter::DisplayListBuilder builder;
764 auto size = texture->GetSize();
765 builder.DrawImageNine(
767 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
768 size.height * 3 / 4),
769 SkRect::MakeLTRB(0, 0, size.width, size.height / 2),
770 flutter::DlFilterMode::kNearest,
nullptr);
771 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
777 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
778 flutter::DisplayListBuilder builder;
779 auto size = texture->GetSize();
780 builder.DrawImageNine(
782 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
783 size.height * 3 / 4),
784 SkRect::MakeLTRB(0, 0, size.width / 2, size.height / 2),
785 flutter::DlFilterMode::kNearest,
nullptr);
786 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
792 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
793 flutter::DisplayListBuilder builder;
794 auto size = texture->GetSize();
795 builder.DrawImageNine(
797 SkIRect::MakeLTRB(size.width / 4, size.height / 4, size.width * 3 / 4,
798 size.height * 3 / 4),
799 SkRect::MakeLTRB(0, 0, size.width / 4, size.height / 4),
800 flutter::DlFilterMode::kNearest,
nullptr);
801 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
805 flutter::DisplayListBuilder builder;
806 SkPoint points[7] = {
815 std::vector<flutter::DlStrokeCap> caps = {
816 flutter::DlStrokeCap::kButt,
817 flutter::DlStrokeCap::kRound,
818 flutter::DlStrokeCap::kSquare,
820 flutter::DlPaint paint =
822 .setColor(flutter::DlColor::kYellow().withAlpha(127))
824 builder.Translate(50, 50);
825 for (
auto cap : caps) {
826 paint.setStrokeCap(cap);
828 builder.DrawPoints(flutter::DlCanvas::PointMode::kPoints, 7, points, paint);
829 builder.Translate(150, 0);
830 builder.DrawPoints(flutter::DlCanvas::PointMode::kLines, 5, points, paint);
831 builder.Translate(150, 0);
832 builder.DrawPoints(flutter::DlCanvas::PointMode::kPolygon, 5, points,
835 builder.Translate(0, 150);
837 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
841 flutter::DisplayListBuilder builder;
842 std::vector<flutter::DlStrokeCap> caps = {
843 flutter::DlStrokeCap::kButt,
844 flutter::DlStrokeCap::kRound,
845 flutter::DlStrokeCap::kSquare,
847 flutter::DlPaint paint =
849 .setColor(flutter::DlColor::kYellow().withAlpha(127))
850 .setDrawStyle(flutter::DlDrawStyle::kStroke)
851 .setStrokeCap(flutter::DlStrokeCap::kButt)
853 SkPath path = SkPath().addPoly({{150, 50}, {150, 50}},
false);
854 for (
auto cap : caps) {
855 paint.setStrokeCap(cap);
856 builder.DrawLine({50, 50}, {50, 50}, paint);
857 builder.DrawPath(path, paint);
858 builder.Translate(0, 150);
860 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
864 flutter::DisplayListBuilder builder;
865 flutter::DlPaint paint;
867 auto content_scale = GetContentScale() * 0.8;
868 builder.Scale(content_scale.x, content_scale.y);
870 constexpr
size_t star_spikes = 5;
871 constexpr SkScalar half_spike_rotation =
kPi / star_spikes;
872 constexpr SkScalar radius = 40;
873 constexpr SkScalar spike_size = 10;
874 constexpr SkScalar outer_radius = radius + spike_size;
875 constexpr SkScalar inner_radius = radius - spike_size;
876 std::array<SkPoint, star_spikes * 2> star;
877 for (
size_t i = 0; i < star_spikes; i++) {
878 const SkScalar rotation = half_spike_rotation * i * 2;
879 star[i * 2] = SkPoint::Make(50 + std::sin(rotation) * outer_radius,
880 50 - std::cos(rotation) * outer_radius);
881 star[i * 2 + 1] = SkPoint::Make(
882 50 + std::sin(rotation + half_spike_rotation) * inner_radius,
883 50 - std::cos(rotation + half_spike_rotation) * inner_radius);
886 std::array<SkPath, 4> paths = {
887 SkPath{}.addRect(SkRect::MakeXYWH(0, 0, 200, 100)),
889 SkRRect::MakeRectXY(SkRect::MakeXYWH(20, 0, 200, 100), 30, 30)),
890 SkPath{}.addCircle(100, 50, 50),
891 SkPath{}.addPoly(star.data(), star.size(),
true),
893 paint.setColor(flutter::DlColor::kWhite());
894 builder.DrawPaint(paint);
895 paint.setColor(flutter::DlColor::kCyan());
896 builder.Translate(100, 50);
897 for (
size_t x = 0; x < paths.size(); x++) {
899 for (
size_t y = 0; y < 6; y++) {
900 builder.DrawShadow(paths[x], flutter::DlColor::kBlack(), 3 + y * 8,
false,
902 builder.DrawPath(paths[x], paint);
903 builder.Translate(0, 150);
906 builder.Translate(250, 0);
909 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
913 DispatcherDoesNotCullPerspectiveTransformedChildDisplayLists) {
915 flutter::DisplayListBuilder sub_builder(
true);
916 sub_builder.DrawRect(SkRect::MakeXYWH(0, 0, 50, 50),
917 flutter::DlPaint(flutter::DlColor::kRed()));
918 auto display_list = sub_builder.Build();
921 dispatcher.
scale(2.0, 2.0);
925 0.8, -0.2, -0.1, -0.0,
928 63.2, 65.3, 48.6, 1.1
936 picture.
pass->IterateAllEntities([&found](
Entity& entity) {
937 if (std::static_pointer_cast<SolidColorContents>(entity.
GetContents())
951 dispatcher.
scale(1.618, 1.618);
952 dispatcher.
drawShadow(SkPath{}.addRect(SkRect::MakeXYWH(0, 0, 200, 100)),
953 flutter::DlColor::kTransparent(), 15,
false, 1);
957 std::shared_ptr<SolidRRectBlurContents> rrect_blur;
958 picture.
pass->IterateAllEntities([&rrect_blur](
Entity& entity) {
960 rrect_blur = std::static_pointer_cast<SolidRRectBlurContents>(
961 entity.GetContents());
967 ASSERT_NE(rrect_blur,
nullptr);
968 ASSERT_EQ(rrect_blur->GetColor().red, 0);
969 ASSERT_EQ(rrect_blur->GetColor().green, 0);
970 ASSERT_EQ(rrect_blur->GetColor().blue, 0);
971 ASSERT_EQ(rrect_blur->GetColor().alpha, 0);
976 constexpr
Scalar hexagon_radius = 125;
977 auto hex_start =
Point(200.0, -hexagon_radius + 200.0);
978 auto center_to_flat = 1.73 / 2 * hexagon_radius;
981 std::vector<SkPoint> vertices = {
982 SkPoint::Make(hex_start.x, hex_start.y),
983 SkPoint::Make(hex_start.x + center_to_flat, hex_start.y + 0.5 * hexagon_radius),
984 SkPoint::Make(hex_start.x + center_to_flat, hex_start.y + 1.5 * hexagon_radius),
985 SkPoint::Make(hex_start.x + center_to_flat, hex_start.y + 1.5 * hexagon_radius),
986 SkPoint::Make(hex_start.x, hex_start.y + 2 * hexagon_radius),
987 SkPoint::Make(hex_start.x, hex_start.y + 2 * hexagon_radius),
988 SkPoint::Make(hex_start.x - center_to_flat, hex_start.y + 1.5 * hexagon_radius),
989 SkPoint::Make(hex_start.x - center_to_flat, hex_start.y + 1.5 * hexagon_radius),
990 SkPoint::Make(hex_start.x - center_to_flat, hex_start.y + 0.5 * hexagon_radius)
993 auto paint = flutter::DlPaint(flutter::DlColor::kDarkGrey());
994 auto dl_vertices = flutter::DlVertices::Make(
995 flutter::DlVertexMode::kTriangleFan, vertices.size(), vertices.data(),
997 flutter::DisplayListBuilder builder;
998 builder.DrawVertices(dl_vertices, flutter::DlBlendMode::kSrcOver, paint);
999 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1003 flutter::DisplayListBuilder builder;
1004 std::vector<flutter::DlStrokeCap> caps = {
1005 flutter::DlStrokeCap::kButt,
1006 flutter::DlStrokeCap::kRound,
1007 flutter::DlStrokeCap::kSquare,
1009 flutter::DlPaint paint =
1011 .setColor(flutter::DlColor::kWhite())
1012 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1014 flutter::DlPaint outline_paint =
1016 .setColor(flutter::DlColor::kYellow())
1017 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1018 .setStrokeCap(flutter::DlStrokeCap::kSquare)
1020 SkPath path = SkPath().addPoly({{150, 50}, {160, 50}},
false);
1021 for (
auto cap : caps) {
1022 paint.setStrokeCap(cap);
1023 builder.DrawLine({50, 50}, {60, 50}, paint);
1024 builder.DrawRect({45, 45, 65, 55}, outline_paint);
1025 builder.DrawLine({100, 50}, {100, 50}, paint);
1026 if (cap != flutter::DlStrokeCap::kButt) {
1027 builder.DrawRect({95, 45, 105, 55}, outline_paint);
1029 builder.DrawPath(path, paint);
1030 builder.DrawRect(path.getBounds().makeOutset(5, 5), outline_paint);
1031 builder.Translate(0, 150);
1033 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1037 auto boston = CreateTextureForFixture(
"boston.jpg");
1039 auto callback = [&]() {
1040 static int selected_matrix_type = 0;
1041 const char* matrix_type_names[] = {
"Matrix",
"Local Matrix"};
1043 static float ctm_translation[2] = {200, 200};
1044 static float ctm_scale[2] = {0.65, 0.65};
1045 static float ctm_skew[2] = {0, 0};
1047 static bool enable =
true;
1048 static float translation[2] = {100, 100};
1049 static float scale[2] = {0.8, 0.8};
1050 static float skew[2] = {0.2, 0.2};
1052 static bool enable_savelayer =
true;
1054 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1056 ImGui::Combo(
"Filter type", &selected_matrix_type, matrix_type_names,
1057 sizeof(matrix_type_names) /
sizeof(
char*));
1059 ImGui::TextWrapped(
"Current Transform");
1060 ImGui::SliderFloat2(
"CTM Translation", ctm_translation, 0, 1000);
1061 ImGui::SliderFloat2(
"CTM Scale", ctm_scale, 0, 3);
1062 ImGui::SliderFloat2(
"CTM Skew", ctm_skew, -3, 3);
1065 "MatrixFilter and LocalMatrixFilter modify the CTM in the same way. "
1066 "The only difference is that MatrixFilter doesn't affect the effect "
1067 "transform, whereas LocalMatrixFilter does.");
1070 ImGui::Checkbox(
"Enable", &enable);
1071 ImGui::SliderFloat2(
"Filter Translation", translation, 0, 1000);
1072 ImGui::SliderFloat2(
"Filter Scale", scale, 0, 3);
1073 ImGui::SliderFloat2(
"Filter Skew", skew, -3, 3);
1076 "Rendering the filtered image within a layer can expose bounds "
1077 "issues. If the rendered image gets cut off when this setting is "
1078 "enabled, there's a coverage bug in the filter.");
1079 ImGui::Checkbox(
"Render in layer", &enable_savelayer);
1083 flutter::DisplayListBuilder builder;
1084 flutter::DlPaint paint;
1086 if (enable_savelayer) {
1087 builder.SaveLayer(
nullptr,
nullptr);
1090 auto content_scale = GetContentScale();
1091 builder.Scale(content_scale.x, content_scale.y);
1095 SkMatrix::MakeAll(ctm_scale[0], ctm_skew[0], ctm_translation[0],
1096 ctm_skew[1], ctm_scale[1], ctm_translation[1],
1098 builder.Transform(ctm_matrix);
1101 auto filter_matrix =
1102 SkMatrix::MakeAll(scale[0], skew[0], translation[0],
1103 skew[1], scale[1], translation[1],
1107 switch (selected_matrix_type) {
1109 auto filter = flutter::DlMatrixImageFilter(
1110 filter_matrix, flutter::DlImageSampling::kLinear);
1111 paint.setImageFilter(&filter);
1115 auto internal_filter =
1116 flutter::DlBlurImageFilter(10, 10, flutter::DlTileMode::kDecal)
1118 auto filter = flutter::DlLocalMatrixImageFilter(filter_matrix,
1120 paint.setImageFilter(&filter);
1127 flutter::DlImageSampling::kLinear, &paint);
1129 if (enable_savelayer) {
1133 return builder.Build();
1136 ASSERT_TRUE(OpenPlaygroundHere(callback));
1140 auto callback = [&]() {
1141 static float translation[2] = {0, 0};
1142 static bool enable_save_layer =
true;
1144 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1145 ImGui::SliderFloat2(
"Translation", translation, -130, 130);
1146 ImGui::Checkbox(
"Enable save layer", &enable_save_layer);
1149 flutter::DisplayListBuilder builder;
1151 builder.Scale(2.0, 2.0);
1152 flutter::DlPaint paint;
1153 paint.setColor(flutter::DlColor::kYellow());
1154 builder.DrawRect(SkRect::MakeWH(300, 300), paint);
1155 paint.setStrokeWidth(1.0);
1156 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1157 paint.setColor(flutter::DlColor::kBlack().withAlpha(0x80));
1158 builder.DrawLine(SkPoint::Make(150, 0), SkPoint::Make(150, 300), paint);
1159 builder.DrawLine(SkPoint::Make(0, 150), SkPoint::Make(300, 150), paint);
1161 flutter::DlPaint save_paint;
1162 SkRect bounds = SkRect::MakeXYWH(100, 100, 100, 100);
1163 SkMatrix translate_matrix =
1164 SkMatrix::Translate(translation[0], translation[1]);
1165 if (enable_save_layer) {
1166 auto filter = flutter::DlMatrixImageFilter(
1167 translate_matrix, flutter::DlImageSampling::kNearestNeighbor);
1168 save_paint.setImageFilter(filter.shared());
1169 builder.SaveLayer(&bounds, &save_paint);
1172 builder.Transform(translate_matrix);
1175 SkMatrix filter_matrix = SkMatrix::I();
1176 filter_matrix.postTranslate(-150, -150);
1177 filter_matrix.postScale(0.2f, 0.2f);
1178 filter_matrix.postTranslate(150, 150);
1179 auto filter = flutter::DlMatrixImageFilter(
1180 filter_matrix, flutter::DlImageSampling::kNearestNeighbor);
1182 save_paint.setImageFilter(filter.shared());
1184 builder.SaveLayer(&bounds, &save_paint);
1185 flutter::DlPaint paint2;
1186 paint2.setColor(flutter::DlColor::kBlue());
1187 builder.DrawRect(bounds, paint2);
1190 return builder.Build();
1193 ASSERT_TRUE(OpenPlaygroundHere(callback));
1197 flutter::DlPaint paint;
1198 paint.setColor(flutter::DlColor(0xFF2196F3).withAlpha(128));
1199 flutter::DisplayListBuilder builder;
1200 paint.setColorFilter(
1201 flutter::DlLinearToSrgbGammaColorFilter::kInstance.get());
1202 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint);
1203 builder.Translate(0, 200);
1205 paint.setColorFilter(
1206 flutter::DlSrgbToLinearGammaColorFilter::kInstance.get());
1207 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), paint);
1209 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1213 const flutter::DlColor colors[2] = {
1214 flutter::DlColor(0xFFF44336),
1215 flutter::DlColor(0xFF2196F3),
1217 const float stops[2] = {0.0, 1.0};
1218 flutter::DlPaint paint;
1219 flutter::DisplayListBuilder builder;
1220 auto clip_bounds = SkRect::MakeWH(300.0, 300.0);
1222 builder.Translate(100, 100);
1223 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1225 flutter::DlColorSource::MakeLinear({0.0, 0.0}, {100.0, 100.0}, 2, colors,
1226 stops, flutter::DlTileMode::kRepeat);
1227 paint.setColorSource(linear);
1228 builder.DrawPaint(paint);
1232 builder.Translate(500, 100);
1233 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1234 auto radial = flutter::DlColorSource::MakeRadial(
1235 {100.0, 100.0}, 100.0, 2, colors, stops, flutter::DlTileMode::kRepeat);
1236 paint.setColorSource(radial);
1237 builder.DrawPaint(paint);
1241 builder.Translate(100, 500);
1242 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1244 flutter::DlColorSource::MakeSweep({100.0, 100.0}, 180.0, 270.0, 2, colors,
1245 stops, flutter::DlTileMode::kRepeat);
1246 paint.setColorSource(sweep);
1247 builder.DrawPaint(paint);
1251 builder.Translate(500, 500);
1252 builder.ClipRect(clip_bounds, flutter::DlCanvas::ClipOp::kIntersect,
false);
1253 auto texture = CreateTextureForFixture(
"table_mountain_nx.png");
1254 auto image = std::make_shared<flutter::DlImageColorSource>(
1256 flutter::DlTileMode::kRepeat);
1257 paint.setColorSource(image);
1258 builder.DrawPaint(paint);
1261 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1265 flutter::DisplayListBuilder builder;
1268 builder.SaveLayer(
nullptr,
nullptr);
1269 builder.Translate(100, 100);
1270 flutter::DlPaint paint;
1271 paint.setColor(flutter::DlColor::kRed());
1272 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1273 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1274 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
1275 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1279 builder.SaveLayer(
nullptr,
nullptr);
1280 builder.Translate(300, 100);
1281 flutter::DlPaint paint;
1282 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1283 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1284 paint.setColor(flutter::DlColor::kRed());
1285 paint.setBlendMode(flutter::DlBlendMode::kDstOver);
1286 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1290 builder.SaveLayer(
nullptr,
nullptr);
1291 builder.Translate(100, 300);
1292 flutter::DlPaint paint;
1293 paint.setColor(flutter::DlColor::kRed());
1294 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1295 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1296 paint.setBlendMode(flutter::DlBlendMode::kSrc);
1297 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1301 builder.SaveLayer(
nullptr,
nullptr);
1302 builder.Translate(300, 300);
1303 flutter::DlPaint paint;
1304 paint.setColor(flutter::DlColor::kBlue().withAlpha(127));
1305 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1306 paint.setColor(flutter::DlColor::kRed());
1307 paint.setBlendMode(flutter::DlBlendMode::kDst);
1308 builder.DrawRect(SkRect::MakeSize({200, 200}), paint);
1312 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1316 flutter::DisplayListBuilder builder;
1317 const float green_color_matrix[20] = {
1323 const float blue_color_matrix[20] = {
1329 auto green_color_filter =
1330 std::make_shared<flutter::DlMatrixColorFilter>(green_color_matrix);
1331 auto blue_color_filter =
1332 std::make_shared<flutter::DlMatrixColorFilter>(blue_color_matrix);
1333 auto blue_image_filter =
1334 std::make_shared<flutter::DlColorFilterImageFilter>(blue_color_filter);
1336 flutter::DlPaint paint;
1337 paint.setColor(flutter::DlColor::kRed());
1338 paint.setColorFilter(green_color_filter);
1339 paint.setImageFilter(blue_image_filter);
1340 builder.DrawRect(SkRect::MakeLTRB(100, 100, 500, 500), paint);
1341 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1345 auto blur_filter = std::make_shared<flutter::DlBlurMaskFilter>(
1346 flutter::DlBlurStyle::kNormal, 10);
1348 flutter::DisplayListBuilder builder;
1350 std::array<flutter::DlColor, 2> colors = {flutter::DlColor::kBlue(),
1351 flutter::DlColor::kGreen()};
1352 std::array<float, 2> stops = {0, 1};
1353 std::array<std::shared_ptr<flutter::DlColorSource>, 2> color_sources = {
1354 std::make_shared<flutter::DlColorColorSource>(flutter::DlColor::kWhite()),
1355 flutter::DlColorSource::MakeLinear(
1356 SkPoint::Make(0, 0), SkPoint::Make(100, 50), 2, colors.data(),
1357 stops.data(), flutter::DlTileMode::kClamp)};
1360 for (
const auto& color_source : color_sources) {
1361 flutter::DlPaint paint;
1362 paint.setColorSource(color_source);
1363 paint.setMaskFilter(blur_filter);
1365 paint.setDrawStyle(flutter::DlDrawStyle::kFill);
1367 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, offset, 100, 50), 30, 30),
1369 paint.setDrawStyle(flutter::DlDrawStyle::kStroke);
1370 paint.setStrokeWidth(10);
1372 SkRRect::MakeRectXY(SkRect::MakeXYWH(300, offset, 100, 50), 30, 30),
1378 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1384 std::vector<SkPoint> positions = {SkPoint::Make(-100, -300),
1385 SkPoint::Make(-200, -100),
1386 SkPoint::Make(-300, -300)};
1387 std::vector<flutter::DlColor> colors = {flutter::DlColor::kWhite(),
1388 flutter::DlColor::kGreen(),
1389 flutter::DlColor::kWhite()};
1391 auto vertices = flutter::DlVertices::Make(
1392 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1393 nullptr, colors.data());
1395 flutter::DisplayListBuilder builder;
1396 flutter::DlPaint paint;
1398 paint.setColor(flutter::DlColor::kRed().modulateOpacity(0.5));
1399 builder.Scale(-1, -1);
1400 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
1402 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1406 std::vector<SkPoint> positions = {SkPoint::Make(100, 300),
1407 SkPoint::Make(200, 100),
1408 SkPoint::Make(300, 300)};
1410 auto vertices = flutter::DlVertices::Make(
1411 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1414 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
1415 flutter::DlColor::kRed()};
1416 const float stops[2] = {0.0, 1.0};
1418 auto linear = flutter::DlColorSource::MakeLinear(
1419 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
1420 flutter::DlTileMode::kRepeat);
1422 flutter::DisplayListBuilder builder;
1423 flutter::DlPaint paint;
1425 paint.setColorSource(linear);
1426 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
1428 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1432 std::vector<SkPoint> positions = {SkPoint::Make(100, 300),
1433 SkPoint::Make(200, 100),
1434 SkPoint::Make(300, 300)};
1435 std::vector<SkPoint> texture_coordinates = {SkPoint::Make(300, 100),
1436 SkPoint::Make(100, 200),
1437 SkPoint::Make(300, 300)};
1439 auto vertices = flutter::DlVertices::Make(
1440 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1441 texture_coordinates.data(),
nullptr);
1443 std::vector<flutter::DlColor> colors = {flutter::DlColor::kBlue(),
1444 flutter::DlColor::kRed()};
1445 const float stops[2] = {0.0, 1.0};
1447 auto linear = flutter::DlColorSource::MakeLinear(
1448 {100.0, 100.0}, {300.0, 300.0}, 2, colors.data(), stops,
1449 flutter::DlTileMode::kRepeat);
1451 flutter::DisplayListBuilder builder;
1452 flutter::DlPaint paint;
1454 paint.setColorSource(linear);
1455 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
1457 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1461 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
1463 std::vector<SkPoint> positions = {SkPoint::Make(100, 300),
1464 SkPoint::Make(200, 100),
1465 SkPoint::Make(300, 300)};
1466 std::vector<SkPoint> texture_coordinates = {
1467 SkPoint::Make(0, 0), SkPoint::Make(100, 200), SkPoint::Make(200, 100)};
1469 auto vertices = flutter::DlVertices::Make(
1470 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1471 texture_coordinates.data(),
nullptr);
1473 flutter::DisplayListBuilder builder;
1474 flutter::DlPaint paint;
1476 auto image_source = flutter::DlImageColorSource(
1477 dl_image, flutter::DlTileMode::kRepeat, flutter::DlTileMode::kRepeat);
1479 paint.setColorSource(&image_source);
1480 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
1482 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1486 DrawVerticesImageSourceWithTextureCoordinatesAndColorBlending) {
1487 auto texture = CreateTextureForFixture(
"embarcadero.jpg");
1489 std::vector<SkPoint> positions = {SkPoint::Make(100, 300),
1490 SkPoint::Make(200, 100),
1491 SkPoint::Make(300, 300)};
1492 std::vector<flutter::DlColor> colors = {flutter::DlColor::kWhite(),
1493 flutter::DlColor::kGreen(),
1494 flutter::DlColor::kWhite()};
1495 std::vector<SkPoint> texture_coordinates = {
1496 SkPoint::Make(0, 0), SkPoint::Make(100, 200), SkPoint::Make(200, 100)};
1498 auto vertices = flutter::DlVertices::Make(
1499 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1500 texture_coordinates.data(), colors.data());
1502 flutter::DisplayListBuilder builder;
1503 flutter::DlPaint paint;
1505 auto image_source = flutter::DlImageColorSource(
1506 dl_image, flutter::DlTileMode::kRepeat, flutter::DlTileMode::kRepeat);
1508 paint.setColorSource(&image_source);
1509 builder.DrawVertices(vertices, flutter::DlBlendMode::kModulate, paint);
1511 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1515 std::vector<SkPoint> positions = {
1516 SkPoint::Make(100, 300), SkPoint::Make(200, 100), SkPoint::Make(300, 300),
1517 SkPoint::Make(200, 500)};
1518 std::vector<uint16_t> indices = {0, 1, 2, 0, 2, 3};
1520 auto vertices = flutter::DlVertices::Make(
1521 flutter::DlVertexMode::kTriangles, 6, positions.data(),
1522 nullptr,
nullptr, 6, indices.data());
1524 flutter::DisplayListBuilder builder;
1525 flutter::DlPaint paint;
1527 paint.setColor(flutter::DlColor::kWhite());
1528 builder.DrawVertices(vertices, flutter::DlBlendMode::kSrcOver, paint);
1530 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1534 std::vector<SkPoint> positions = {
1535 SkPoint::Make(100, 300), SkPoint::Make(200, 100), SkPoint::Make(300, 300),
1536 SkPoint::Make(200, 500)};
1537 auto color = flutter::DlColor::kBlue().withAlpha(0x99);
1538 std::vector<uint16_t> indices = {0, 1, 2, 0, 2, 3};
1539 std::vector<flutter::DlColor> colors = {color, color, color, color};
1541 auto vertices = flutter::DlVertices::Make(
1542 flutter::DlVertexMode::kTriangles, 6, positions.data(),
1543 nullptr, colors.data(), 6, indices.data());
1545 flutter::DisplayListBuilder builder;
1546 flutter::DlPaint paint;
1547 paint.setBlendMode(flutter::DlBlendMode::kSrcOver);
1548 paint.setColor(flutter::DlColor::kRed());
1550 builder.DrawRect(SkRect::MakeLTRB(0, 0, 400, 400), paint);
1551 builder.DrawVertices(vertices, flutter::DlBlendMode::kDst, paint);
1553 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1557 flutter::DisplayListBuilder builder;
1558 std::vector<flutter::DlStrokeJoin> joins = {
1559 flutter::DlStrokeJoin::kBevel,
1560 flutter::DlStrokeJoin::kRound,
1561 flutter::DlStrokeJoin::kMiter,
1563 flutter::DlPaint paint =
1565 .setColor(flutter::DlColor::kWhite())
1566 .setDrawStyle(flutter::DlDrawStyle::kFill)
1567 .setStrokeWidth(10);
1568 flutter::DlPaint stroke_paint =
1570 .setColor(flutter::DlColor::kWhite())
1571 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1572 .setStrokeWidth(10);
1573 SkPath path = SkPath().addPoly({{150, 50}, {160, 50}},
false);
1575 builder.Translate(300, 50);
1576 builder.Scale(0.8, 0.8);
1577 for (
auto join : joins) {
1578 paint.setStrokeJoin(join);
1579 stroke_paint.setStrokeJoin(join);
1580 builder.DrawRect(SkRect::MakeXYWH(0, 0, 100, 100), paint);
1581 builder.DrawRect(SkRect::MakeXYWH(0, 150, 100, 100), stroke_paint);
1583 SkRRect::MakeRectXY(SkRect::MakeXYWH(150, 0, 100, 100), 30, 30), paint);
1585 SkRRect::MakeRectXY(SkRect::MakeXYWH(150, 150, 100, 100), 30, 30),
1587 builder.DrawCircle({350, 50}, 50, paint);
1588 builder.DrawCircle({350, 200}, 50, stroke_paint);
1589 builder.Translate(0, 300);
1591 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1595 flutter::DisplayListBuilder builder;
1597 flutter::DlPaint fill_paint =
1599 .setColor(flutter::DlColor::kBlue())
1600 .setDrawStyle(flutter::DlDrawStyle::kFill)
1601 .setStrokeWidth(10);
1602 flutter::DlPaint stroke_paint =
1604 .setColor(flutter::DlColor::kGreen())
1605 .setDrawStyle(flutter::DlDrawStyle::kStroke)
1606 .setStrokeWidth(10);
1609 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1612 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 100, 300, 300), 120, 40),
1616 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1619 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 500, 300, 300), 40, 120),
1622 flutter::DlPaint reference_paint =
1624 .setColor(flutter::DlColor::kMidGrey())
1625 .setDrawStyle(flutter::DlDrawStyle::kFill)
1626 .setStrokeWidth(10);
1629 SkRRect::MakeRectXY(SkRect::MakeXYWH(500, 500, 300, 300), 40, 40),
1632 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 100, 300, 300), 120, 120),
1635 flutter::DlPaint clip_fill_paint =
1637 .setColor(flutter::DlColor::kCyan())
1638 .setDrawStyle(flutter::DlDrawStyle::kFill)
1639 .setStrokeWidth(10);
1643 SkRRect::MakeRectXY(SkRect::MakeXYWH(900, 100, 300, 300), 120, 40));
1644 builder.DrawPaint(clip_fill_paint);
1649 SkRRect::MakeRectXY(SkRect::MakeXYWH(100, 900, 300, 300), 40, 120));
1650 builder.DrawPaint(clip_fill_paint);
1653 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1657 std::vector<const char*> blend_mode_names;
1658 std::vector<flutter::DlBlendMode> blend_mode_values;
1660 const std::vector<std::tuple<const char*, flutter::DlBlendMode>> blends = {
1662 {
"Clear", flutter::DlBlendMode::kClear},
1663 {
"Source", flutter::DlBlendMode::kSrc},
1664 {
"Destination", flutter::DlBlendMode::kDst},
1665 {
"SourceOver", flutter::DlBlendMode::kSrcOver},
1666 {
"DestinationOver", flutter::DlBlendMode::kDstOver},
1667 {
"SourceIn", flutter::DlBlendMode::kSrcIn},
1668 {
"DestinationIn", flutter::DlBlendMode::kDstIn},
1669 {
"SourceOut", flutter::DlBlendMode::kSrcOut},
1670 {
"DestinationOut", flutter::DlBlendMode::kDstOut},
1671 {
"SourceATop", flutter::DlBlendMode::kSrcATop},
1672 {
"DestinationATop", flutter::DlBlendMode::kDstATop},
1673 {
"Xor", flutter::DlBlendMode::kXor},
1674 {
"Plus", flutter::DlBlendMode::kPlus},
1675 {
"Modulate", flutter::DlBlendMode::kModulate},
1677 {
"Screen", flutter::DlBlendMode::kScreen},
1678 {
"Overlay", flutter::DlBlendMode::kOverlay},
1679 {
"Darken", flutter::DlBlendMode::kDarken},
1680 {
"Lighten", flutter::DlBlendMode::kLighten},
1681 {
"ColorDodge", flutter::DlBlendMode::kColorDodge},
1682 {
"ColorBurn", flutter::DlBlendMode::kColorBurn},
1683 {
"HardLight", flutter::DlBlendMode::kHardLight},
1684 {
"SoftLight", flutter::DlBlendMode::kSoftLight},
1685 {
"Difference", flutter::DlBlendMode::kDifference},
1686 {
"Exclusion", flutter::DlBlendMode::kExclusion},
1687 {
"Multiply", flutter::DlBlendMode::kMultiply},
1688 {
"Hue", flutter::DlBlendMode::kHue},
1689 {
"Saturation", flutter::DlBlendMode::kSaturation},
1691 {
"Luminosity", flutter::DlBlendMode::kLuminosity},
1693 assert(blends.size() ==
1694 static_cast<size_t>(flutter::DlBlendMode::kLastMode) + 1);
1695 for (
const auto& [name, mode] : blends) {
1696 blend_mode_names.push_back(name);
1697 blend_mode_values.push_back(mode);
1701 auto callback = [&]() {
1702 static int current_blend_index = 3;
1703 static float dst_alpha = 1;
1704 static float src_alpha = 1;
1705 static float color0[4] = {1.0f, 0.0f, 0.0f, 1.0f};
1706 static float color1[4] = {0.0f, 1.0f, 0.0f, 1.0f};
1707 static float color2[4] = {0.0f, 0.0f, 1.0f, 1.0f};
1708 static float src_color[4] = {1.0f, 1.0f, 1.0f, 1.0f};
1710 ImGui::Begin(
"Controls",
nullptr, ImGuiWindowFlags_AlwaysAutoResize);
1712 ImGui::ListBox(
"Blending mode", ¤t_blend_index,
1713 blend_mode_names.data(), blend_mode_names.size());
1714 ImGui::SliderFloat(
"Source alpha", &src_alpha, 0, 1);
1715 ImGui::ColorEdit4(
"Color A", color0);
1716 ImGui::ColorEdit4(
"Color B", color1);
1717 ImGui::ColorEdit4(
"Color C", color2);
1718 ImGui::ColorEdit4(
"Source Color", src_color);
1719 ImGui::SliderFloat(
"Destination alpha", &dst_alpha, 0, 1);
1723 std::vector<SkPoint> positions = {SkPoint::Make(100, 300),
1724 SkPoint::Make(200, 100),
1725 SkPoint::Make(300, 300)};
1726 std::vector<flutter::DlColor> colors = {
1727 toColor(color0).modulateOpacity(dst_alpha),
1728 toColor(color1).modulateOpacity(dst_alpha),
1729 toColor(color2).modulateOpacity(dst_alpha)};
1731 auto vertices = flutter::DlVertices::Make(
1732 flutter::DlVertexMode::kTriangles, 3, positions.data(),
1733 nullptr, colors.data());
1735 flutter::DisplayListBuilder builder;
1736 flutter::DlPaint paint;
1738 paint.setColor(
toColor(src_color).modulateOpacity(src_alpha));
1739 builder.DrawVertices(vertices, blend_mode_values[current_blend_index],
1741 return builder.Build();
1744 ASSERT_TRUE(OpenPlaygroundHere(callback));
1747 template <
typename Contents>
1749 std::optional<Rect> coverage;
1750 picture.
pass->IterateAllEntities([&coverage](
Entity& entity) {
1751 if (std::static_pointer_cast<Contents>(entity.
GetContents())) {
1752 auto contents = std::static_pointer_cast<Contents>(entity.GetContents());
1754 coverage = contents->GetCoverage(entity);
1763 SkRRect rrect = SkRRect::MakeRectXY(SkRect::MakeLTRB(0, 0, 100, 100), 4, 4);
1764 SkPath path = SkPath().addRRect(rrect);
1766 flutter::DlPaint paint;
1767 flutter::DisplayListBuilder builder;
1769 builder.DrawPath(path, paint);
1770 auto display_list = builder.Build();
1773 display_list->Dispatch(dispatcher);
1776 std::optional<Rect> coverage =
1777 GetCoverageOfFirstEntity<SolidColorContents>(picture);
1780 ASSERT_TRUE(coverage.has_value());
1786 SkPath path = SkPath().addCircle(0, 0, 5);
1788 flutter::DlPaint paint;
1789 flutter::DisplayListBuilder builder;
1791 builder.DrawPath(path, paint);
1792 auto display_list = builder.Build();
1795 display_list->Dispatch(dispatcher);
1798 std::optional<Rect> coverage =
1799 GetCoverageOfFirstEntity<SolidColorContents>(picture);
1801 ASSERT_TRUE(coverage.has_value());
1806 #ifdef IMPELLER_ENABLE_3D
1810 flutter::testing::OpenFixtureAsMapping(
"flutter_logo_baked.glb.ipscene");
1811 ASSERT_NE(mapping,
nullptr);
1813 std::shared_ptr<scene::Node> gltf_scene =
1815 *mapping, *GetContext()->GetResourceAllocator());
1816 ASSERT_NE(gltf_scene,
nullptr);
1818 flutter::DisplayListBuilder builder;
1820 auto color_source = std::make_shared<flutter::DlSceneColorSource>(
1825 flutter::DlPaint paint = flutter::DlPaint().setColorSource(color_source);
1827 builder.DrawPaint(paint);
1829 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));