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"
13 #include "flutter/display_list/dl_builder.h"
14 #include "flutter/display_list/dl_color.h"
15 #include "flutter/display_list/dl_paint.h"
16 #include "flutter/testing/testing.h"
32 void CanRenderLinearGradient(
AiksTest* aiks_test, DlTileMode tile_mode) {
33 DisplayListBuilder builder;
37 builder.Translate(100.0f, 0);
39 std::vector<DlColor> colors = {
40 DlColor(Color{0.9568, 0.2627, 0.2118, 1.0}.ToARGB()),
41 DlColor(Color{0.1294, 0.5882, 0.9529, 0.0}.ToARGB())};
42 std::vector<Scalar> stops = {0.0, 1.0};
44 auto gradient = DlColorSource::MakeLinear(
45 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), tile_mode);
46 paint.setColorSource(gradient);
47 paint.setColor(DlColor::kWhite());
48 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
49 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
55 CanRenderLinearGradient(
this, DlTileMode::kClamp);
58 CanRenderLinearGradient(
this, DlTileMode::kRepeat);
61 CanRenderLinearGradient(
this, DlTileMode::kMirror);
64 CanRenderLinearGradient(
this, DlTileMode::kDecal);
68 DisplayListBuilder builder;
72 builder.Translate(100.0f, 0);
74 std::vector<DlColor> colors = {
75 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
76 DlColor(
Color{0.1294, 0.5882, 0.9529, 0.0}.
ToARGB())};
77 std::vector<Scalar> stops = {0.0, 1.0};
79 paint.setColorSource(DlColorSource::MakeLinear(
80 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kDecal));
84 paint.setColorFilter(DlColorFilter::MakeBlend(DlColor::kGreen().withAlpha(64),
85 DlBlendMode::kSrcOver));
86 paint.setColor(DlColor::kWhite());
87 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
88 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
92 DisplayListBuilder builder;
94 builder.Translate(100.0, 100.0);
98 std::vector<DlColor> colors = {DlColor(0xFFCCCCCC), DlColor(0xFF333333)};
99 std::vector<Scalar> stops = {0.0, 1.0};
101 paint.setColorSource(DlColorSource::MakeLinear(
102 {0, 0}, {800, 500}, 2, colors.data(), stops.data(), DlTileMode::kClamp));
103 builder.DrawRect(DlRect::MakeXYWH(0, 0, 800, 500), paint);
112 DisplayListBuilder builder;
114 builder.Translate(100.0, 100.0);
117 std::vector<DlColor> colors = {DlColor(
Color{1.0, 1.0, 1.0, 1.0}.
ToARGB()),
119 std::vector<Scalar> stops = {0.0, 1.0};
121 paint.setColorSource(DlColorSource::MakeRadial(
122 {600, 600}, 600, 2, colors.data(), stops.data(), DlTileMode::kClamp));
123 builder.DrawRect(DlRect::MakeXYWH(0, 0, 1200, 1200), paint);
132 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::MakeSweep(
143 {100, 100}, 45, 135, 2, colors.data(), stops.data(),
144 DlTileMode::kMirror));
146 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
155 DisplayListBuilder builder;
158 builder.Translate(100.0, 100.0);
161 std::vector<DlColor> colors = {DlColor(
Color{1.0, 1.0, 1.0, 1.0}.
ToARGB()),
163 std::vector<Scalar> stops = {0.0, 1.0};
165 paint.setColorSource(DlColorSource::MakeConical({0, 1}, 0, {100, 100}, 100, 2,
166 colors.data(), stops.data(),
167 DlTileMode::kMirror));
169 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
178 void CanRenderLinearGradientWithOverlappingStops(
AiksTest* aiks_test,
179 DlTileMode tile_mode) {
180 DisplayListBuilder builder;
182 builder.Translate(100.0, 100.0);
184 std::vector<DlColor> colors = {
185 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
186 DlColor(Color{0.9568, 0.2627, 0.2118, 1.0}.ToARGB()),
187 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB()),
188 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB())};
189 std::vector<Scalar> stops = {0.0, 0.5, 0.5, 1.0};
191 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {500, 500},
192 stops.size(), colors.data(),
193 stops.data(), tile_mode));
195 paint.setColor(DlColor::kWhite());
196 builder.DrawRect(DlRect::MakeXYWH(0, 0, 500, 500), paint);
197 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
203 CanRenderLinearGradientWithOverlappingStops(
this, DlTileMode::kClamp);
207 void CanRenderGradientWithIncompleteStops(
AiksTest* aiks_test,
208 DlColorSourceType
type) {
209 const DlTileMode tile_modes[4] = {
218 const DlScalar quadrant_size = test_size + test_border * 2;
220 DisplayListBuilder builder;
221 builder.DrawRect(DlRect::MakeWH(quadrant_size * 2, quadrant_size * 2),
222 DlPaint().setColor(DlColor::kDarkGrey()));
224 for (
int quadrant = 0; quadrant < 4; quadrant++) {
226 builder.Translate((quadrant & 1) * quadrant_size + test_border,
227 (quadrant >> 1) * quadrant_size + test_border);
229 if (
type == DlColorSourceType::kLinearGradient) {
233 DlScalar ten_percent = gradient_size * 0.1;
234 for (
int i = gradient_size / 2; i <= test_size / 2; i += gradient_size) {
235 auto draw_at = [=](DlCanvas& canvas,
DlScalar offset, DlColor color) {
237 line_paint.setColor(color);
239 line_paint.setStrokeWidth(2.0f);
240 line_paint.setDrawStyle(DlDrawStyle::kStroke);
244 DlPoint across(across_distance, -across_distance);
246 canvas.DrawLine(center - along - across,
247 center - along + across,
249 canvas.DrawLine(center + along - across,
250 center + along + across,
255 draw_at(builder, i - ten_percent, DlColor::kMidGrey());
256 draw_at(builder, i, DlColor::kWhite());
257 draw_at(builder, i + ten_percent, DlColor::kMidGrey());
261 std::vector<DlColor> colors = {
267 std::vector<Scalar> stops = {0.1, 0.3, 0.7, 0.9};
271 case DlColorSourceType::kLinearGradient:
272 paint.setColorSource(DlColorSource::MakeLinear(
273 {test_size / 2 - gradient_size / 2,
274 test_size / 2 - gradient_size / 2},
275 {test_size / 2 + gradient_size / 2,
276 test_size / 2 + gradient_size / 2},
277 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
279 case DlColorSourceType::kRadialGradient:
280 paint.setColorSource(DlColorSource::MakeRadial(
281 {test_size / 2, test_size / 2}, gradient_size,
282 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
284 case DlColorSourceType::kConicalGradient:
285 paint.setColorSource(DlColorSource::MakeConical(
286 {test_size / 2, test_size / 2}, 0,
287 {test_size / 2 + 20, test_size / 2 - 10}, gradient_size,
288 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
290 case DlColorSourceType::kSweepGradient:
291 paint.setColorSource(DlColorSource::MakeSweep(
292 {test_size / 2, test_size / 2}, 0, 45,
293 stops.size(), colors.data(), stops.data(), tile_modes[quadrant]));
299 builder.DrawRect(DlRect::MakeXYWH(0, 0, test_size, test_size), paint);
303 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
308 CanRenderGradientWithIncompleteStops(
this,
309 DlColorSourceType::kLinearGradient);
312 CanRenderGradientWithIncompleteStops(
this,
313 DlColorSourceType::kRadialGradient);
316 CanRenderGradientWithIncompleteStops(
this,
317 DlColorSourceType::kConicalGradient);
320 CanRenderGradientWithIncompleteStops(
this, DlColorSourceType::kSweepGradient);
324 void CanRenderLinearGradientManyColors(
AiksTest* aiks_test,
325 DlTileMode tile_mode) {
326 DisplayListBuilder builder;
327 builder.Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
329 builder.Translate(100, 100);
331 std::vector<DlColor> colors = {
332 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
333 DlColor(Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.ToARGB()),
334 DlColor(Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
335 DlColor(Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.ToARGB()),
336 DlColor(Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.ToARGB()),
337 DlColor(Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
338 DlColor(Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.ToARGB())};
339 std::vector<Scalar> stops = {
349 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
350 stops.size(), colors.data(),
351 stops.data(), tile_mode));
353 paint.setColor(DlColor::kWhite());
354 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
356 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
361 CanRenderLinearGradientManyColors(
this, DlTileMode::kClamp);
364 CanRenderLinearGradientManyColors(
this, DlTileMode::kRepeat);
367 CanRenderLinearGradientManyColors(
this, DlTileMode::kMirror);
370 CanRenderLinearGradientManyColors(
this, DlTileMode::kDecal);
374 void CanRenderLinearGradientWayManyColors(
AiksTest* aiks_test,
375 DlTileMode tile_mode) {
376 DisplayListBuilder builder;
378 builder.Translate(100.0, 100.0);
379 auto color = DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB());
380 std::vector<DlColor> colors;
381 std::vector<Scalar> stops;
382 auto current_stop = 0.0;
383 for (
int i = 0; i < 2000; i++) {
384 colors.push_back(color);
385 stops.push_back(current_stop);
386 current_stop += 1 / 2000.0;
388 stops[2000 - 1] = 1.0;
390 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
391 stops.size(), colors.data(),
392 stops.data(), tile_mode));
394 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
395 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
401 CanRenderLinearGradientWayManyColors(
this, DlTileMode::kClamp);
405 auto callback = [&]() -> sk_sp<DisplayList> {
406 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
407 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
408 DlTileMode::kMirror, DlTileMode::kDecal};
410 static int selected_tile_mode = 0;
412 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
413 ImGuiWindowFlags_AlwaysAutoResize)) {
414 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
415 sizeof(tile_mode_names) /
sizeof(
char*));
416 std::string label =
"##1";
417 for (
int i = 0; i < 4; i++) {
418 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
419 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
425 DisplayListBuilder builder;
427 builder.Translate(100.0, 100.0);
428 auto tile_mode = tile_modes[selected_tile_mode];
430 std::vector<DlColor> colors = {
431 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
432 DlColor(
Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.
ToARGB()),
433 DlColor(
Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
434 DlColor(
Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.
ToARGB()),
435 DlColor(
Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.
ToARGB()),
436 DlColor(
Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
437 DlColor(
Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.
ToARGB())};
438 std::vector<Scalar> stops = {
439 0.0, 2.0 / 62.0, 4.0 / 62.0, 8.0 / 62.0, 16.0 / 62.0, 32.0 / 62.0, 1.0,
442 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {200, 200},
443 stops.size(), colors.data(),
444 stops.data(), tile_mode));
446 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
447 return builder.Build();
449 ASSERT_TRUE(OpenPlaygroundHere(callback));
453 DisplayListBuilder builder;
455 std::vector<DlColor> colors = {
456 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed(), DlColor::kWhite(),
457 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed(), DlColor::kWhite(),
458 DlColor::kRed(), DlColor::kWhite(), DlColor::kRed()};
459 std::vector<Scalar> stops = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5,
460 0.6, 0.7, 0.8, 0.9, 1.0};
463 paint.setColor(DlColor::kWhite());
464 paint.setColorSource(DlColorSource::MakeLinear(
465 {200, 200}, {400, 400}, stops.size(), colors.data(), stops.data(),
466 DlTileMode::kClamp));
467 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
469 builder.DrawCircle(
DlPoint(300, 300), 200, paint);
470 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
472 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
476 auto callback = [&]() -> sk_sp<DisplayList> {
477 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
478 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
479 DlTileMode::kMirror, DlTileMode::kDecal};
481 static int selected_tile_mode = 0;
483 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
484 ImGuiWindowFlags_AlwaysAutoResize)) {
485 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
486 sizeof(tile_mode_names) /
sizeof(
char*));
487 std::string label =
"##1";
488 for (
int i = 0; i < 4; i++) {
489 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
490 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
496 DisplayListBuilder builder;
498 builder.Translate(100.0, 100.0);
499 auto tile_mode = tile_modes[selected_tile_mode];
501 std::vector<DlColor> colors = {
502 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
503 DlColor(
Color{0.1294, 0.5882, 0.9529, 1.0}.
ToARGB())};
504 std::vector<Scalar> stops = {0.0, 1.0};
506 paint.setColorSource(DlColorSource::MakeRadial(
507 {100, 100}, 100, 2, colors.data(), stops.data(), tile_mode));
509 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
510 return builder.Build();
512 ASSERT_TRUE(OpenPlaygroundHere(callback));
516 auto callback = [&]() -> sk_sp<DisplayList> {
517 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
518 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
519 DlTileMode::kMirror, DlTileMode::kDecal};
521 static int selected_tile_mode = 0;
528 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
529 ImGuiWindowFlags_AlwaysAutoResize)) {
530 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
531 sizeof(tile_mode_names) /
sizeof(
char*));
532 std::string label =
"##1";
533 for (
int i = 0; i < 4; i++) {
534 ImGui::InputScalarN(label.c_str(), ImGuiDataType_Float,
535 &(matrix.
vec[i]), 4, NULL, NULL,
"%.2f", 0);
541 DisplayListBuilder builder;
543 builder.Translate(100.0, 100.0);
544 auto tile_mode = tile_modes[selected_tile_mode];
546 std::vector<DlColor> colors = {
547 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
548 DlColor(
Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.
ToARGB()),
549 DlColor(
Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
550 DlColor(
Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.
ToARGB()),
551 DlColor(
Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.
ToARGB()),
552 DlColor(
Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.
ToARGB()),
553 DlColor(
Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.
ToARGB())};
554 std::vector<Scalar> stops = {
564 paint.setColorSource(DlColorSource::MakeRadial(
565 {100, 100}, 100, stops.size(), colors.data(), stops.data(), tile_mode));
567 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
568 return builder.Build();
570 ASSERT_TRUE(OpenPlaygroundHere(callback));
574 void CanRenderSweepGradient(
AiksTest* aiks_test, DlTileMode tile_mode) {
575 DisplayListBuilder builder;
576 builder.Scale(aiks_test->GetContentScale().x, aiks_test->GetContentScale().y);
578 builder.Translate(100, 100);
580 std::vector<DlColor> colors = {
581 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
582 DlColor(Color{0.1294, 0.5882, 0.9529, 1.0}.ToARGB())};
583 std::vector<Scalar> stops = {0.0, 1.0};
585 paint.setColorSource(DlColorSource::MakeSweep(
586 {100, 100}, 45, 135, 2, colors.data(),
587 stops.data(), tile_mode));
589 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
590 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
595 CanRenderSweepGradient(
this, DlTileMode::kClamp);
598 CanRenderSweepGradient(
this, DlTileMode::kRepeat);
601 CanRenderSweepGradient(
this, DlTileMode::kMirror);
604 CanRenderSweepGradient(
this, DlTileMode::kDecal);
608 void CanRenderSweepGradientManyColors(
AiksTest* aiks_test,
609 DlTileMode tile_mode) {
610 DisplayListBuilder builder;
612 builder.Translate(100.0, 100.0);
614 std::vector<DlColor> colors = {
615 DlColor(
Color{0x1f / 255.0, 0.0, 0x5c / 255.0, 1.0}.
ToARGB()),
616 DlColor(Color{0x5b / 255.0, 0.0, 0x60 / 255.0, 1.0}.ToARGB()),
617 DlColor(Color{0x87 / 255.0, 0x01 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
618 DlColor(Color{0xac / 255.0, 0x25 / 255.0, 0x53 / 255.0, 1.0}.ToARGB()),
619 DlColor(Color{0xe1 / 255.0, 0x6b / 255.0, 0x5c / 255.0, 1.0}.ToARGB()),
620 DlColor(Color{0xf3 / 255.0, 0x90 / 255.0, 0x60 / 255.0, 1.0}.ToARGB()),
621 DlColor(Color{0xff / 255.0, 0xb5 / 255.0, 0x6b / 250.0, 1.0}.ToARGB())};
622 std::vector<Scalar> stops = {
632 paint.setColorSource(DlColorSource::MakeSweep({100, 100}, 45, 135,
633 stops.size(), colors.data(),
634 stops.data(), tile_mode));
636 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600, 600), paint);
637 ASSERT_TRUE(aiks_test->OpenPlaygroundHere(builder.Build()));
642 CanRenderSweepGradientManyColors(
this, DlTileMode::kClamp);
645 CanRenderSweepGradientManyColors(
this, DlTileMode::kRepeat);
648 CanRenderSweepGradientManyColors(
this, DlTileMode::kMirror);
651 CanRenderSweepGradientManyColors(
this, DlTileMode::kDecal);
656 DisplayListBuilder builder;
658 paint.setColor(DlColor::kWhite());
659 builder.DrawRect(DlRect::MakeXYWH(0, 0, size * 3, size * 3), paint);
660 std::vector<DlColor> colors = {
661 DlColor(Color::MakeRGBA8(0xF4, 0x43, 0x36, 0xFF).ToARGB()),
662 DlColor(Color::MakeRGBA8(0xFF, 0xEB, 0x3B, 0xFF).ToARGB()),
663 DlColor(Color::MakeRGBA8(0x4c, 0xAF, 0x50, 0xFF).ToARGB()),
664 DlColor(Color::MakeRGBA8(0x21, 0x96, 0xF3, 0xFF).ToARGB())};
665 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
666 std::array<std::tuple<DlPoint, float, DlPoint, float>, 8> array{
667 std::make_tuple(
DlPoint(size / 2.f, size / 2.f), 0.f,
668 DlPoint(size / 2.f, size / 2.f), size / 2.f),
669 std::make_tuple(
DlPoint(size / 2.f, size / 2.f), size / 4.f,
670 DlPoint(size / 2.f, size / 2.f), size / 2.f),
671 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), 0.f,
672 DlPoint(size / 2.f, size / 2.f), size / 2.f),
673 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 2.f,
674 DlPoint(size / 2.f, size / 2.f), 0),
675 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 4.f,
676 DlPoint(size / 2.f, size / 2.f), size / 2.f),
677 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 16.f,
678 DlPoint(size / 2.f, size / 2.f), size / 8.f),
679 std::make_tuple(
DlPoint(size / 4.f, size / 4.f), size / 8.f,
680 DlPoint(size / 2.f, size / 2.f), size / 16.f),
681 std::make_tuple(
DlPoint(size / 8.f, size / 8.f), size / 8.f,
682 DlPoint(size / 2.f, size / 2.f), size / 8.f),
684 for (
int i = 0; i < 8; i++) {
686 builder.Translate((i % 3) * size, i / 3 * size);
687 paint.setColorSource(DlColorSource::MakeConical(
688 std::get<2>(array[i]),
689 std::get<3>(array[i]),
690 std::get<0>(array[i]),
691 std::get<1>(array[i]),
695 DlTileMode::kClamp));
696 builder.DrawRect(DlRect::MakeXYWH(0, 0, size, size), paint);
699 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
703 std::vector<DlColor> colors = {
704 DlColor(Color::MakeRGBA8(0xF4, 0x43, 0x36, 0xFF).ToARGB()),
705 DlColor(Color::MakeRGBA8(0xFF, 0xEB, 0x3B, 0xFF).ToARGB()),
706 DlColor(Color::MakeRGBA8(0x4c, 0xAF, 0x50, 0xFF).ToARGB()),
707 DlColor(Color::MakeRGBA8(0x21, 0x96, 0xF3, 0xFF).ToARGB())};
708 std::vector<Scalar> stops = {0.0, 1.f / 3.f, 2.f / 3.f, 1.0};
710 std::array<std::shared_ptr<DlColorSource>, 3> color_sources = {
711 DlColorSource::MakeLinear({0, 0}, {100, 100}, stops.size(), colors.data(),
712 stops.data(), DlTileMode::kDecal),
713 DlColorSource::MakeRadial({100, 100}, 100, stops.size(), colors.data(),
714 stops.data(), DlTileMode::kDecal),
715 DlColorSource::MakeSweep({100, 100}, 45, 135, stops.size(), colors.data(),
716 stops.data(), DlTileMode::kDecal),
719 DisplayListBuilder builder;
721 paint.setColor(DlColor::kWhite());
722 builder.DrawRect(DlRect::MakeLTRB(0, 0, 605, 205), paint);
723 for (
int i = 0; i < 3; i++) {
725 builder.Translate(i * 200.0f, 0);
726 paint.setColorSource(color_sources[i]);
727 builder.DrawRect(DlRect::MakeLTRB(0, 0, 200, 200), paint);
730 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
735 auto callback = [&]() -> sk_sp<DisplayList> {
736 static float scale = 3;
737 static bool add_circle_clip =
true;
738 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
739 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
740 DlTileMode::kMirror, DlTileMode::kDecal};
741 static int selected_tile_mode = 0;
742 static float alpha = 1;
744 if (AiksTest::ImGuiBegin(
"Controls",
nullptr,
745 ImGuiWindowFlags_AlwaysAutoResize)) {
746 ImGui::SliderFloat(
"Scale", &
scale, 0, 6);
747 ImGui::Checkbox(
"Circle clip", &add_circle_clip);
748 ImGui::SliderFloat(
"Alpha", &alpha, 0, 1);
749 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
750 sizeof(tile_mode_names) /
sizeof(
char*));
754 DisplayListBuilder builder;
755 builder.Scale(GetContentScale().
x, GetContentScale().y);
757 paint.setColor(DlColor::kWhite());
758 builder.DrawPaint(paint);
760 paint.setDrawStyle(DlDrawStyle::kStroke);
761 paint.setColor(DlColor::kWhite().withAlpha(alpha * 255));
762 paint.setStrokeWidth(10);
763 auto tile_mode = tile_modes[selected_tile_mode];
765 std::vector<DlColor> colors = {
766 DlColor(
Color{0.9568, 0.2627, 0.2118, 1.0}.
ToARGB()),
767 DlColor(
Color{0.1294, 0.5882, 0.9529, 1.0}.
ToARGB())};
768 std::vector<Scalar> stops = {0.0, 1.0};
770 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {50, 50},
771 stops.size(), colors.data(),
772 stops.data(), tile_mode));
774 DlPathBuilder path_builder;
775 path_builder.MoveTo(
DlPoint(20, 20));
777 path_builder.Close();
778 path_builder.MoveTo(
DlPoint(60, 20));
780 DlPath path(path_builder);
784 if (add_circle_clip) {
789 auto [handle_a, handle_b] =
792 Matrix ip_matrix = builder.GetMatrix();
796 ip_matrix = ip_matrix.
Invert();
797 Point point_a = ip_matrix * handle_a * GetContentScale();
798 Point point_b = ip_matrix * handle_b * GetContentScale();
800 Point middle = (point_a + point_b) / 2;
802 builder.ClipPath(DlPath::MakeCircle(middle, radius));
806 {DlStrokeJoin::kBevel, DlStrokeJoin::kRound, DlStrokeJoin::kMiter}) {
807 paint.setStrokeJoin(join);
809 {DlStrokeCap::kButt, DlStrokeCap::kSquare, DlStrokeCap::kRound}) {
810 paint.setStrokeCap(cap);
811 builder.DrawPath(path, paint);
812 builder.Translate(80, 0);
814 builder.Translate(-240, 60);
817 return builder.Build();
820 ASSERT_TRUE(OpenPlaygroundHere(callback));
825 DisplayListBuilder builder;
827 builder.Translate(100.0f, 0);
829 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
831 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
833 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {300, 0}, stops.size(),
834 colors.data(), stops.data(),
835 DlTileMode::kClamp));
837 paint.setColor(DlColor::kWhite());
838 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
839 builder.Translate(400, 0);
840 builder.DrawRoundRect(
841 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
843 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
848 DisplayListBuilder builder;
850 builder.Translate(100.0f, 0);
852 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
854 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
856 paint.setColorSource(DlColorSource::MakeLinear({0, 0}, {0, 300}, stops.size(),
857 colors.data(), stops.data(),
858 DlTileMode::kClamp));
860 paint.setColor(DlColor::kWhite());
861 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
862 builder.Translate(400, 0);
863 builder.DrawRoundRect(
864 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
866 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
871 DisplayListBuilder builder;
873 builder.Translate(100.0f, 0);
875 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
877 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
879 paint.setColorSource(DlColorSource::MakeLinear({300, 0}, {0, 0}, stops.size(),
880 colors.data(), stops.data(),
881 DlTileMode::kClamp));
883 paint.setColor(DlColor::kWhite());
884 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
885 builder.Translate(400, 0);
886 builder.DrawRoundRect(
887 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
889 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
894 DisplayListBuilder builder;
896 builder.Translate(100.0f, 0);
898 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
900 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
902 paint.setColorSource(DlColorSource::MakeLinear({0, 300}, {0, 0}, stops.size(),
903 colors.data(), stops.data(),
904 DlTileMode::kClamp));
906 paint.setColor(DlColor::kWhite());
907 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
908 builder.Translate(400, 0);
909 builder.DrawRoundRect(
910 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
912 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
916 DisplayListBuilder builder;
918 builder.Translate(100.0f, 0);
920 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue(),
922 std::vector<Scalar> stops = {0.0, 0.1, 1.0};
926 paint.setColorSource(
927 DlColorSource::MakeLinear({0, 150}, {0, 100}, stops.size(), colors.data(),
928 stops.data(), DlTileMode::kRepeat));
930 paint.setColor(DlColor::kWhite());
931 builder.DrawRect(DlRect::MakeXYWH(0, 0, 300, 300), paint);
932 builder.Translate(400, 0);
933 builder.DrawRoundRect(
934 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 300, 300), 4, 4), paint);
936 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
constexpr 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