5 #include "display_list/display_list.h"
6 #include "display_list/dl_blend_mode.h"
7 #include "display_list/dl_tile_mode.h"
8 #include "display_list/effects/dl_color_filter.h"
9 #include "display_list/effects/dl_color_source.h"
10 #include "display_list/effects/dl_mask_filter.h"
11 #include "display_list/geometry/dl_path_builder.h"
14 #include "flutter/display_list/dl_builder.h"
15 #include "flutter/display_list/dl_color.h"
16 #include "flutter/display_list/dl_paint.h"
17 #include "flutter/testing/testing.h"
33 void CanRenderLinearGradient(
AiksTest* aiks_test, DlTileMode tile_mode) {
34 DisplayListBuilder builder;
35 Point scale = aiks_test->GetContentScale();
36 builder.Scale(scale.x, scale.y);
38 builder.Translate(100.0f, 0);
40 std::vector<DlColor> colors = {
41 DlColor(Color{0.9568, 0.2627, 0.2118, 1.0}.ToARGB()),
42 DlColor(Color{0.1294, 0.5882, 0.9529, 0.0}.ToARGB())};
43 std::vector<Scalar> stops = {0.0, 1.0};
45 auto gradient = DlColorSource::MakeLinear(
46 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), tile_mode);
47 paint.setColorSource(gradient);
48 paint.setColor(DlColor::kWhite());
49 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
50 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
56 CanRenderLinearGradient(
this, DlTileMode::kClamp);
59 CanRenderLinearGradient(
this, DlTileMode::kRepeat);
62 CanRenderLinearGradient(
this, DlTileMode::kMirror);
65 CanRenderLinearGradient(
this, DlTileMode::kDecal);
69 DisplayListBuilder builder;
70 Point scale = GetContentScale();
71 builder.Scale(scale.
x, scale.
y);
73 builder.Translate(100.0f, 0);
75 std::vector<DlColor> colors = {
76 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
77 DlColor(
Color{0.1294, 0.5882, 0.9529, 0.0}.
ToARGB())};
78 std::vector<Scalar> stops = {0.0, 1.0};
80 paint.setColorSource(DlColorSource::MakeLinear(
81 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kDecal));
85 paint.setColorFilter(DlColorFilter::MakeBlend(DlColor::kGreen().withAlpha(64),
86 DlBlendMode::kSrcOver));
87 paint.setColor(DlColor::kWhite());
88 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
89 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
93 DisplayListBuilder builder;
94 Point scale = GetContentScale();
95 builder.Scale(scale.
x, scale.
y);
97 builder.Translate(100.0f, 0);
99 std::vector<DlColor> colors = {
100 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
101 DlColor(
Color{0.1294, 0.5882, 0.9529, 0.0}.
ToARGB())};
102 std::vector<Scalar> stops = {0.0, 1.0};
104 paint.setColorSource(DlColorSource::MakeLinear(
105 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kClamp));
106 paint.setImageFilter(DlImageFilter::MakeBlur(20.0, 20.0, DlTileMode::kDecal));
107 paint.setColor(DlColor::kWhite());
108 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
109 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
113 DisplayListBuilder builder;
115 builder.Translate(100.0, 100.0);
119 std::vector<DlColor> colors = {DlColor(0xFFCCCCCC), DlColor(0xFF333333)};
120 std::vector<Scalar> stops = {0.0, 1.0};
122 paint.setColorSource(DlColorSource::MakeLinear(
123 {0, 0}, {800, 500}, 2, colors.data(), stops.data(), DlTileMode::kClamp));
124 builder.DrawRect(DlRect::MakeXYWH(0, 0, 800, 500), paint);
133 DisplayListBuilder builder;
135 builder.Translate(100.0, 100.0);
138 std::vector<DlColor> colors = {DlColor(
Color{1.0, 1.0, 1.0, 1.0}.
ToARGB()),
140 std::vector<Scalar> stops = {0.0, 1.0};
142 paint.setColorSource(DlColorSource::MakeRadial(
143 {600, 600}, 600, 2, colors.data(), stops.data(), DlTileMode::kClamp));
144 builder.DrawRect(DlRect::MakeXYWH(0, 0, 1200, 1200), paint);
153 DisplayListBuilder builder;
156 builder.Translate(100.0, 100.0);
159 std::vector<DlColor> colors = {DlColor(
Color{1.0, 1.0, 1.0, 1.0}.
ToARGB()),
161 std::vector<Scalar> stops = {0.0, 1.0};
163 paint.setColorSource(DlColorSource::MakeSweep(
164 {100, 100}, 45, 135, 2, colors.data(), stops.data(),
165 DlTileMode::kMirror));
167 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
176 DisplayListBuilder builder;
179 builder.Translate(100.0, 100.0);
182 std::vector<DlColor> colors = {DlColor(
Color{1.0, 1.0, 1.0, 1.0}.
ToARGB()),
184 std::vector<Scalar> stops = {0.0, 1.0};
186 paint.setColorSource(DlColorSource::MakeConical({0, 1}, 0, {100, 100}, 100, 2,
187 colors.data(), stops.data(),
188 DlTileMode::kMirror));
190 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
199 void CanRenderLinearGradientWithOverlappingStops(
AiksTest* aiks_test,
200 DlTileMode tile_mode) {
201 DisplayListBuilder builder;
203 builder.Translate(100.0, 100.0);
205 std::vector<DlColor> colors = {
206 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
207 DlColor(Color{0.9568, 0.2627, 0.2118, 1.0}.ToARGB()),
208 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB()),
209 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB())};
210 std::vector<Scalar> stops = {0.0, 0.5, 0.5, 1.0};
212 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {500, 500},
213 stops.size(), colors.data(),
214 stops.data(), tile_mode));
216 paint.setColor(DlColor::kWhite());
217 builder.DrawRect(DlRect::MakeXYWH(0, 0, 500, 500), paint);
218 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
224 CanRenderLinearGradientWithOverlappingStops(
this, DlTileMode::kClamp);
228 void CanRenderGradientWithIncompleteStops(
AiksTest* aiks_test,
229 DlColorSourceType type) {
230 const DlTileMode tile_modes[4] = {
239 const DlScalar quadrant_size = test_size + test_border * 2;
241 DisplayListBuilder builder;
242 builder.DrawRect(DlRect::MakeWH(quadrant_size * 2, quadrant_size * 2),
243 DlPaint().setColor(DlColor::kDarkGrey()));
245 for (
int quadrant = 0; quadrant < 4; quadrant++) {
247 builder.Translate((quadrant & 1) * quadrant_size + test_border,
248 (quadrant >> 1) * quadrant_size + test_border);
250 if (type == DlColorSourceType::kLinearGradient) {
254 DlScalar ten_percent = gradient_size * 0.1;
255 for (
int i = gradient_size / 2; i <= test_size / 2; i += gradient_size) {
256 auto draw_at = [=](DlCanvas& canvas,
DlScalar offset, DlColor color) {
258 line_paint.setColor(color);
260 line_paint.setStrokeWidth(2.0f);
261 line_paint.setDrawStyle(DlDrawStyle::kStroke);
264 DlScalar across_distance = test_size / 2 + 10 - offset;
265 DlPoint across(across_distance, -across_distance);
267 canvas.DrawLine(center - along - across,
268 center - along + across,
270 canvas.DrawLine(center + along - across,
271 center + along + across,
276 draw_at(builder, i - ten_percent, DlColor::kMidGrey());
277 draw_at(builder, i, DlColor::kWhite());
278 draw_at(builder, i + ten_percent, DlColor::kMidGrey());
282 std::vector<DlColor> colors = {
288 std::vector<Scalar> stops = {0.1, 0.3, 0.7, 0.9};
292 case DlColorSourceType::kLinearGradient:
293 paint.setColorSource(DlColorSource::MakeLinear(
294 {test_size / 2 - gradient_size / 2,
295 test_size / 2 - gradient_size / 2},
296 {test_size / 2 + gradient_size / 2,
297 test_size / 2 + gradient_size / 2},
298 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
300 case DlColorSourceType::kRadialGradient:
301 paint.setColorSource(DlColorSource::MakeRadial(
302 {test_size / 2, test_size / 2}, gradient_size,
303 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
305 case DlColorSourceType::kConicalGradient:
306 paint.setColorSource(DlColorSource::MakeConical(
307 {test_size / 2, test_size / 2}, 0,
308 {test_size / 2 + 20, test_size / 2 - 10}, gradient_size,
309 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
311 case DlColorSourceType::kSweepGradient:
312 paint.setColorSource(DlColorSource::MakeSweep(
313 {test_size / 2, test_size / 2}, 0, 45,
314 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
320 builder.DrawRect(DlRect::MakeXYWH(0, 0, test_size, test_size), paint);
324 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
329 CanRenderGradientWithIncompleteStops(
this,
330 DlColorSourceType::kLinearGradient);
333 CanRenderGradientWithIncompleteStops(
this,
334 DlColorSourceType::kRadialGradient);
337 CanRenderGradientWithIncompleteStops(
this,
338 DlColorSourceType::kConicalGradient);
341 CanRenderGradientWithIncompleteStops(
this, DlColorSourceType::kSweepGradient);
345 void CanRenderLinearGradientManyColors(
AiksTest* aiks_test,
346 DlTileMode tile_mode) {
347 DisplayListBuilder builder;
348 builder.Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
350 builder.Translate(100, 100);
352 std::vector<DlColor> colors = {
353 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
354 DlColor(Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.ToARGB()),
355 DlColor(Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
356 DlColor(Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.ToARGB()),
357 DlColor(Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.ToARGB()),
358 DlColor(Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
359 DlColor(Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.ToARGB())};
360 std::vector<Scalar> stops = {
370 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
371 stops.size(), colors.data(),
372 stops.data(), tile_mode));
374 paint.setColor(DlColor::kWhite());
375 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
377 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
382 CanRenderLinearGradientManyColors(
this, DlTileMode::kClamp);
385 CanRenderLinearGradientManyColors(
this, DlTileMode::kRepeat);
388 CanRenderLinearGradientManyColors(
this, DlTileMode::kMirror);
391 CanRenderLinearGradientManyColors(
this, DlTileMode::kDecal);
395 void CanRenderLinearGradientWayManyColors(
AiksTest* aiks_test,
396 DlTileMode tile_mode) {
397 DisplayListBuilder builder;
399 builder.Translate(100.0, 100.0);
400 auto color = DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB());
401 std::vector<DlColor> colors;
402 std::vector<Scalar> stops;
403 auto current_stop = 0.0;
404 for (
int i = 0; i < 2000; i++) {
405 colors.push_back(color);
406 stops.push_back(current_stop);
407 current_stop += 1 / 2000.0;
409 stops[2000 - 1] = 1.0;
411 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
412 stops.size(), colors.data(),
413 stops.data(), tile_mode));
415 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
416 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
422 CanRenderLinearGradientWayManyColors(
this, DlTileMode::kClamp);
426 auto callback = [&]() -> sk_sp<DisplayList> {
427 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
428 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
429 DlTileMode::kMirror, DlTileMode::kDecal};
431 static int selected_tile_mode = 0;
433 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
434 ImGuiWindowFlags_AlwaysAutoResize)) {
435 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
436 sizeof(tile_mode_names) /
sizeof(
char*));
437 std::string label =
"##1";
438 for (
int i = 0; i < 4; i++) {
439 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
440 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
446 DisplayListBuilder builder;
448 builder.Translate(100.0, 100.0);
449 auto tile_mode = tile_modes[selected_tile_mode];
451 std::vector<DlColor> colors = {
452 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
453 DlColor(
Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.
ToARGB()),
454 DlColor(
Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
455 DlColor(
Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.
ToARGB()),
456 DlColor(
Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.
ToARGB()),
457 DlColor(
Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
458 DlColor(
Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.
ToARGB())};
459 std::vector<Scalar> stops = {
460 0.0, 2.0 / 62.0, 4.0 / 62.0, 8.0 / 62.0, 16.0 / 62.0, 32.0 / 62.0, 1.0,
463 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
464 stops.size(), colors.data(),
465 stops.data(), tile_mode));
467 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
468 return builder.Build();
470 ASSERT_TRUE(OpenPlaygroundHere(callback));
474 DisplayListBuilder builder;
476 std::vector<DlColor> colors = {
477 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed(), DlColor::kWhite(),
478 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed(), DlColor::kWhite(),
479 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed()};
480 std::vector<Scalar> stops = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5,
481 0.6, 0.7, 0.8, 0.9, 1.0};
484 paint.setColor(DlColor::kWhite());
485 paint.setColorSource(DlColorSource::MakeLinear(
486 {200, 200}, {400, 400}, stops.size(), colors.data(), stops.data(),
487 DlTileMode::kClamp));
488 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
490 builder.DrawCircle(
DlPoint(300, 300), 200, paint);
491 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
493 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
497 auto callback = [&]() -> sk_sp<DisplayList> {
498 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
499 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
500 DlTileMode::kMirror, DlTileMode::kDecal};
502 static int selected_tile_mode = 0;
504 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
505 ImGuiWindowFlags_AlwaysAutoResize)) {
506 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
507 sizeof(tile_mode_names) /
sizeof(
char*));
508 std::string label =
"##1";
509 for (
int i = 0; i < 4; i++) {
510 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
511 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
517 DisplayListBuilder builder;
519 builder.Translate(100.0, 100.0);
520 auto tile_mode = tile_modes[selected_tile_mode];
522 std::vector<DlColor> colors = {
523 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
524 DlColor(
Color{0.1294, 0.5882, 0.9529, 1.0}.
ToARGB())};
525 std::vector<Scalar> stops = {0.0, 1.0};
527 paint.setColorSource(DlColorSource::MakeRadial(
528 {100, 100}, 100, 2, colors.data(), stops.data(), tile_mode));
530 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
531 return builder.Build();
533 ASSERT_TRUE(OpenPlaygroundHere(callback));
537 auto callback = [&]() -> sk_sp<DisplayList> {
538 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
539 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
540 DlTileMode::kMirror, DlTileMode::kDecal};
542 static int selected_tile_mode = 0;
549 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
550 ImGuiWindowFlags_AlwaysAutoResize)) {
551 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
552 sizeof(tile_mode_names) /
sizeof(
char*));
553 std::string label =
"##1";
554 for (
int i = 0; i < 4; i++) {
555 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
556 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
562 DisplayListBuilder builder;
564 builder.Translate(100.0, 100.0);
565 auto tile_mode = tile_modes[selected_tile_mode];
567 std::vector<DlColor> colors = {
568 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
569 DlColor(
Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.
ToARGB()),
570 DlColor(
Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
571 DlColor(
Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.
ToARGB()),
572 DlColor(
Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.
ToARGB()),
573 DlColor(
Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
574 DlColor(
Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.
ToARGB())};
575 std::vector<Scalar> stops = {
585 paint.setColorSource(DlColorSource::MakeRadial(
586 {100, 100}, 100, stops.size(), colors.data(), stops.data(), tile_mode));
588 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
589 return builder.Build();
591 ASSERT_TRUE(OpenPlaygroundHere(callback));
595 void CanRenderSweepGradient(
AiksTest* aiks_test, DlTileMode tile_mode) {
596 DisplayListBuilder builder;
597 builder.Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
599 builder.Translate(100, 100);
601 std::vector<DlColor> colors = {
602 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
603 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB())};
604 std::vector<Scalar> stops = {0.0, 1.0};
606 paint.setColorSource(DlColorSource::MakeSweep(
607 {100, 100}, 45, 135, 2, colors.data(),
608 stops.data(), tile_mode));
610 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
611 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
616 CanRenderSweepGradient(
this, DlTileMode::kClamp);
619 CanRenderSweepGradient(
this, DlTileMode::kRepeat);
622 CanRenderSweepGradient(
this, DlTileMode::kMirror);
625 CanRenderSweepGradient(
this, DlTileMode::kDecal);
629 void CanRenderSweepGradientManyColors(
AiksTest* aiks_test,
630 DlTileMode tile_mode) {
631 DisplayListBuilder builder;
633 builder.Translate(100.0, 100.0);
635 std::vector<DlColor> colors = {
636 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
637 DlColor(Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.ToARGB()),
638 DlColor(Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
639 DlColor(Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.ToARGB()),
640 DlColor(Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.ToARGB()),
641 DlColor(Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
642 DlColor(Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.ToARGB())};
643 std::vector<Scalar> stops = {
653 paint.setColorSource(DlColorSource::MakeSweep({100, 100}, 45, 135,
654 stops.size(), colors.data(),
655 stops.data(), tile_mode));
657 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
658 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
663 CanRenderSweepGradientManyColors(
this, DlTileMode::kClamp);
666 CanRenderSweepGradientManyColors(
this, DlTileMode::kRepeat);
669 CanRenderSweepGradientManyColors(
this, DlTileMode::kMirror);
672 CanRenderSweepGradientManyColors(
this, DlTileMode::kDecal);
677 DisplayListBuilder builder;
679 paint.setColor(DlColor::kWhite());
680 builder.DrawRect(DlRect::MakeXYWH(0, 0, size * 3, size * 3), paint);
681 std::vector<DlColor> colors = {
682 DlColor(Color::MakeRGBA8(0xF4, 0x43, 0x36, 0xFF).ToARGB()),
683 DlColor(Color::MakeRGBA8(0xFF, 0xEB, 0x3B, 0xFF).ToARGB()),
684 DlColor(Color::MakeRGBA8(0x4c, 0xAF, 0x50, 0xFF).ToARGB()),
685 DlColor(Color::MakeRGBA8(0x21, 0x96, 0xF3, 0xFF).ToARGB())};
686 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
687 std::array<std::tuple<DlPoint, float, DlPoint, float>, 8> array{
688 std::make_tuple(
DlPoint(size / 2.f, size / 2.f), 0.f,
689 DlPoint(size / 2.f, size / 2.f), size / 2.f),
690 std::make_tuple(
DlPoint(size / 2.f, size / 2.f), size / 4.f,
691 DlPoint(size / 2.f, size / 2.f), size / 2.f),
692 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), 0.f,
693 DlPoint(size / 2.f, size / 2.f), size / 2.f),
694 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 2.f,
695 DlPoint(size / 2.f, size / 2.f), 0),
696 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 4.f,
697 DlPoint(size / 2.f, size / 2.f), size / 2.f),
698 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 16.f,
699 DlPoint(size / 2.f, size / 2.f), size / 8.f),
700 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 8.f,
701 DlPoint(size / 2.f, size / 2.f), size / 16.f),
702 std::make_tuple(
DlPoint(size / 8.f, size / 8.f), size / 8.f,
703 DlPoint(size / 2.f, size / 2.f), size / 8.f),
705 for (
int i = 0; i < 8; i++) {
707 builder.Translate((i % 3) * size, i / 3 * size);
708 paint.setColorSource(DlColorSource::MakeConical(
709 std::get<2>(array[i]),
710 std::get<3>(array[i]),
711 std::get<0>(array[i]),
712 std::get<1>(array[i]),
716 DlTileMode::kClamp));
717 builder.DrawRect(DlRect::MakeXYWH(0, 0, size, size), paint);
720 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
724 std::vector<DlColor> colors = {
725 DlColor(Color::MakeRGBA8(0xF4, 0x43, 0x36, 0xFF).ToARGB()),
726 DlColor(Color::MakeRGBA8(0xFF, 0xEB, 0x3B, 0xFF).ToARGB()),
727 DlColor(Color::MakeRGBA8(0x4c, 0xAF, 0x50, 0xFF).ToARGB()),
728 DlColor(Color::MakeRGBA8(0x21, 0x96, 0xF3, 0xFF).ToARGB())};
729 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
731 std::array<std::shared_ptr<DlColorSource>, 3> color_sources = {
732 DlColorSource::MakeLinear({0, 0}, {100, 100}, stops.size(), colors.data(),
733 stops.data(), DlTileMode::kDecal),
734 DlColorSource::MakeRadial({100, 100}, 100, stops.size(), colors.data(),
735 stops.data(), DlTileMode::kDecal),
736 DlColorSource::MakeSweep({100, 100}, 45, 135, stops.size(), colors.data(),
737 stops.data(), DlTileMode::kDecal),
740 DisplayListBuilder builder;
742 paint.setColor(DlColor::kWhite());
743 builder.DrawRect(DlRect::MakeLTRB(0, 0, 605, 205), paint);
744 for (
int i = 0; i < 3; i++) {
746 builder.Translate(i * 200.0f, 0);
747 paint.setColorSource(color_sources[i]);
748 builder.DrawRect(DlRect::MakeLTRB(0, 0, 200, 200), paint);
751 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
756 auto callback = [&]() -> sk_sp<DisplayList> {
757 static float scale = 3;
758 static bool add_circle_clip =
true;
759 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
760 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
761 DlTileMode::kMirror, DlTileMode::kDecal};
762 static int selected_tile_mode = 0;
763 static float alpha = 1;
765 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
766 ImGuiWindowFlags_AlwaysAutoResize)) {
767 ImGui::SliderFloat(
"Scale", &scale, 0, 6);
768 ImGui::Checkbox(
"Circle clip", &add_circle_clip);
769 ImGui::SliderFloat(
"Alpha", &alpha, 0, 1);
770 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
771 sizeof(tile_mode_names) /
sizeof(
char*));
775 DisplayListBuilder builder;
776 builder.Scale(GetContentScale().
x, GetContentScale().y);
778 paint.setColor(DlColor::kWhite());
779 builder.DrawPaint(paint);
781 paint.setDrawStyle(DlDrawStyle::kStroke);
782 paint.setColor(DlColor::kWhite().withAlpha(alpha * 255));
783 paint.setStrokeWidth(10);
784 auto tile_mode = tile_modes[selected_tile_mode];
786 std::vector<DlColor> colors = {
787 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
788 DlColor(
Color{0.1294, 0.5882, 0.9529, 1.0}.
ToARGB())};
789 std::vector<Scalar> stops = {0.0, 1.0};
791 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {50, 50},
792 stops.size(), colors.data(),
793 stops.data(), tile_mode));
795 DlPathBuilder path_builder;
796 path_builder.MoveTo(
DlPoint(20, 20));
798 path_builder.Close();
799 path_builder.MoveTo(
DlPoint(60, 20));
801 DlPath path = path_builder.TakePath();
803 builder.Scale(scale, scale);
805 if (add_circle_clip) {
810 auto [handle_a, handle_b] =
813 Matrix ip_matrix = builder.GetMatrix();
817 ip_matrix = ip_matrix.
Invert();
818 Point point_a = ip_matrix * handle_a * GetContentScale();
819 Point point_b = ip_matrix * handle_b * GetContentScale();
821 Point middle = (point_a + point_b) / 2;
823 builder.ClipPath(DlPath::MakeCircle(middle, radius));
827 {DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
828 paint.setStrokeJoin(join);
830 {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
831 paint.setStrokeCap(cap);
832 builder.DrawPath(path, paint);
833 builder.Translate(80, 0);
835 builder.Translate(-240, 60);
838 return builder.Build();
841 ASSERT_TRUE(OpenPlaygroundHere(callback));
846 DisplayListBuilder builder;
848 builder.Translate(100.0f, 0);
850 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
852 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
854 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {300, 0}, stops.size(),
855 colors.data(), stops.data(),
856 DlTileMode::kClamp));
858 paint.setColor(DlColor::kWhite());
859 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
860 builder.Translate(400, 0);
861 builder.DrawRoundRect(
862 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
864 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
869 DisplayListBuilder builder;
871 builder.Translate(100.0f, 0);
873 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
875 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
877 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {0, 300}, stops.size(),
878 colors.data(), stops.data(),
879 DlTileMode::kClamp));
881 paint.setColor(DlColor::kWhite());
882 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
883 builder.Translate(400, 0);
884 builder.DrawRoundRect(
885 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
887 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
892 DisplayListBuilder builder;
894 builder.Translate(100.0f, 0);
896 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
898 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
900 paint.setColorSource(DlColorSource::MakeLinear({300, 0}, {0, 0}, stops.size(),
901 colors.data(), stops.data(),
902 DlTileMode::kClamp));
904 paint.setColor(DlColor::kWhite());
905 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
906 builder.Translate(400, 0);
907 builder.DrawRoundRect(
908 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
910 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
915 DisplayListBuilder builder;
917 builder.Translate(100.0f, 0);
919 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
921 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
923 paint.setColorSource(DlColorSource::MakeLinear({0, 300}, {0, 0}, stops.size(),
924 colors.data(), stops.data(),
925 DlTileMode::kClamp));
927 paint.setColor(DlColor::kWhite());
928 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
929 builder.Translate(400, 0);
930 builder.DrawRoundRect(
931 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
933 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
937 DisplayListBuilder builder;
939 builder.Translate(100.0f, 0);
941 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
943 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
947 paint.setColorSource(
948 DlColorSource::MakeLinear({0, 150}, {0, 100}, stops.size(), colors.data(),
949 stops.data(), DlTileMode::kRepeat));
951 paint.setColor(DlColor::kWhite());
952 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
953 builder.Translate(400, 0);
954 builder.DrawRoundRect(
955 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
957 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
bool OpenPlaygroundHere(const AiksDlPlaygroundCallback &callback)
Point GetContentScale() const
static void CanRenderLinearGradientWithDithering(AiksTest *aiks_test)
static void CanRenderRadialGradientWithDithering(AiksTest *aiks_test)
static void CanRenderConicalGradientWithDithering(AiksTest *aiks_test)
static void CanRenderSweepGradientWithDithering(AiksTest *aiks_test)
TEST_P(AiksTest, VerifyNonOptimizedGradient)
std::tuple< Point, Point > DrawPlaygroundLine(PlaygroundPoint &point_a, PlaygroundPoint &point_b)
flutter::DlScalar DlScalar
uint32_t ToARGB() const
Convert to ARGB 32 bit color.
A 4x4 matrix using column-major storage.
bool IsInvertible() const
constexpr Type GetDistance(const TPoint &p) const