5 #include "flutter/display_list/display_list.h"
6 #include "flutter/display_list/dl_blend_mode.h"
7 #include "flutter/display_list/dl_builder.h"
8 #include "flutter/display_list/dl_color.h"
9 #include "flutter/display_list/dl_paint.h"
10 #include "flutter/display_list/dl_sampling_options.h"
11 #include "flutter/display_list/dl_tile_mode.h"
12 #include "flutter/display_list/effects/dl_color_filter.h"
13 #include "flutter/display_list/effects/dl_color_source.h"
14 #include "flutter/display_list/effects/dl_image_filter.h"
15 #include "flutter/display_list/effects/dl_mask_filter.h"
16 #include "flutter/display_list/effects/image_filters/dl_blur_image_filter.h"
17 #include "flutter/display_list/geometry/dl_path_builder.h"
20 #include "gmock/gmock.h"
24 #include "impeller/renderer/testing/mocks.h"
25 #include "third_party/imgui/imgui.h"
40 DisplayListBuilder builder;
41 builder.Scale(GetContentScale().
x, GetContentScale().y);
43 std::vector<float> sigmas = {0.0, 0.01, 1.0};
44 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
46 for (uint32_t i = 0; i < sigmas.size(); ++i) {
48 paint.setColor(colors[i]);
50 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
53 builder.Translate(100 + (i * 100), 100);
55 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 60.0f, 160.0f), 50, 100);
56 builder.DrawRoundRect(rrect, paint);
60 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
66 DisplayListBuilder builder;
67 builder.Scale(content_Scale.
x, content_Scale.
y);
69 DlPaint background_paint;
70 background_paint.setColor(DlColor(1, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
71 builder.DrawPaint(background_paint);
73 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue()};
74 std::vector<Scalar> stops = {0.0, 1.0};
77 paint.setMaskFilter(DlBlurMaskFilter::Make(style, sigma));
78 auto gradient = DlColorSource::MakeLinear(
79 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kClamp);
80 paint.setColorSource(gradient);
81 paint.setColor(DlColor::kWhite());
82 paint.setDrawStyle(DlDrawStyle::kStroke);
83 paint.setStrokeWidth(20);
86 builder.Translate(100, 100);
90 line_paint.setColor(DlColor::kWhite());
96 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 200.0f, 60.0f), 50, 100);
97 builder.DrawRoundRect(rrect, paint);
100 return builder.Build();
106 GetContentScale(), 10, DlBlurStyle::kNormal)));
111 GetContentScale(), 0, DlBlurStyle::kNormal)));
116 GetContentScale(), 10, DlBlurStyle::kOuter)));
121 GetContentScale(), 10, DlBlurStyle::kInner)));
126 GetContentScale(), 10, DlBlurStyle::kSolid)));
130 DisplayListBuilder builder;
131 builder.Scale(GetContentScale().
x, GetContentScale().y);
133 std::vector<float> sigmas = {0.0, 0.01, 1.0};
134 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
136 for (uint32_t i = 0; i < sigmas.size(); ++i) {
138 paint.setColor(colors[i]);
140 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
143 builder.Translate(100 + (i * 100), 100);
145 DlRect::MakeXYWH(0, 0, 100.0f, 100.0f), 100, 100);
146 builder.DrawRoundRect(rrect, paint);
150 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
154 DisplayListBuilder builder;
157 paint.setColor(DlColor::kGreen());
158 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 99999));
159 builder.DrawCircle(
DlPoint(400, 400), 300, paint);
162 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
168 DisplayListBuilder builder;
169 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
172 paint.setColor(DlColor::kWhite());
176 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
177 paint.setColorFilter(
178 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kSrc));
179 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
181 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
187 DisplayListBuilder builder;
188 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
192 DlColor::RGBA(128.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f));
196 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
197 paint.setColorFilter(
198 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kColor));
199 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
202 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
206 auto callback = [&]() -> sk_sp<DisplayList> {
211 DisplayListBuilder builder;
213 paint.setColor(DlColor::kCornflowerBlue());
214 builder.DrawCircle(
DlPoint(100, 100), 50, paint);
216 paint.setColor(DlColor::kGreenYellow());
217 builder.DrawCircle(
DlPoint(300, 200), 100, paint);
219 paint.setColor(DlColor::kDarkMagenta());
220 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
222 paint.setColor(DlColor::kOrangeRed());
223 builder.DrawCircle(
DlPoint(180, 120), 100, paint);
226 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(a.x, a.y,
b.x,
b.y), 20, 20);
227 builder.ClipRoundRect(rrect);
230 save_paint.setBlendMode(DlBlendMode::kSrc);
232 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
233 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
236 return builder.Build();
239 ASSERT_TRUE(OpenPlaygroundHere(callback));
243 DisplayListBuilder builder;
246 paint.setColor(DlColor::kCornflowerBlue());
247 builder.DrawCircle(
DlPoint(100, 100), 50, paint);
249 paint.setColor(DlColor::kGreenYellow());
250 builder.DrawCircle(
DlPoint(300, 200), 100, paint);
252 paint.setColor(DlColor::kDarkMagenta());
253 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
255 paint.setColor(DlColor::kOrangeRed());
256 builder.DrawCircle(
DlPoint(180, 120), 100, paint);
259 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(75, 50, 375, 275), 20, 20);
260 builder.ClipRoundRect(rrect);
263 save_paint.setBlendMode(DlBlendMode::kSrc);
264 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
265 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
268 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
274 DisplayListBuilder builder;
277 builder.DrawImage(image,
DlPoint(50.0, 50.0),
278 DlImageSampling::kNearestNeighbor, &paint);
281 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(50, 250, 100, 100), 20, 20);
283 builder.ClipRoundRect(rrect);
286 save_paint.setBlendMode(DlBlendMode::kSrc);
287 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
288 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
293 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
299 DisplayListBuilder builder;
302 builder.DrawImage(image,
DlPoint(50.0, 50.0),
303 DlImageSampling::kNearestNeighbor, &paint);
305 for (
int i = 0; i < 6; i++) {
307 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
309 builder.ClipRoundRect(rrect);
312 save_paint.setBlendMode(DlBlendMode::kSrc);
313 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
314 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
320 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
324 CanRenderMultipleBackdropBlurWithSingleBackdropIdAndDistinctFilters) {
327 DisplayListBuilder builder;
330 builder.DrawImage(image,
DlPoint(50.0, 50.0),
331 DlImageSampling::kNearestNeighbor, &paint);
333 for (
int i = 0; i < 6; i++) {
335 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
337 builder.ClipRoundRect(rrect);
340 save_paint.setBlendMode(DlBlendMode::kSrc);
341 auto backdrop_filter =
342 DlImageFilter::MakeBlur(30 + i, 30, DlTileMode::kClamp);
343 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
349 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
353 DisplayListBuilder builder;
356 paint.setColor(DlColor::kGreen());
357 builder.DrawCircle(
DlPoint(400, 400), 300, paint);
360 save_paint.setBlendMode(DlBlendMode::kSrc);
362 auto backdrop_filter =
363 DlImageFilter::MakeBlur(999999, 999999, DlTileMode::kClamp);
364 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
367 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
373 DisplayListBuilder builder;
376 builder.DrawImage(image,
DlPoint(0.0, 0.0), DlImageSampling::kNearestNeighbor,
380 save_paint.setBlendMode(DlBlendMode::kSrcOver);
386 builder.Scale(1.1, 1.2);
388 DlRect rect1 = DlRect::MakeLTRB(70, 70, 313, 170);
389 builder.ClipRect(rect1);
390 auto backdrop_filter1 =
391 DlBlurImageFilter::Make(20, 20, DlTileMode::kDecal, rect1);
392 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter1.get());
399 builder.Scale(1.1, 1.2);
401 DlRect rect2 = DlRect::MakeLTRB(55, 190, 298, 290);
402 builder.ClipRect(rect2);
403 auto backdrop_filter2 =
404 DlBlurImageFilter::Make(20, 20, DlTileMode::kDecal, rect2);
405 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter2.get());
409 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
413 DisplayListBuilder builder;
414 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
417 paint.setColor(DlColor::kGreen());
418 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
419 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
422 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
426 DisplayListBuilder builder;
429 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
430 builder.DrawPaint(background);
433 paint.setColor(DlColor::kGreen());
440 std::shared_ptr<DlImageFilter> color_filter =
441 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix));
442 std::shared_ptr<DlImageFilter> blur =
443 DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal);
444 paint.setImageFilter(DlImageFilter::MakeCompose(blur, color_filter));
445 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
447 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
451 DisplayListBuilder builder;
454 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
455 builder.DrawPaint(background);
458 paint.setColor(DlColor::kGreen());
465 std::shared_ptr<DlImageFilter> color_filter =
466 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix));
467 std::shared_ptr<DlImageFilter> blur =
468 DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal);
469 paint.setImageFilter(DlImageFilter::MakeCompose(color_filter, blur));
470 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
472 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
476 auto callback = [&]() -> sk_sp<DisplayList> {
481 DisplayListBuilder builder;
488 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
489 paint.setColor(DlColor::kRed());
491 DlPath path = DlPath::MakeRect(DlRect::MakeLTRB(0, 0, 800, 800));
492 path = path + DlPath::MakeCircle(
DlPoint(0, 0), 0.5);
493 builder.DrawPath(path, paint);
494 return builder.Build();
496 ASSERT_TRUE(OpenPlaygroundHere(callback));
500 DisplayListBuilder builder;
501 builder.Translate(0, -400);
506 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
507 paint.setColor(DlColor::kRed());
509 DlPath path = DlPath::MakeRect(DlRect::MakeLTRB(0, 0, 800, 800));
510 path = path + DlPath::MakeCircle(
DlPoint(0, 0), 0.5);
511 builder.DrawPath(path, paint);
513 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
517 DisplayListBuilder builder;
519 paint.setColor(DlColor::kBlue());
520 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600.0, 600.0), paint);
523 clear.setBlendMode(DlBlendMode::kClear);
524 clear.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
526 builder.DrawCircle(
DlPoint(300.0, 300.0), 200.0, clear);
528 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
533 auto callback = [&]() -> sk_sp<DisplayList> {
535 ImGuiWindowFlags_AlwaysAutoResize)) {
536 ImGui::SliderFloat(
"Sigma", &sigma, 0, 50);
539 DisplayListBuilder builder;
540 builder.Scale(GetContentScale().
x, GetContentScale().y);
541 builder.DrawPaint({});
544 paint.setColor(DlColor::kGreen());
545 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
547 builder.DrawRect(DlRect::MakeXYWH(300, 300, 200, 200), paint);
548 return builder.Build();
551 ASSERT_TRUE(OpenPlaygroundHere(callback));
555 DisplayListBuilder builder;
558 paint.setColor(DlColor::kBlue());
559 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 0));
561 builder.DrawCircle(
DlPoint(300, 300), 200, paint);
562 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
564 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
569 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
572 DisplayListBuilder builder;
573 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
576 paint.setColor(DlColor::kBlue());
577 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 10));
580 builder.DrawRect(DlRect::MakeLTRB(100, 250, 500, 250), paint);
582 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
584 builder.DrawRect(DlRect::MakeLTRB(550, 300, 550, 600), paint);
586 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
590 DlBlurStyle style = DlBlurStyle::kNormal;
594 bool invert_colors =
false;
595 DlBlendMode blend_mode = DlBlendMode::kSrcOver;
601 DisplayListBuilder builder;
604 builder.Scale(0.8f, 0.8f);
605 builder.Translate(50.f, 50.f);
611 builder.DrawPaint(draw_paint);
614 paint.setMaskFilter(DlBlurMaskFilter::Make(config.
style, config.
sigma));
620 const Scalar radius = 20.0f;
621 const Scalar y_spacing = 100.0f;
625 paint.setColor(DlColor::kCrimson().withAlpha(alpha));
626 builder.DrawRect(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
627 radius, 60.0f - radius),
631 paint.setColor(DlColor::kBlue().withAlpha(alpha));
632 builder.DrawCircle(
DlPoint{
x + 25, y + 25}, radius, paint);
635 paint.setColor(DlColor::kGreen().withAlpha(alpha));
636 builder.DrawOval(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
637 radius, 60.0f - radius),
641 paint.setColor(DlColor::kPurple().withAlpha(alpha));
643 DlRect::MakeXYWH(
x, y, 60.0f, 60.0f), radius, radius);
644 builder.DrawRoundRect(rrect, paint);
647 paint.setColor(DlColor::kOrange().withAlpha(alpha));
649 rrect = DlRoundRect::MakeRectXY(DlRect::MakeXYWH(
x, y, 60.0f, 60.0f),
651 builder.DrawRoundRect(rrect, paint);
654 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
657 DlPathBuilder path_builder;
658 path_builder.MoveTo(
DlPoint(
x + 0, y + 60));
659 path_builder.LineTo(
DlPoint(
x + 30, y + 0));
660 path_builder.LineTo(
DlPoint(
x + 60, y + 60));
661 path_builder.Close();
663 builder.DrawPath(path_builder.TakePath(), paint);
667 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
673 builder.DrawPath(path, paint);
676 return builder.Build();
681 {
"NormalTranslucentZeroSigma",
682 {.style = DlBlurStyle::kNormal, .sigma = 0.0f, .alpha = 0.5f}},
684 {
"NormalTranslucent",
685 {.style = DlBlurStyle::kNormal, .sigma = 8.0f, .alpha = 0.5f}},
688 {.style = DlBlurStyle::kSolid, .sigma = 8.0f, .alpha = 0.5f}},
690 {
"SolidOpaque", {.style = DlBlurStyle::kSolid, .sigma = 8.0f}},
692 {
"SolidTranslucentWithFilters",
693 {.style = DlBlurStyle::kSolid,
696 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp),
697 .invert_colors =
true}},
699 {
"SolidTranslucentExclusionBlend",
700 {.style = DlBlurStyle::kSolid,
703 .blend_mode = DlBlendMode::kExclusion}},
706 {.style = DlBlurStyle::kInner, .sigma = 8.0f, .alpha = 0.5f}},
708 {
"InnerTranslucentWithBlurImageFilter",
709 {.style = DlBlurStyle::kInner,
712 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}},
715 {.style = DlBlurStyle::kOuter, .sigma = 8.0f, .alpha = 0.5f}},
717 {
"OuterOpaqueWithBlurImageFilter",
718 {.style = DlBlurStyle::kOuter,
720 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}}};
722 #define MASK_BLUR_VARIANT_TEST(config) \
723 TEST_P(AiksTest, MaskBlurVariantTest##config) { \
724 ASSERT_TRUE(OpenPlaygroundHere( \
725 MaskBlurVariantTest(*this, kPaintVariations.at(#config)))); \
739 #undef MASK_BLUR_VARIANT_TEST
742 DisplayListBuilder builder;
743 builder.Scale(GetContentScale().
x, GetContentScale().y);
746 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1));
747 builder.DrawPaint(paint);
749 paint.setColor(DlColor::kGreen());
750 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
752 DlPathBuilder path_builder;
753 path_builder.MoveTo(
DlPoint(200, 200));
754 path_builder.LineTo(
DlPoint(300, 400));
755 path_builder.LineTo(
DlPoint(100, 400));
756 path_builder.Close();
758 builder.DrawPath(path_builder.TakePath(), paint);
762 red.setColor(DlColor::kRed());
763 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
765 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
769 DisplayListBuilder builder;
770 builder.Scale(GetContentScale().
x, GetContentScale().y);
773 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
774 builder.DrawPaint(paint);
776 paint.setColor(DlColor::kGreen());
777 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
779 DlPathBuilder path_builder;
780 path_builder.MoveTo(
DlPoint(200, 200));
781 path_builder.LineTo(
DlPoint(300, 400));
782 path_builder.LineTo(
DlPoint(100, 400));
783 path_builder.Close();
785 builder.DrawPath(path_builder.TakePath(), paint);
789 red.setColor(DlColor::kRed());
790 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
792 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
796 DisplayListBuilder builder;
797 builder.Scale(GetContentScale().
x, GetContentScale().y);
800 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
801 builder.DrawPaint(paint);
803 paint.setColor(DlColor::kGreen());
804 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
806 DlPathBuilder path_builder;
807 path_builder.MoveTo(
DlPoint(200, 200));
808 path_builder.LineTo(
DlPoint(300, 400));
809 path_builder.LineTo(
DlPoint(100, 400));
810 path_builder.Close();
812 builder.DrawPath(path_builder.TakePath(), paint);
816 red.setColor(DlColor::kRed());
817 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
819 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
824 auto callback = [&]() -> sk_sp<DisplayList> {
826 ImGuiWindowFlags_AlwaysAutoResize)) {
827 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
831 DisplayListBuilder builder;
832 builder.Scale(GetContentScale().
x, GetContentScale().y);
835 paint.setColor(DlColor::kGreen());
836 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
840 DlPoint(200, 200), DlImageSampling::kNearestNeighbor, &paint);
843 red.setColor(DlColor::kRed());
844 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
846 return builder.Build();
848 ASSERT_TRUE(OpenPlaygroundHere(callback));
853 auto callback = [&]() -> sk_sp<DisplayList> {
855 ImGuiWindowFlags_AlwaysAutoResize)) {
856 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
860 DisplayListBuilder builder;
861 builder.Scale(GetContentScale().
x, GetContentScale().y);
864 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
865 builder.DrawPaint(paint);
867 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
872 paint.setColorSource(DlColorSource::MakeImage(
874 DlImageSampling::kMipmapLinear));
875 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
877 builder.DrawRect(DlRect::MakeXYWH(0, 0, boston->GetSize().width,
878 boston->GetSize().height),
881 return builder.Build();
883 ASSERT_TRUE(OpenPlaygroundHere(callback));
887 DisplayListBuilder builder;
890 builder.Scale(GetContentScale().
x, GetContentScale().y);
892 paint.setColor(DlColor::kLimeGreen());
894 DlRect::MakeLTRB(0, 0, GetWindowSize().width, 100), 10, 10);
895 builder.DrawRoundRect(rrect, paint);
897 paint.setColor(DlColor::kMagenta());
898 rrect = DlRoundRect::MakeRectXY(
899 DlRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
900 builder.DrawRoundRect(rrect, paint);
901 builder.ClipRect(DlRect::MakeLTRB(100, 0, 200, GetWindowSize().height));
904 save_paint.setBlendMode(DlBlendMode::kSrc);
906 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
908 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
911 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
915 DisplayListBuilder builder;
917 builder.Scale(GetContentScale().
x, GetContentScale().y);
918 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
919 builder.DrawImageRect(
921 DlRect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height),
922 DlRect::MakeLTRB(0, 0, GetWindowSize().width, 100),
923 DlImageSampling::kNearestNeighbor);
926 paint.setColor(DlColor::kMagenta());
929 DlRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
930 builder.DrawRoundRect(rrect, paint);
931 builder.ClipRect(DlRect::MakeLTRB(0, 50, GetWindowSize().width, 150));
934 save_paint.setBlendMode(DlBlendMode::kSrc);
936 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
937 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
940 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
949 CreateTextureForFixture(
"boston.jpg",
true);
955 auto callback = [&]() -> sk_sp<DisplayList> {
957 ImGuiWindowFlags_AlwaysAutoResize)) {
958 ImGui::SliderFloat(
"Sigma", &sigma, 0, 200);
959 ImGui::SliderFloat(
"Frequency", &freq, 0.01, 2.0);
960 ImGui::SliderFloat(
"Amplitude", &, 1, 100);
964 DisplayListBuilder builder;
965 builder.Scale(GetContentScale().
x, GetContentScale().y);
966 Scalar y = amp * sin(freq * 2.0 * M_PI * count / 60);
968 DlPoint(1024 / 2 - boston->GetSize().width / 2,
969 (768 / 2 - boston->GetSize().height / 2) + y),
970 DlImageSampling::kMipmapLinear);
976 DlRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
977 builder.ClipRect(DlRect::MakeLTRB(100, 100, 900, 700));
980 paint.setBlendMode(DlBlendMode::kSrc);
982 auto backdrop_filter =
983 DlImageFilter::MakeBlur(sigma, sigma, DlTileMode::kClamp);
984 builder.SaveLayer(std::nullopt, &paint, backdrop_filter.get());
986 return builder.Build();
988 ASSERT_TRUE(OpenPlaygroundHere(callback));
992 DisplayListBuilder builder;
994 builder.Scale(GetContentScale().
x, GetContentScale().y);
997 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
998 builder.DrawPaint(paint);
1000 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
1001 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
1002 std::vector<Scalar> stops = {0.0, 1.0};
1005 paint.setColorSource(DlColorSource::MakeLinear(
1011 DlTileMode::kMirror));
1012 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
1014 DlPathBuilder path_builder;
1015 path_builder.MoveTo(
DlPoint(200, 200));
1016 path_builder.LineTo(
DlPoint(300, 400));
1017 path_builder.LineTo(
DlPoint(100, 400));
1018 path_builder.Close();
1019 builder.DrawPath(path_builder.TakePath(), paint);
1023 red.setColor(DlColor::kRed());
1024 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
1026 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1030 DisplayListBuilder builder;
1031 builder.Scale(GetContentScale().
x, GetContentScale().y);
1034 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
1035 builder.DrawPaint(paint);
1037 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
1038 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
1039 std::vector<Scalar> stops = {0.0, 1.0};
1042 paint.setColorSource(DlColorSource::MakeLinear(
1048 DlTileMode::kMirror));
1049 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
1051 DlPathBuilder path_builder;
1052 path_builder.MoveTo(
DlPoint(200, 200));
1053 path_builder.LineTo(
DlPoint(300, 400));
1054 path_builder.LineTo(
DlPoint(100, 400));
1055 path_builder.Close();
1056 builder.DrawPath(path_builder.TakePath(), paint);
1060 red.setColor(DlColor::kRed());
1061 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
1062 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1066 DisplayListBuilder builder;
1067 builder.Scale(GetContentScale().
x, GetContentScale().y);
1070 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
1071 builder.DrawPaint(paint);
1073 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
1074 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
1075 std::vector<Scalar> stops = {0.0, 1.0};
1078 paint.setColorSource(DlColorSource::MakeLinear(
1084 DlTileMode::kMirror));
1085 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
1087 DlPathBuilder path_builder;
1088 path_builder.MoveTo(
DlPoint(200, 200));
1089 path_builder.LineTo(
DlPoint(300, 400));
1090 path_builder.LineTo(
DlPoint(100, 400));
1091 path_builder.Close();
1092 builder.DrawPath(path_builder.TakePath(), paint);
1096 red.setColor(DlColor::kRed());
1097 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
1098 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1102 DisplayListBuilder builder;
1103 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1105 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1109 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
1111 Vector2 clip_size = {150, 75};
1113 builder.Scale(GetContentScale().
x, GetContentScale().y);
1117 builder.ClipRect(DlRect::MakeLTRB(rect.GetLeft(), rect.GetTop(),
1118 rect.GetRight(), rect.GetBottom()));
1119 builder.Translate(center.
x, center.
y);
1120 builder.Scale(0.6, 0.6);
1124 Rect dest = bounds.
Shift(-image_center);
1128 sk_dst, DlImageSampling::kNearestNeighbor,
1131 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1135 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1137 auto callback = [&]() -> sk_sp<DisplayList> {
1138 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1139 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1140 DlTileMode::kMirror, DlTileMode::kDecal};
1142 static float rotation = 0;
1143 static float scale = 0.6;
1144 static int selected_tile_mode = 3;
1147 ImGuiWindowFlags_AlwaysAutoResize)) {
1148 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1149 ImGui::SliderFloat(
"Scale", &scale, 0, 2.0);
1150 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1151 sizeof(tile_mode_names) /
sizeof(
char*));
1155 DisplayListBuilder builder;
1157 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1160 paint.setImageFilter(
1161 DlImageFilter::MakeBlur(20, 20, tile_modes[selected_tile_mode]));
1168 builder.Scale(GetContentScale().
x, GetContentScale().y);
1170 DlRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
1171 builder.Translate(center.
x, center.
y);
1172 builder.Scale(scale, scale);
1173 builder.
Rotate(rotation);
1177 Rect dest = bounds.
Shift(-image_center);
1181 sk_dst, DlImageSampling::kNearestNeighbor,
1183 return builder.Build();
1186 ASSERT_TRUE(OpenPlaygroundHere(callback));
1190 DisplayListBuilder builder;
1192 builder.Scale(GetContentScale().
x, GetContentScale().y);
1193 builder.Scale(0.5, 0.5);
1195 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1199 paint.setBlendMode(DlBlendMode::kSrc);
1201 auto backdrop_filter = DlImageFilter::MakeBlur(50, 0, DlTileMode::kClamp);
1202 builder.SaveLayer(std::nullopt, &paint, backdrop_filter.get());
1204 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1212 DisplayListBuilder builder;
1214 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1216 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1219 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
1222 Vector2 clip_size = {150, 75};
1224 builder.Scale(GetContentScale().
x, GetContentScale().y);
1228 builder.ClipRect(DlRect::MakeLTRB(clip_bounds.GetLeft(), clip_bounds.GetTop(),
1229 clip_bounds.GetRight(),
1230 clip_bounds.GetBottom()));
1231 builder.Translate(center.
x, center.
y);
1232 builder.Scale(0.6, 0.6);
1235 auto dst_rect = bounds.
Shift(-image_center);
1236 builder.DrawImageRect(
1241 DlRect::MakeLTRB(dst_rect.GetLeft(), dst_rect.GetTop(),
1242 dst_rect.GetRight(), dst_rect.GetBottom()),
1243 DlImageSampling::kMipmapLinear, &paint);
1245 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1249 auto callback = [&]() -> sk_sp<DisplayList> {
1250 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1251 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1252 DlTileMode::kMirror, DlTileMode::kDecal};
1254 static float rotation = 45;
1255 static float scale = 0.6;
1256 static int selected_tile_mode = 3;
1259 ImGuiWindowFlags_AlwaysAutoResize)) {
1260 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1261 ImGui::SliderFloat(
"Scale", &scale, 0, 2.0);
1262 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1263 sizeof(tile_mode_names) /
sizeof(
char*));
1267 DisplayListBuilder builder;
1270 paint.setColor(DlColor::kGreen());
1271 paint.setImageFilter(
1272 DlImageFilter::MakeBlur(50, 0, tile_modes[selected_tile_mode]));
1275 builder.Scale(GetContentScale().
x, GetContentScale().y);
1276 builder.Translate(center.
x, center.
y);
1277 builder.Scale(scale, scale);
1278 builder.
Rotate(rotation);
1281 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(-100, -100, 200, 200), 10, 10);
1282 builder.DrawRoundRect(rrect, paint);
1283 return builder.Build();
1286 ASSERT_TRUE(OpenPlaygroundHere(callback));
1290 DisplayListBuilder builder;
1291 builder.Scale(GetContentScale().
x, GetContentScale().y);
1293 auto paint_lines = [&builder](
Scalar dx,
Scalar dy, DlPaint paint) {
1295 DlPath line = DlPath::MakeLine(a,
b);
1296 builder.DrawPath(line, paint);
1298 paint.setStrokeWidth(5);
1299 paint.setDrawStyle(DlDrawStyle::kStroke);
1300 draw_line(
DlPoint(dx + 100, dy + 100),
DlPoint(dx + 200, dy + 200));
1301 draw_line(
DlPoint(dx + 100, dy + 200),
DlPoint(dx + 200, dy + 100));
1302 draw_line(
DlPoint(dx + 150, dy + 100),
DlPoint(dx + 200, dy + 150));
1303 draw_line(
DlPoint(dx + 100, dy + 150),
DlPoint(dx + 150, dy + 200));
1307 DisplayListBuilder recorder_builder;
1308 for (
int x = 0;
x < 5; ++
x) {
1309 for (
int y = 0; y < 5; ++y) {
1310 DlRect rect = DlRect::MakeXYWH(
x * 20, y * 20, 20, 20);
1312 paint.setColor(((
x + y) & 1) == 0 ? DlColor::kYellow()
1313 : DlColor::kBlue());
1315 recorder_builder.DrawRect(rect, paint);
1321 auto image_source = DlColorSource::MakeImage(
1323 auto blur_filter = DlImageFilter::MakeBlur(5, 5, DlTileMode::kDecal);
1326 paint.setColor(DlColor::kDarkGreen());
1327 builder.DrawRect(DlRect::MakeLTRB(0, 0, 300, 600), paint);
1329 paint.setColorSource(image_source);
1330 builder.DrawRect(DlRect::MakeLTRB(100, 100, 200, 200), paint);
1332 paint.setColorSource(
nullptr);
1333 paint.setColor(DlColor::kRed());
1334 builder.DrawRect(DlRect::MakeLTRB(300, 0, 600, 600), paint);
1336 paint.setColorSource(image_source);
1337 paint.setImageFilter(blur_filter);
1338 builder.DrawRect(DlRect::MakeLTRB(400, 100, 500, 200), paint);
1340 paint.setImageFilter(
nullptr);
1341 paint_lines(0, 300, paint);
1343 paint.setImageFilter(blur_filter);
1344 paint_lines(300, 300, paint);
1346 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1355 for (int32_t i = 1; i < 5; ++i) {
1356 DisplayListBuilder builder;
1358 DlPathBuilder path_builder;
1359 path_builder.MoveTo(
DlPoint(100, 100));
1360 path_builder.LineTo(
DlPoint(100 + fi, 100 + fi));
1363 paint.setColor(DlColor::kChartreuse());
1364 auto blur_filter = DlImageFilter::MakeBlur(0.1, 0.1, DlTileMode::kClamp);
1365 paint.setImageFilter(blur_filter);
1367 builder.DrawPath(path_builder.TakePath(), paint);
1370 EXPECT_TRUE(image) <<
" length " << i;
1379 for (int32_t i = 1; i < 5; ++i) {
1380 DisplayListBuilder builder;
1385 DlRect::MakeXYWH(400, 400, clip_size.
width, clip_size.
height));
1388 paint.setColor(DlColor::kGreen());
1389 auto blur_filter = DlImageFilter::MakeBlur(0.1, 0.1, DlTileMode::kDecal);
1390 paint.setImageFilter(blur_filter);
1392 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
1396 EXPECT_TRUE(image) <<
" length " << i;
1401 CanRenderMultipleBackdropBlurWithSingleBackdropIdDifferentLayers) {
1404 DisplayListBuilder builder;
1407 builder.DrawImage(image,
DlPoint(50.0, 50.0),
1408 DlImageSampling::kNearestNeighbor, &paint);
1410 for (
int i = 0; i < 6; i++) {
1413 paint.setColor(DlColor::kWhite().withAlphaF(0.95));
1414 builder.SaveLayer(std::nullopt, &paint);
1417 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
1419 builder.ClipRoundRect(rrect);
1422 save_paint.setBlendMode(DlBlendMode::kSrc);
1423 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
1424 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
1433 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1437 DisplayListBuilder builder;
1438 builder.Scale(GetContentScale().
x, GetContentScale().y);
1440 std::vector<DlColor> colors = {DlColor(0xFFFF0000), DlColor(0xFF00FF00)};
1441 std::vector<Scalar> stops = {0.0, 1.0};
1443 auto gradient = DlColorSource::MakeLinear(
1444 {0, 0}, {400, 400}, 2, colors.data(), stops.data(), DlTileMode::kClamp);
1447 save_paint.setOpacity(0.5);
1448 builder.SaveLayer(std::nullopt, &save_paint);
1451 paint.setColorSource(gradient);
1452 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 1));
1453 builder.DrawRect(DlRect::MakeXYWH(100, 100, 200, 200), paint);
1457 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1466 auto callback = [&]() -> sk_sp<DisplayList> {
1467 DisplayListBuilder builder;
1471 Scalar offset = amp * sin(freq * 2.0 * M_PI * count / 60.0);
1475 paint.setColor(DlColor::kCornflowerBlue());
1476 builder.DrawCircle(
DlPoint(100 + offset, 100), 50, paint);
1477 paint.setColor(DlColor::kGreenYellow());
1478 builder.DrawCircle(
DlPoint(300, 200 + offset), 100, paint);
1479 paint.setColor(DlColor::kDarkMagenta());
1480 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
1481 paint.setColor(DlColor::kOrangeRed());
1482 builder.DrawCircle(
DlPoint(180 + offset, 120 + offset), 100, paint);
1485 auto backdrop_filter1 = DlImageFilter::MakeBlur(15, 15, DlTileMode::kClamp);
1486 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter1.get());
1489 DlPaint transparent_paint;
1490 transparent_paint.setColor(DlColor::kWhite().withAlpha(0.1 * 255));
1491 builder.DrawPaint(transparent_paint);
1495 auto backdrop_filter2 =
1496 DlImageFilter::MakeBlur(10, 10, DlTileMode::kClamp);
1498 builder.ClipRect(DlRect::MakeXYWH(150, 150, 300, 300));
1499 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter2.get());
1507 return builder.Build();
1509 ASSERT_TRUE(OpenPlaygroundHere(callback));
#define MASK_BLUR_VARIANT_TEST(config)
static bool ImGuiBegin(const char *name, bool *p_open, ImGuiWindowFlags flags)
static sk_sp< DlImageImpeller > Make(std::shared_ptr< Texture > texture, OwningContext owning_context=OwningContext::kIO)
Point GetContentScale() const
sk_sp< flutter::DisplayList > DoGradientOvalStrokeMaskBlur(Vector2 content_Scale, Scalar sigma, DlBlurStyle style)
static sk_sp< DisplayList > MaskBlurVariantTest(const AiksTest &test_context, const MaskBlurTestConfig &config)
TEST_P(AiksTest, DrawAtlasNoColor)
static const std::map< std::string, MaskBlurTestConfig > kPaintVariations
Point DrawPlaygroundPoint(PlaygroundPoint &point)
std::tuple< Point, Point > DrawPlaygroundLine(PlaygroundPoint &point_a, PlaygroundPoint &point_b)
std::shared_ptr< Texture > DisplayListToTexture(const sk_sp< flutter::DisplayList > &display_list, ISize size, AiksContext &context, bool reset_host_buffer, bool generate_mips, std::optional< PixelFormat > target_pixel_format)
Render the provided display list to a texture with the given size.
flutter::DlRoundRect DlRoundRect
static constexpr Color White()
static constexpr Color Red()
static constexpr Color AntiqueWhite()
static constexpr Color Green()
static constexpr Matrix MakeTranslation(const Vector3 &t)
static constexpr Matrix MakeScale(const Vector3 &s)
For convolution filters, the "radius" is the size of the convolution kernel to use on the local space...
In filters that use Gaussian distributions, "sigma" is a size of one standard deviation in terms of t...
constexpr TPoint Rotate(const Radians &angle) const
constexpr TRect< T > Expand(T left, T top, T right, T bottom) const
Returns a rectangle with expanded edges. Negative expansion results in shrinking.
constexpr auto GetBottom() const
constexpr auto GetTop() const
constexpr auto GetLeft() const
constexpr TSize< Type > GetSize() const
Returns the size of the rectangle which may be negative in either width or height and may have been c...
constexpr auto GetRight() const
constexpr static TRect MakeXYWH(Type x, Type y, Type width, Type height)
constexpr TRect< T > Shift(T dx, T dy) const
Returns a new rectangle translated by the given offset.
constexpr static TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
std::shared_ptr< DlImageFilter > image_filter