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;
95 builder.Translate(100.0, 100.0);
99 std::vector<DlColor> colors = {DlColor(0xFFCCCCCC), DlColor(0xFF333333)};
100 std::vector<Scalar> stops = {0.0, 1.0};
102 paint.setColorSource(DlColorSource::MakeLinear(
103 {0, 0}, {800, 500}, 2, colors.data(), stops.data(), DlTileMode::kClamp));
104 builder.DrawRect(DlRect::MakeXYWH(0, 0, 800, 500), paint);
113 DisplayListBuilder builder;
115 builder.Translate(100.0, 100.0);
118 std::vector<DlColor> colors = {DlColor(
Color{1.0, 1.0, 1.0, 1.0}.
ToARGB()),
120 std::vector<Scalar> stops = {0.0, 1.0};
122 paint.setColorSource(DlColorSource::MakeRadial(
123 {600, 600}, 600, 2, colors.data(), stops.data(), DlTileMode::kClamp));
124 builder.DrawRect(DlRect::MakeXYWH(0, 0, 1200, 1200), paint);
133 DisplayListBuilder builder;
136 builder.Translate(100.0, 100.0);
139 std::vector<DlColor> colors = {DlColor(
Color{1.0, 1.0, 1.0, 1.0}.
ToARGB()),
141 std::vector<Scalar> stops = {0.0, 1.0};
143 paint.setColorSource(DlColorSource::MakeSweep(
144 {100, 100}, 45, 135, 2, colors.data(), stops.data(),
145 DlTileMode::kMirror));
147 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
156 DisplayListBuilder builder;
159 builder.Translate(100.0, 100.0);
162 std::vector<DlColor> colors = {DlColor(
Color{1.0, 1.0, 1.0, 1.0}.
ToARGB()),
164 std::vector<Scalar> stops = {0.0, 1.0};
166 paint.setColorSource(DlColorSource::MakeConical({0, 1}, 0, {100, 100}, 100, 2,
167 colors.data(), stops.data(),
168 DlTileMode::kMirror));
170 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
179 void CanRenderLinearGradientWithOverlappingStops(
AiksTest* aiks_test,
180 DlTileMode tile_mode) {
181 DisplayListBuilder builder;
183 builder.Translate(100.0, 100.0);
185 std::vector<DlColor> colors = {
186 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
187 DlColor(Color{0.9568, 0.2627, 0.2118, 1.0}.ToARGB()),
188 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB()),
189 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB())};
190 std::vector<Scalar> stops = {0.0, 0.5, 0.5, 1.0};
192 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {500, 500},
193 stops.size(), colors.data(),
194 stops.data(), tile_mode));
196 paint.setColor(DlColor::kWhite());
197 builder.DrawRect(DlRect::MakeXYWH(0, 0, 500, 500), paint);
198 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
204 CanRenderLinearGradientWithOverlappingStops(
this, DlTileMode::kClamp);
208 void CanRenderGradientWithIncompleteStops(
AiksTest* aiks_test,
209 DlColorSourceType
type) {
210 const DlTileMode tile_modes[4] = {
219 const DlScalar quadrant_size = test_size + test_border * 2;
221 DisplayListBuilder builder;
222 builder.DrawRect(DlRect::MakeWH(quadrant_size * 2, quadrant_size * 2),
223 DlPaint().setColor(DlColor::kDarkGrey()));
225 for (
int quadrant = 0; quadrant < 4; quadrant++) {
227 builder.Translate((quadrant & 1) * quadrant_size + test_border,
228 (quadrant >> 1) * quadrant_size + test_border);
230 if (
type == DlColorSourceType::kLinearGradient) {
234 DlScalar ten_percent = gradient_size * 0.1;
235 for (
int i = gradient_size / 2; i <= test_size / 2; i += gradient_size) {
236 auto draw_at = [=](DlCanvas& canvas,
DlScalar offset, DlColor color) {
238 line_paint.setColor(color);
240 line_paint.setStrokeWidth(2.0f);
241 line_paint.setDrawStyle(DlDrawStyle::kStroke);
244 DlScalar across_distance = test_size / 2 + 10 - offset;
245 DlPoint across(across_distance, -across_distance);
247 canvas.DrawLine(center - along - across,
248 center - along + across,
250 canvas.DrawLine(center + along - across,
251 center + along + across,
256 draw_at(builder, i - ten_percent, DlColor::kMidGrey());
257 draw_at(builder, i, DlColor::kWhite());
258 draw_at(builder, i + ten_percent, DlColor::kMidGrey());
262 std::vector<DlColor> colors = {
268 std::vector<Scalar> stops = {0.1, 0.3, 0.7, 0.9};
272 case DlColorSourceType::kLinearGradient:
273 paint.setColorSource(DlColorSource::MakeLinear(
274 {test_size / 2 - gradient_size / 2,
275 test_size / 2 - gradient_size / 2},
276 {test_size / 2 + gradient_size / 2,
277 test_size / 2 + gradient_size / 2},
278 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
280 case DlColorSourceType::kRadialGradient:
281 paint.setColorSource(DlColorSource::MakeRadial(
282 {test_size / 2, test_size / 2}, gradient_size,
283 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
285 case DlColorSourceType::kConicalGradient:
286 paint.setColorSource(DlColorSource::MakeConical(
287 {test_size / 2, test_size / 2}, 0,
288 {test_size / 2 + 20, test_size / 2 - 10}, gradient_size,
289 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
291 case DlColorSourceType::kSweepGradient:
292 paint.setColorSource(DlColorSource::MakeSweep(
293 {test_size / 2, test_size / 2}, 0, 45,
294 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
300 builder.DrawRect(DlRect::MakeXYWH(0, 0, test_size, test_size), paint);
304 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
309 CanRenderGradientWithIncompleteStops(
this,
310 DlColorSourceType::kLinearGradient);
313 CanRenderGradientWithIncompleteStops(
this,
314 DlColorSourceType::kRadialGradient);
317 CanRenderGradientWithIncompleteStops(
this,
318 DlColorSourceType::kConicalGradient);
321 CanRenderGradientWithIncompleteStops(
this, DlColorSourceType::kSweepGradient);
325 void CanRenderLinearGradientManyColors(
AiksTest* aiks_test,
326 DlTileMode tile_mode) {
327 DisplayListBuilder builder;
328 builder.Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
330 builder.Translate(100, 100);
332 std::vector<DlColor> colors = {
333 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
334 DlColor(Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.ToARGB()),
335 DlColor(Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
336 DlColor(Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.ToARGB()),
337 DlColor(Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.ToARGB()),
338 DlColor(Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
339 DlColor(Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.ToARGB())};
340 std::vector<Scalar> stops = {
350 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
351 stops.size(), colors.data(),
352 stops.data(), tile_mode));
354 paint.setColor(DlColor::kWhite());
355 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
357 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
362 CanRenderLinearGradientManyColors(
this, DlTileMode::kClamp);
365 CanRenderLinearGradientManyColors(
this, DlTileMode::kRepeat);
368 CanRenderLinearGradientManyColors(
this, DlTileMode::kMirror);
371 CanRenderLinearGradientManyColors(
this, DlTileMode::kDecal);
375 void CanRenderLinearGradientWayManyColors(
AiksTest* aiks_test,
376 DlTileMode tile_mode) {
377 DisplayListBuilder builder;
379 builder.Translate(100.0, 100.0);
380 auto color = DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB());
381 std::vector<DlColor> colors;
382 std::vector<Scalar> stops;
383 auto current_stop = 0.0;
384 for (
int i = 0; i < 2000; i++) {
385 colors.push_back(color);
386 stops.push_back(current_stop);
387 current_stop += 1 / 2000.0;
389 stops[2000 - 1] = 1.0;
391 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
392 stops.size(), colors.data(),
393 stops.data(), tile_mode));
395 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
396 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
402 CanRenderLinearGradientWayManyColors(
this, DlTileMode::kClamp);
406 auto callback = [&]() -> sk_sp<DisplayList> {
407 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
408 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
409 DlTileMode::kMirror, DlTileMode::kDecal};
411 static int selected_tile_mode = 0;
413 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
414 ImGuiWindowFlags_AlwaysAutoResize)) {
415 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
416 sizeof(tile_mode_names) /
sizeof(
char*));
417 std::string label =
"##1";
418 for (
int i = 0; i < 4; i++) {
419 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
420 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
426 DisplayListBuilder builder;
428 builder.Translate(100.0, 100.0);
429 auto tile_mode = tile_modes[selected_tile_mode];
431 std::vector<DlColor> colors = {
432 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
433 DlColor(
Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.
ToARGB()),
434 DlColor(
Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
435 DlColor(
Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.
ToARGB()),
436 DlColor(
Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.
ToARGB()),
437 DlColor(
Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
438 DlColor(
Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.
ToARGB())};
439 std::vector<Scalar> stops = {
440 0.0, 2.0 / 62.0, 4.0 / 62.0, 8.0 / 62.0, 16.0 / 62.0, 32.0 / 62.0, 1.0,
443 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
444 stops.size(), colors.data(),
445 stops.data(), tile_mode));
447 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
448 return builder.Build();
450 ASSERT_TRUE(OpenPlaygroundHere(callback));
454 DisplayListBuilder builder;
456 std::vector<DlColor> colors = {
457 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed(), DlColor::kWhite(),
458 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed(), DlColor::kWhite(),
459 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed()};
460 std::vector<Scalar> stops = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5,
461 0.6, 0.7, 0.8, 0.9, 1.0};
464 paint.setColor(DlColor::kWhite());
465 paint.setColorSource(DlColorSource::MakeLinear(
466 {200, 200}, {400, 400}, stops.size(), colors.data(), stops.data(),
467 DlTileMode::kClamp));
468 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
470 builder.DrawCircle(
DlPoint(300, 300), 200, paint);
471 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
473 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
477 auto callback = [&]() -> sk_sp<DisplayList> {
478 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
479 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
480 DlTileMode::kMirror, DlTileMode::kDecal};
482 static int selected_tile_mode = 0;
484 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
485 ImGuiWindowFlags_AlwaysAutoResize)) {
486 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
487 sizeof(tile_mode_names) /
sizeof(
char*));
488 std::string label =
"##1";
489 for (
int i = 0; i < 4; i++) {
490 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
491 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
497 DisplayListBuilder builder;
499 builder.Translate(100.0, 100.0);
500 auto tile_mode = tile_modes[selected_tile_mode];
502 std::vector<DlColor> colors = {
503 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
504 DlColor(
Color{0.1294, 0.5882, 0.9529, 1.0}.
ToARGB())};
505 std::vector<Scalar> stops = {0.0, 1.0};
507 paint.setColorSource(DlColorSource::MakeRadial(
508 {100, 100}, 100, 2, colors.data(), stops.data(), tile_mode));
510 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
511 return builder.Build();
513 ASSERT_TRUE(OpenPlaygroundHere(callback));
517 auto callback = [&]() -> sk_sp<DisplayList> {
518 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
519 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
520 DlTileMode::kMirror, DlTileMode::kDecal};
522 static int selected_tile_mode = 0;
529 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
530 ImGuiWindowFlags_AlwaysAutoResize)) {
531 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
532 sizeof(tile_mode_names) /
sizeof(
char*));
533 std::string label =
"##1";
534 for (
int i = 0; i < 4; i++) {
535 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
536 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
542 DisplayListBuilder builder;
544 builder.Translate(100.0, 100.0);
545 auto tile_mode = tile_modes[selected_tile_mode];
547 std::vector<DlColor> colors = {
548 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
549 DlColor(
Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.
ToARGB()),
550 DlColor(
Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
551 DlColor(
Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.
ToARGB()),
552 DlColor(
Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.
ToARGB()),
553 DlColor(
Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
554 DlColor(
Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.
ToARGB())};
555 std::vector<Scalar> stops = {
565 paint.setColorSource(DlColorSource::MakeRadial(
566 {100, 100}, 100, stops.size(), colors.data(), stops.data(), tile_mode));
568 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
569 return builder.Build();
571 ASSERT_TRUE(OpenPlaygroundHere(callback));
575 void CanRenderSweepGradient(
AiksTest* aiks_test, DlTileMode tile_mode) {
576 DisplayListBuilder builder;
577 builder.Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
579 builder.Translate(100, 100);
581 std::vector<DlColor> colors = {
582 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
583 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB())};
584 std::vector<Scalar> stops = {0.0, 1.0};
586 paint.setColorSource(DlColorSource::MakeSweep(
587 {100, 100}, 45, 135, 2, colors.data(),
588 stops.data(), tile_mode));
590 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
591 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
596 CanRenderSweepGradient(
this, DlTileMode::kClamp);
599 CanRenderSweepGradient(
this, DlTileMode::kRepeat);
602 CanRenderSweepGradient(
this, DlTileMode::kMirror);
605 CanRenderSweepGradient(
this, DlTileMode::kDecal);
609 void CanRenderSweepGradientManyColors(
AiksTest* aiks_test,
610 DlTileMode tile_mode) {
611 DisplayListBuilder builder;
613 builder.Translate(100.0, 100.0);
615 std::vector<DlColor> colors = {
616 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
617 DlColor(Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.ToARGB()),
618 DlColor(Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
619 DlColor(Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.ToARGB()),
620 DlColor(Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.ToARGB()),
621 DlColor(Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
622 DlColor(Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.ToARGB())};
623 std::vector<Scalar> stops = {
633 paint.setColorSource(DlColorSource::MakeSweep({100, 100}, 45, 135,
634 stops.size(), colors.data(),
635 stops.data(), tile_mode));
637 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
638 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
643 CanRenderSweepGradientManyColors(
this, DlTileMode::kClamp);
646 CanRenderSweepGradientManyColors(
this, DlTileMode::kRepeat);
649 CanRenderSweepGradientManyColors(
this, DlTileMode::kMirror);
652 CanRenderSweepGradientManyColors(
this, DlTileMode::kDecal);
657 DisplayListBuilder builder;
659 paint.setColor(DlColor::kWhite());
660 builder.DrawRect(DlRect::MakeXYWH(0, 0, size * 3, size * 3), paint);
661 std::vector<DlColor> colors = {
662 DlColor(Color::MakeRGBA8(0xF4, 0x43, 0x36, 0xFF).ToARGB()),
663 DlColor(Color::MakeRGBA8(0xFF, 0xEB, 0x3B, 0xFF).ToARGB()),
664 DlColor(Color::MakeRGBA8(0x4c, 0xAF, 0x50, 0xFF).ToARGB()),
665 DlColor(Color::MakeRGBA8(0x21, 0x96, 0xF3, 0xFF).ToARGB())};
666 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
667 std::array<std::tuple<DlPoint, float, DlPoint, float>, 8> array{
668 std::make_tuple(
DlPoint(size / 2.f, size / 2.f), 0.f,
669 DlPoint(size / 2.f, size / 2.f), size / 2.f),
670 std::make_tuple(
DlPoint(size / 2.f, size / 2.f), size / 4.f,
671 DlPoint(size / 2.f, size / 2.f), size / 2.f),
672 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), 0.f,
673 DlPoint(size / 2.f, size / 2.f), size / 2.f),
674 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 2.f,
675 DlPoint(size / 2.f, size / 2.f), 0),
676 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 4.f,
677 DlPoint(size / 2.f, size / 2.f), size / 2.f),
678 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 16.f,
679 DlPoint(size / 2.f, size / 2.f), size / 8.f),
680 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 8.f,
681 DlPoint(size / 2.f, size / 2.f), size / 16.f),
682 std::make_tuple(
DlPoint(size / 8.f, size / 8.f), size / 8.f,
683 DlPoint(size / 2.f, size / 2.f), size / 8.f),
685 for (
int i = 0; i < 8; i++) {
687 builder.Translate((i % 3) * size, i / 3 * size);
688 paint.setColorSource(DlColorSource::MakeConical(
689 std::get<2>(array[i]),
690 std::get<3>(array[i]),
691 std::get<0>(array[i]),
692 std::get<1>(array[i]),
696 DlTileMode::kClamp));
697 builder.DrawRect(DlRect::MakeXYWH(0, 0, size, size), paint);
700 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
704 std::vector<DlColor> colors = {
705 DlColor(Color::MakeRGBA8(0xF4, 0x43, 0x36, 0xFF).ToARGB()),
706 DlColor(Color::MakeRGBA8(0xFF, 0xEB, 0x3B, 0xFF).ToARGB()),
707 DlColor(Color::MakeRGBA8(0x4c, 0xAF, 0x50, 0xFF).ToARGB()),
708 DlColor(Color::MakeRGBA8(0x21, 0x96, 0xF3, 0xFF).ToARGB())};
709 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
711 std::array<std::shared_ptr<DlColorSource>, 3> color_sources = {
712 DlColorSource::MakeLinear({0, 0}, {100, 100}, stops.size(), colors.data(),
713 stops.data(), DlTileMode::kDecal),
714 DlColorSource::MakeRadial({100, 100}, 100, stops.size(), colors.data(),
715 stops.data(), DlTileMode::kDecal),
716 DlColorSource::MakeSweep({100, 100}, 45, 135, stops.size(), colors.data(),
717 stops.data(), DlTileMode::kDecal),
720 DisplayListBuilder builder;
722 paint.setColor(DlColor::kWhite());
723 builder.DrawRect(DlRect::MakeLTRB(0, 0, 605, 205), paint);
724 for (
int i = 0; i < 3; i++) {
726 builder.Translate(i * 200.0f, 0);
727 paint.setColorSource(color_sources[i]);
728 builder.DrawRect(DlRect::MakeLTRB(0, 0, 200, 200), paint);
731 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
736 auto callback = [&]() -> sk_sp<DisplayList> {
737 static float scale = 3;
738 static bool add_circle_clip =
true;
739 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
740 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
741 DlTileMode::kMirror, DlTileMode::kDecal};
742 static int selected_tile_mode = 0;
743 static float alpha = 1;
745 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
746 ImGuiWindowFlags_AlwaysAutoResize)) {
747 ImGui::SliderFloat(
"Scale", &scale, 0, 6);
748 ImGui::Checkbox(
"Circle clip", &add_circle_clip);
749 ImGui::SliderFloat(
"Alpha", &alpha, 0, 1);
750 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
751 sizeof(tile_mode_names) /
sizeof(
char*));
755 DisplayListBuilder builder;
756 builder.Scale(GetContentScale().
x, GetContentScale().y);
758 paint.setColor(DlColor::kWhite());
759 builder.DrawPaint(paint);
761 paint.setDrawStyle(DlDrawStyle::kStroke);
762 paint.setColor(DlColor::kWhite().withAlpha(alpha * 255));
763 paint.setStrokeWidth(10);
764 auto tile_mode = tile_modes[selected_tile_mode];
766 std::vector<DlColor> colors = {
767 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
768 DlColor(
Color{0.1294, 0.5882, 0.9529, 1.0}.
ToARGB())};
769 std::vector<Scalar> stops = {0.0, 1.0};
771 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {50, 50},
772 stops.size(), colors.data(),
773 stops.data(), tile_mode));
775 DlPathBuilder path_builder;
776 path_builder.MoveTo(
DlPoint(20, 20));
778 path_builder.Close();
779 path_builder.MoveTo(
DlPoint(60, 20));
781 DlPath path = path_builder.TakePath();
783 builder.Scale(scale, scale);
785 if (add_circle_clip) {
790 auto [handle_a, handle_b] =
793 Matrix ip_matrix = builder.GetMatrix();
797 ip_matrix = ip_matrix.
Invert();
798 Point point_a = ip_matrix * handle_a * GetContentScale();
799 Point point_b = ip_matrix * handle_b * GetContentScale();
801 Point middle = (point_a + point_b) / 2;
803 builder.ClipPath(DlPath::MakeCircle(middle, radius));
807 {DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
808 paint.setStrokeJoin(join);
810 {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
811 paint.setStrokeCap(cap);
812 builder.DrawPath(path, paint);
813 builder.Translate(80, 0);
815 builder.Translate(-240, 60);
818 return builder.Build();
821 ASSERT_TRUE(OpenPlaygroundHere(callback));
826 DisplayListBuilder builder;
828 builder.Translate(100.0f, 0);
830 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
832 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
834 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {300, 0}, stops.size(),
835 colors.data(), stops.data(),
836 DlTileMode::kClamp));
838 paint.setColor(DlColor::kWhite());
839 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
840 builder.Translate(400, 0);
841 builder.DrawRoundRect(
842 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
844 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
849 DisplayListBuilder builder;
851 builder.Translate(100.0f, 0);
853 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
855 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
857 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {0, 300}, stops.size(),
858 colors.data(), stops.data(),
859 DlTileMode::kClamp));
861 paint.setColor(DlColor::kWhite());
862 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
863 builder.Translate(400, 0);
864 builder.DrawRoundRect(
865 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
867 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
872 DisplayListBuilder builder;
874 builder.Translate(100.0f, 0);
876 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
878 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
880 paint.setColorSource(DlColorSource::MakeLinear({300, 0}, {0, 0}, stops.size(),
881 colors.data(), stops.data(),
882 DlTileMode::kClamp));
884 paint.setColor(DlColor::kWhite());
885 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
886 builder.Translate(400, 0);
887 builder.DrawRoundRect(
888 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
890 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
895 DisplayListBuilder builder;
897 builder.Translate(100.0f, 0);
899 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
901 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
903 paint.setColorSource(DlColorSource::MakeLinear({0, 300}, {0, 0}, stops.size(),
904 colors.data(), stops.data(),
905 DlTileMode::kClamp));
907 paint.setColor(DlColor::kWhite());
908 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
909 builder.Translate(400, 0);
910 builder.DrawRoundRect(
911 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
913 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
917 DisplayListBuilder builder;
919 builder.Translate(100.0f, 0);
921 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
923 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
927 paint.setColorSource(
928 DlColorSource::MakeLinear({0, 150}, {0, 100}, stops.size(), colors.data(),
929 stops.data(), DlTileMode::kRepeat));
931 paint.setColor(DlColor::kWhite());
932 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
933 builder.Translate(400, 0);
934 builder.DrawRoundRect(
935 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
937 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