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/geometry/dl_path_builder.h"
19 #include "gmock/gmock.h"
23 #include "impeller/renderer/testing/mocks.h"
24 #include "third_party/imgui/imgui.h"
39 DisplayListBuilder builder;
40 builder.Scale(GetContentScale().
x, GetContentScale().y);
42 std::vector<float> sigmas = {0.0, 0.01, 1.0};
43 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
45 for (uint32_t i = 0; i < sigmas.size(); ++i) {
47 paint.setColor(colors[i]);
49 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
52 builder.Translate(100 + (i * 100), 100);
54 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 60.0f, 160.0f), 50, 100);
55 builder.DrawRoundRect(rrect, paint);
59 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
65 DisplayListBuilder builder;
66 builder.Scale(content_Scale.
x, content_Scale.
y);
68 DlPaint background_paint;
69 background_paint.setColor(DlColor(1, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
70 builder.DrawPaint(background_paint);
72 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue()};
73 std::vector<Scalar> stops = {0.0, 1.0};
76 paint.setMaskFilter(DlBlurMaskFilter::Make(style, sigma));
77 auto gradient = DlColorSource::MakeLinear(
78 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kClamp);
79 paint.setColorSource(gradient);
80 paint.setColor(DlColor::kWhite());
81 paint.setDrawStyle(DlDrawStyle::kStroke);
82 paint.setStrokeWidth(20);
85 builder.Translate(100, 100);
89 line_paint.setColor(DlColor::kWhite());
95 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 200.0f, 60.0f), 50, 100);
96 builder.DrawRoundRect(rrect, paint);
99 return builder.Build();
105 GetContentScale(), 10, DlBlurStyle::kNormal)));
110 GetContentScale(), 0, DlBlurStyle::kNormal)));
115 GetContentScale(), 10, DlBlurStyle::kOuter)));
120 GetContentScale(), 10, DlBlurStyle::kInner)));
125 GetContentScale(), 10, DlBlurStyle::kSolid)));
129 DisplayListBuilder builder;
130 builder.Scale(GetContentScale().
x, GetContentScale().y);
132 std::vector<float> sigmas = {0.0, 0.01, 1.0};
133 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
135 for (uint32_t i = 0; i < sigmas.size(); ++i) {
137 paint.setColor(colors[i]);
139 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
142 builder.Translate(100 + (i * 100), 100);
144 DlRect::MakeXYWH(0, 0, 100.0f, 100.0f), 100, 100);
145 builder.DrawRoundRect(rrect, paint);
149 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
153 DisplayListBuilder builder;
156 paint.setColor(DlColor::kGreen());
157 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 99999));
158 builder.DrawCircle(
DlPoint(400, 400), 300, paint);
161 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
167 DisplayListBuilder builder;
168 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
171 paint.setColor(DlColor::kWhite());
175 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
176 paint.setColorFilter(
177 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kSrc));
178 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
180 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
186 DisplayListBuilder builder;
187 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
191 DlColor::RGBA(128.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f));
195 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
196 paint.setColorFilter(
197 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kColor));
198 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
201 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
205 auto callback = [&]() -> sk_sp<DisplayList> {
210 DisplayListBuilder builder;
212 paint.setColor(DlColor::kCornflowerBlue());
213 builder.DrawCircle(
DlPoint(100, 100), 50, paint);
215 paint.setColor(DlColor::kGreenYellow());
216 builder.DrawCircle(
DlPoint(300, 200), 100, paint);
218 paint.setColor(DlColor::kDarkMagenta());
219 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
221 paint.setColor(DlColor::kOrangeRed());
222 builder.DrawCircle(
DlPoint(180, 120), 100, paint);
225 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(a.x, a.y,
b.x,
b.y), 20, 20);
226 builder.ClipRoundRect(rrect);
229 save_paint.setBlendMode(DlBlendMode::kSrc);
231 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
232 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
235 return builder.Build();
238 ASSERT_TRUE(OpenPlaygroundHere(callback));
242 DisplayListBuilder builder;
245 paint.setColor(DlColor::kCornflowerBlue());
246 builder.DrawCircle(
DlPoint(100, 100), 50, paint);
248 paint.setColor(DlColor::kGreenYellow());
249 builder.DrawCircle(
DlPoint(300, 200), 100, paint);
251 paint.setColor(DlColor::kDarkMagenta());
252 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
254 paint.setColor(DlColor::kOrangeRed());
255 builder.DrawCircle(
DlPoint(180, 120), 100, paint);
258 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(75, 50, 375, 275), 20, 20);
259 builder.ClipRoundRect(rrect);
262 save_paint.setBlendMode(DlBlendMode::kSrc);
263 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
264 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
267 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
273 DisplayListBuilder builder;
276 builder.DrawImage(image,
DlPoint(50.0, 50.0),
277 DlImageSampling::kNearestNeighbor, &paint);
280 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(50, 250, 100, 100), 20, 20);
282 builder.ClipRoundRect(rrect);
285 save_paint.setBlendMode(DlBlendMode::kSrc);
286 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
287 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
292 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
298 DisplayListBuilder builder;
301 builder.DrawImage(image,
DlPoint(50.0, 50.0),
302 DlImageSampling::kNearestNeighbor, &paint);
304 for (
int i = 0; i < 6; i++) {
306 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
308 builder.ClipRoundRect(rrect);
311 save_paint.setBlendMode(DlBlendMode::kSrc);
312 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
313 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
319 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
323 CanRenderMultipleBackdropBlurWithSingleBackdropIdAndDistinctFilters) {
326 DisplayListBuilder builder;
329 builder.DrawImage(image,
DlPoint(50.0, 50.0),
330 DlImageSampling::kNearestNeighbor, &paint);
332 for (
int i = 0; i < 6; i++) {
334 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
336 builder.ClipRoundRect(rrect);
339 save_paint.setBlendMode(DlBlendMode::kSrc);
340 auto backdrop_filter =
341 DlImageFilter::MakeBlur(30 + i, 30, DlTileMode::kClamp);
342 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
348 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
352 DisplayListBuilder builder;
355 paint.setColor(DlColor::kGreen());
356 builder.DrawCircle(
DlPoint(400, 400), 300, paint);
359 save_paint.setBlendMode(DlBlendMode::kSrc);
361 auto backdrop_filter =
362 DlImageFilter::MakeBlur(999999, 999999, DlTileMode::kClamp);
363 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
366 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
370 DisplayListBuilder builder;
371 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
374 paint.setColor(DlColor::kGreen());
375 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
376 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
379 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
383 DisplayListBuilder builder;
386 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
387 builder.DrawPaint(background);
390 paint.setColor(DlColor::kGreen());
397 std::shared_ptr<DlImageFilter> color_filter =
398 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix));
399 std::shared_ptr<DlImageFilter> blur =
400 DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal);
401 paint.setImageFilter(DlImageFilter::MakeCompose(blur, color_filter));
402 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
404 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
408 DisplayListBuilder builder;
411 background.setColor(DlColor(1.0, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
412 builder.DrawPaint(background);
415 paint.setColor(DlColor::kGreen());
422 std::shared_ptr<DlImageFilter> color_filter =
423 DlImageFilter::MakeColorFilter(DlColorFilter::MakeMatrix(matrix));
424 std::shared_ptr<DlImageFilter> blur =
425 DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal);
426 paint.setImageFilter(DlImageFilter::MakeCompose(color_filter, blur));
427 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
429 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
433 auto callback = [&]() -> sk_sp<DisplayList> {
438 DisplayListBuilder builder;
439 auto location = point -
Point(400, 400);
440 builder.Translate(location.x, location.y);
445 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
446 paint.setColor(DlColor::kRed());
448 DlPath path = DlPath::MakeRect(DlRect::MakeLTRB(0, 0, 800, 800));
449 path = path + DlPath::MakeCircle(
DlPoint(0, 0), 0.5);
450 builder.DrawPath(path, paint);
451 return builder.Build();
453 ASSERT_TRUE(OpenPlaygroundHere(callback));
457 DisplayListBuilder builder;
458 builder.Translate(0, -400);
463 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
464 paint.setColor(DlColor::kRed());
466 DlPath path = DlPath::MakeRect(DlRect::MakeLTRB(0, 0, 800, 800));
467 path = path + DlPath::MakeCircle(
DlPoint(0, 0), 0.5);
468 builder.DrawPath(path, paint);
470 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
474 DisplayListBuilder builder;
476 paint.setColor(DlColor::kBlue());
477 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600.0, 600.0), paint);
480 clear.setBlendMode(DlBlendMode::kClear);
481 clear.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
483 builder.DrawCircle(
DlPoint(300.0, 300.0), 200.0, clear);
485 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
490 auto callback = [&]() -> sk_sp<DisplayList> {
492 ImGuiWindowFlags_AlwaysAutoResize)) {
493 ImGui::SliderFloat(
"Sigma", &sigma, 0, 50);
496 DisplayListBuilder builder;
497 builder.Scale(GetContentScale().
x, GetContentScale().y);
498 builder.DrawPaint({});
501 paint.setColor(DlColor::kGreen());
502 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
504 builder.DrawRect(DlRect::MakeXYWH(300, 300, 200, 200), paint);
505 return builder.Build();
508 ASSERT_TRUE(OpenPlaygroundHere(callback));
512 DisplayListBuilder builder;
515 paint.setColor(DlColor::kBlue());
516 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 0));
518 builder.DrawCircle(
DlPoint(300, 300), 200, paint);
519 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
521 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
526 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
529 DisplayListBuilder builder;
530 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
533 paint.setColor(DlColor::kBlue());
534 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 10));
537 builder.DrawRect(DlRect::MakeLTRB(100, 250, 500, 250), paint);
539 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
541 builder.DrawRect(DlRect::MakeLTRB(550, 300, 550, 600), paint);
543 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
547 DlBlurStyle style = DlBlurStyle::kNormal;
551 bool invert_colors =
false;
552 DlBlendMode blend_mode = DlBlendMode::kSrcOver;
558 DisplayListBuilder builder;
561 builder.Scale(0.8f, 0.8f);
562 builder.Translate(50.f, 50.f);
568 builder.DrawPaint(draw_paint);
571 paint.setMaskFilter(DlBlurMaskFilter::Make(config.
style, config.
sigma));
577 const Scalar radius = 20.0f;
578 const Scalar y_spacing = 100.0f;
582 paint.setColor(DlColor::kCrimson().withAlpha(alpha));
583 builder.DrawRect(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
584 radius, 60.0f - radius),
588 paint.setColor(DlColor::kBlue().withAlpha(alpha));
589 builder.DrawCircle(
DlPoint{
x + 25, y + 25}, radius, paint);
592 paint.setColor(DlColor::kGreen().withAlpha(alpha));
593 builder.DrawOval(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
594 radius, 60.0f - radius),
598 paint.setColor(DlColor::kPurple().withAlpha(alpha));
600 DlRect::MakeXYWH(
x, y, 60.0f, 60.0f), radius, radius);
601 builder.DrawRoundRect(rrect, paint);
604 paint.setColor(DlColor::kOrange().withAlpha(alpha));
606 rrect = DlRoundRect::MakeRectXY(DlRect::MakeXYWH(
x, y, 60.0f, 60.0f),
608 builder.DrawRoundRect(rrect, paint);
611 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
614 DlPathBuilder path_builder;
615 path_builder.MoveTo(
DlPoint(
x + 0, y + 60));
616 path_builder.LineTo(
DlPoint(
x + 30, y + 0));
617 path_builder.LineTo(
DlPoint(
x + 60, y + 60));
618 path_builder.Close();
620 builder.DrawPath(path_builder.TakePath(), paint);
624 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
630 builder.DrawPath(path, paint);
633 return builder.Build();
638 {
"NormalTranslucentZeroSigma",
639 {.style = DlBlurStyle::kNormal, .sigma = 0.0f, .alpha = 0.5f}},
641 {
"NormalTranslucent",
642 {.style = DlBlurStyle::kNormal, .sigma = 8.0f, .alpha = 0.5f}},
645 {.style = DlBlurStyle::kSolid, .sigma = 8.0f, .alpha = 0.5f}},
647 {
"SolidOpaque", {.style = DlBlurStyle::kSolid, .sigma = 8.0f}},
649 {
"SolidTranslucentWithFilters",
650 {.style = DlBlurStyle::kSolid,
653 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp),
654 .invert_colors =
true}},
656 {
"SolidTranslucentExclusionBlend",
657 {.style = DlBlurStyle::kSolid,
660 .blend_mode = DlBlendMode::kExclusion}},
663 {.style = DlBlurStyle::kInner, .sigma = 8.0f, .alpha = 0.5f}},
665 {
"InnerTranslucentWithBlurImageFilter",
666 {.style = DlBlurStyle::kInner,
669 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}},
672 {.style = DlBlurStyle::kOuter, .sigma = 8.0f, .alpha = 0.5f}},
674 {
"OuterOpaqueWithBlurImageFilter",
675 {.style = DlBlurStyle::kOuter,
677 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}}};
679 #define MASK_BLUR_VARIANT_TEST(config) \
680 TEST_P(AiksTest, MaskBlurVariantTest##config) { \
681 ASSERT_TRUE(OpenPlaygroundHere( \
682 MaskBlurVariantTest(*this, kPaintVariations.at(#config)))); \
696 #undef MASK_BLUR_VARIANT_TEST
699 DisplayListBuilder builder;
700 builder.Scale(GetContentScale().
x, GetContentScale().y);
703 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1));
704 builder.DrawPaint(paint);
706 paint.setColor(DlColor::kGreen());
707 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
709 DlPathBuilder path_builder;
710 path_builder.MoveTo(
DlPoint(200, 200));
711 path_builder.LineTo(
DlPoint(300, 400));
712 path_builder.LineTo(
DlPoint(100, 400));
713 path_builder.Close();
715 builder.DrawPath(path_builder.TakePath(), paint);
719 red.setColor(DlColor::kRed());
720 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
722 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
726 DisplayListBuilder builder;
727 builder.Scale(GetContentScale().
x, GetContentScale().y);
730 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
731 builder.DrawPaint(paint);
733 paint.setColor(DlColor::kGreen());
734 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
736 DlPathBuilder path_builder;
737 path_builder.MoveTo(
DlPoint(200, 200));
738 path_builder.LineTo(
DlPoint(300, 400));
739 path_builder.LineTo(
DlPoint(100, 400));
740 path_builder.Close();
742 builder.DrawPath(path_builder.TakePath(), paint);
746 red.setColor(DlColor::kRed());
747 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
749 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
753 DisplayListBuilder builder;
754 builder.Scale(GetContentScale().
x, GetContentScale().y);
757 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
758 builder.DrawPaint(paint);
760 paint.setColor(DlColor::kGreen());
761 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
763 DlPathBuilder path_builder;
764 path_builder.MoveTo(
DlPoint(200, 200));
765 path_builder.LineTo(
DlPoint(300, 400));
766 path_builder.LineTo(
DlPoint(100, 400));
767 path_builder.Close();
769 builder.DrawPath(path_builder.TakePath(), paint);
773 red.setColor(DlColor::kRed());
774 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
776 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
781 auto callback = [&]() -> sk_sp<DisplayList> {
783 ImGuiWindowFlags_AlwaysAutoResize)) {
784 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
788 DisplayListBuilder builder;
789 builder.Scale(GetContentScale().
x, GetContentScale().y);
792 paint.setColor(DlColor::kGreen());
793 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
797 DlPoint(200, 200), DlImageSampling::kNearestNeighbor, &paint);
800 red.setColor(DlColor::kRed());
801 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
803 return builder.Build();
805 ASSERT_TRUE(OpenPlaygroundHere(callback));
810 auto callback = [&]() -> sk_sp<DisplayList> {
812 ImGuiWindowFlags_AlwaysAutoResize)) {
813 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
817 DisplayListBuilder builder;
818 builder.Scale(GetContentScale().
x, GetContentScale().y);
821 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
822 builder.DrawPaint(paint);
824 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
829 paint.setColorSource(DlColorSource::MakeImage(
831 DlImageSampling::kMipmapLinear));
832 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
834 builder.DrawRect(DlRect::MakeXYWH(0, 0, boston->GetSize().width,
835 boston->GetSize().height),
838 return builder.Build();
840 ASSERT_TRUE(OpenPlaygroundHere(callback));
844 DisplayListBuilder builder;
847 builder.Scale(GetContentScale().
x, GetContentScale().y);
849 paint.setColor(DlColor::kLimeGreen());
851 DlRect::MakeLTRB(0, 0, GetWindowSize().width, 100), 10, 10);
852 builder.DrawRoundRect(rrect, paint);
854 paint.setColor(DlColor::kMagenta());
855 rrect = DlRoundRect::MakeRectXY(
856 DlRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
857 builder.DrawRoundRect(rrect, paint);
858 builder.ClipRect(DlRect::MakeLTRB(100, 0, 200, GetWindowSize().height));
861 save_paint.setBlendMode(DlBlendMode::kSrc);
863 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
865 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
868 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
872 DisplayListBuilder builder;
874 builder.Scale(GetContentScale().
x, GetContentScale().y);
875 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
876 builder.DrawImageRect(
878 DlRect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height),
879 DlRect::MakeLTRB(0, 0, GetWindowSize().width, 100),
880 DlImageSampling::kNearestNeighbor);
883 paint.setColor(DlColor::kMagenta());
886 DlRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
887 builder.DrawRoundRect(rrect, paint);
888 builder.ClipRect(DlRect::MakeLTRB(0, 50, GetWindowSize().width, 150));
891 save_paint.setBlendMode(DlBlendMode::kSrc);
893 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
894 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
897 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
906 CreateTextureForFixture(
"boston.jpg",
true);
912 auto callback = [&]() -> sk_sp<DisplayList> {
914 ImGuiWindowFlags_AlwaysAutoResize)) {
915 ImGui::SliderFloat(
"Sigma", &sigma, 0, 200);
916 ImGui::SliderFloat(
"Frequency", &freq, 0.01, 2.0);
917 ImGui::SliderFloat(
"Amplitude", &, 1, 100);
921 DisplayListBuilder builder;
922 builder.Scale(GetContentScale().
x, GetContentScale().y);
923 Scalar y = amp * sin(freq * 2.0 * M_PI * count / 60);
925 DlPoint(1024 / 2 - boston->GetSize().width / 2,
926 (768 / 2 - boston->GetSize().height / 2) + y),
927 DlImageSampling::kMipmapLinear);
933 DlRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
934 builder.ClipRect(DlRect::MakeLTRB(100, 100, 900, 700));
937 paint.setBlendMode(DlBlendMode::kSrc);
939 auto backdrop_filter =
940 DlImageFilter::MakeBlur(sigma, sigma, DlTileMode::kClamp);
941 builder.SaveLayer(std::nullopt, &paint, backdrop_filter.get());
943 return builder.Build();
945 ASSERT_TRUE(OpenPlaygroundHere(callback));
949 DisplayListBuilder builder;
951 builder.Scale(GetContentScale().
x, GetContentScale().y);
954 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
955 builder.DrawPaint(paint);
957 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
958 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
959 std::vector<Scalar> stops = {0.0, 1.0};
962 paint.setColorSource(DlColorSource::MakeLinear(
968 DlTileMode::kMirror));
969 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
971 DlPathBuilder path_builder;
972 path_builder.MoveTo(
DlPoint(200, 200));
973 path_builder.LineTo(
DlPoint(300, 400));
974 path_builder.LineTo(
DlPoint(100, 400));
975 path_builder.Close();
976 builder.DrawPath(path_builder.TakePath(), paint);
980 red.setColor(DlColor::kRed());
981 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
983 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
987 DisplayListBuilder builder;
988 builder.Scale(GetContentScale().
x, GetContentScale().y);
991 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
992 builder.DrawPaint(paint);
994 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
995 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
996 std::vector<Scalar> stops = {0.0, 1.0};
999 paint.setColorSource(DlColorSource::MakeLinear(
1005 DlTileMode::kMirror));
1006 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
1008 DlPathBuilder path_builder;
1009 path_builder.MoveTo(
DlPoint(200, 200));
1010 path_builder.LineTo(
DlPoint(300, 400));
1011 path_builder.LineTo(
DlPoint(100, 400));
1012 path_builder.Close();
1013 builder.DrawPath(path_builder.TakePath(), paint);
1017 red.setColor(DlColor::kRed());
1018 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
1019 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1023 DisplayListBuilder builder;
1024 builder.Scale(GetContentScale().
x, GetContentScale().y);
1027 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
1028 builder.DrawPaint(paint);
1030 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
1031 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
1032 std::vector<Scalar> stops = {0.0, 1.0};
1035 paint.setColorSource(DlColorSource::MakeLinear(
1041 DlTileMode::kMirror));
1042 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
1044 DlPathBuilder path_builder;
1045 path_builder.MoveTo(
DlPoint(200, 200));
1046 path_builder.LineTo(
DlPoint(300, 400));
1047 path_builder.LineTo(
DlPoint(100, 400));
1048 path_builder.Close();
1049 builder.DrawPath(path_builder.TakePath(), paint);
1053 red.setColor(DlColor::kRed());
1054 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
1055 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1059 DisplayListBuilder builder;
1060 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1062 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1066 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
1068 Vector2 clip_size = {150, 75};
1070 builder.Scale(GetContentScale().
x, GetContentScale().y);
1074 builder.ClipRect(DlRect::MakeLTRB(rect.GetLeft(), rect.GetTop(),
1075 rect.GetRight(), rect.GetBottom()));
1076 builder.Translate(center.
x, center.
y);
1077 builder.Scale(0.6, 0.6);
1081 Rect dest = bounds.
Shift(-image_center);
1085 sk_dst, DlImageSampling::kNearestNeighbor,
1088 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1092 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1094 auto callback = [&]() -> sk_sp<DisplayList> {
1095 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1096 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1097 DlTileMode::kMirror, DlTileMode::kDecal};
1099 static float rotation = 0;
1100 static float scale = 0.6;
1101 static int selected_tile_mode = 3;
1104 ImGuiWindowFlags_AlwaysAutoResize)) {
1105 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1106 ImGui::SliderFloat(
"Scale", &scale, 0, 2.0);
1107 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1108 sizeof(tile_mode_names) /
sizeof(
char*));
1112 DisplayListBuilder builder;
1114 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1117 paint.setImageFilter(
1118 DlImageFilter::MakeBlur(20, 20, tile_modes[selected_tile_mode]));
1125 builder.Scale(GetContentScale().
x, GetContentScale().y);
1127 DlRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
1128 builder.Translate(center.
x, center.
y);
1129 builder.Scale(scale, scale);
1130 builder.
Rotate(rotation);
1134 Rect dest = bounds.
Shift(-image_center);
1138 sk_dst, DlImageSampling::kNearestNeighbor,
1140 return builder.Build();
1143 ASSERT_TRUE(OpenPlaygroundHere(callback));
1147 DisplayListBuilder builder;
1149 builder.Scale(GetContentScale().
x, GetContentScale().y);
1150 builder.Scale(0.5, 0.5);
1152 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1156 paint.setBlendMode(DlBlendMode::kSrc);
1158 auto backdrop_filter = DlImageFilter::MakeBlur(50, 0, DlTileMode::kClamp);
1159 builder.SaveLayer(std::nullopt, &paint, backdrop_filter.get());
1161 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1169 DisplayListBuilder builder;
1171 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1173 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1176 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
1179 Vector2 clip_size = {150, 75};
1181 builder.Scale(GetContentScale().
x, GetContentScale().y);
1185 builder.ClipRect(DlRect::MakeLTRB(clip_bounds.GetLeft(), clip_bounds.GetTop(),
1186 clip_bounds.GetRight(),
1187 clip_bounds.GetBottom()));
1188 builder.Translate(center.
x, center.
y);
1189 builder.Scale(0.6, 0.6);
1192 auto dst_rect = bounds.
Shift(-image_center);
1193 builder.DrawImageRect(
1198 DlRect::MakeLTRB(dst_rect.GetLeft(), dst_rect.GetTop(),
1199 dst_rect.GetRight(), dst_rect.GetBottom()),
1200 DlImageSampling::kMipmapLinear, &paint);
1202 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1206 auto callback = [&]() -> sk_sp<DisplayList> {
1207 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1208 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1209 DlTileMode::kMirror, DlTileMode::kDecal};
1211 static float rotation = 45;
1212 static float scale = 0.6;
1213 static int selected_tile_mode = 3;
1216 ImGuiWindowFlags_AlwaysAutoResize)) {
1217 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1218 ImGui::SliderFloat(
"Scale", &scale, 0, 2.0);
1219 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1220 sizeof(tile_mode_names) /
sizeof(
char*));
1224 DisplayListBuilder builder;
1227 paint.setColor(DlColor::kGreen());
1228 paint.setImageFilter(
1229 DlImageFilter::MakeBlur(50, 0, tile_modes[selected_tile_mode]));
1232 builder.Scale(GetContentScale().
x, GetContentScale().y);
1233 builder.Translate(center.
x, center.
y);
1234 builder.Scale(scale, scale);
1235 builder.
Rotate(rotation);
1238 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(-100, -100, 200, 200), 10, 10);
1239 builder.DrawRoundRect(rrect, paint);
1240 return builder.Build();
1243 ASSERT_TRUE(OpenPlaygroundHere(callback));
1247 DisplayListBuilder builder;
1248 builder.Scale(GetContentScale().
x, GetContentScale().y);
1250 auto paint_lines = [&builder](
Scalar dx,
Scalar dy, DlPaint paint) {
1252 DlPath line = DlPath::MakeLine(a,
b);
1253 builder.DrawPath(line, paint);
1255 paint.setStrokeWidth(5);
1256 paint.setDrawStyle(DlDrawStyle::kStroke);
1257 draw_line(
DlPoint(dx + 100, dy + 100),
DlPoint(dx + 200, dy + 200));
1258 draw_line(
DlPoint(dx + 100, dy + 200),
DlPoint(dx + 200, dy + 100));
1259 draw_line(
DlPoint(dx + 150, dy + 100),
DlPoint(dx + 200, dy + 150));
1260 draw_line(
DlPoint(dx + 100, dy + 150),
DlPoint(dx + 150, dy + 200));
1264 DisplayListBuilder recorder_builder;
1265 for (
int x = 0;
x < 5; ++
x) {
1266 for (
int y = 0; y < 5; ++y) {
1267 DlRect rect = DlRect::MakeXYWH(
x * 20, y * 20, 20, 20);
1269 paint.setColor(((
x + y) & 1) == 0 ? DlColor::kYellow()
1270 : DlColor::kBlue());
1272 recorder_builder.DrawRect(rect, paint);
1278 auto image_source = DlColorSource::MakeImage(
1280 auto blur_filter = DlImageFilter::MakeBlur(5, 5, DlTileMode::kDecal);
1283 paint.setColor(DlColor::kDarkGreen());
1284 builder.DrawRect(DlRect::MakeLTRB(0, 0, 300, 600), paint);
1286 paint.setColorSource(image_source);
1287 builder.DrawRect(DlRect::MakeLTRB(100, 100, 200, 200), paint);
1289 paint.setColorSource(
nullptr);
1290 paint.setColor(DlColor::kRed());
1291 builder.DrawRect(DlRect::MakeLTRB(300, 0, 600, 600), paint);
1293 paint.setColorSource(image_source);
1294 paint.setImageFilter(blur_filter);
1295 builder.DrawRect(DlRect::MakeLTRB(400, 100, 500, 200), paint);
1297 paint.setImageFilter(
nullptr);
1298 paint_lines(0, 300, paint);
1300 paint.setImageFilter(blur_filter);
1301 paint_lines(300, 300, paint);
1303 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1312 for (int32_t i = 1; i < 5; ++i) {
1313 DisplayListBuilder builder;
1315 DlPathBuilder path_builder;
1316 path_builder.MoveTo(
DlPoint(100, 100));
1317 path_builder.LineTo(
DlPoint(100 + fi, 100 + fi));
1320 paint.setColor(DlColor::kChartreuse());
1321 auto blur_filter = DlImageFilter::MakeBlur(0.1, 0.1, DlTileMode::kClamp);
1322 paint.setImageFilter(blur_filter);
1324 builder.DrawPath(path_builder.TakePath(), paint);
1327 EXPECT_TRUE(image) <<
" length " << i;
1336 for (int32_t i = 1; i < 5; ++i) {
1337 DisplayListBuilder builder;
1342 DlRect::MakeXYWH(400, 400, clip_size.
width, clip_size.
height));
1345 paint.setColor(DlColor::kGreen());
1346 auto blur_filter = DlImageFilter::MakeBlur(0.1, 0.1, DlTileMode::kDecal);
1347 paint.setImageFilter(blur_filter);
1349 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
1353 EXPECT_TRUE(image) <<
" length " << i;
1358 CanRenderMultipleBackdropBlurWithSingleBackdropIdDifferentLayers) {
1361 DisplayListBuilder builder;
1364 builder.DrawImage(image,
DlPoint(50.0, 50.0),
1365 DlImageSampling::kNearestNeighbor, &paint);
1367 for (
int i = 0; i < 6; i++) {
1370 paint.setColor(DlColor::kWhite().withAlphaF(0.95));
1371 builder.SaveLayer(std::nullopt, &paint);
1374 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
1376 builder.ClipRoundRect(rrect);
1379 save_paint.setBlendMode(DlBlendMode::kSrc);
1380 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
1381 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
1390 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1394 DisplayListBuilder builder;
1395 builder.Scale(GetContentScale().
x, GetContentScale().y);
1397 std::vector<DlColor> colors = {DlColor(0xFFFF0000), DlColor(0xFF00FF00)};
1398 std::vector<Scalar> stops = {0.0, 1.0};
1400 auto gradient = DlColorSource::MakeLinear(
1401 {0, 0}, {400, 400}, 2, colors.data(), stops.data(), DlTileMode::kClamp);
1404 save_paint.setOpacity(0.5);
1405 builder.SaveLayer(std::nullopt, &save_paint);
1408 paint.setColorSource(gradient);
1409 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 1));
1410 builder.DrawRect(DlRect::MakeXYWH(100, 100, 200, 200), paint);
1414 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1423 auto callback = [&]() -> sk_sp<DisplayList> {
1424 DisplayListBuilder builder;
1428 Scalar offset = amp * sin(freq * 2.0 * M_PI * count / 60.0);
1432 paint.setColor(DlColor::kCornflowerBlue());
1433 builder.DrawCircle(
DlPoint(100 + offset, 100), 50, paint);
1434 paint.setColor(DlColor::kGreenYellow());
1435 builder.DrawCircle(
DlPoint(300, 200 + offset), 100, paint);
1436 paint.setColor(DlColor::kDarkMagenta());
1437 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
1438 paint.setColor(DlColor::kOrangeRed());
1439 builder.DrawCircle(
DlPoint(180 + offset, 120 + offset), 100, paint);
1442 auto backdrop_filter1 = DlImageFilter::MakeBlur(15, 15, DlTileMode::kClamp);
1443 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter1.get());
1446 DlPaint transparent_paint;
1447 transparent_paint.setColor(DlColor::kWhite().withAlpha(0.1 * 255));
1448 builder.DrawPaint(transparent_paint);
1452 auto backdrop_filter2 =
1453 DlImageFilter::MakeBlur(10, 10, DlTileMode::kClamp);
1455 builder.ClipRect(DlRect::MakeXYWH(150, 150, 300, 300));
1456 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter2.get());
1464 return builder.Build();
1466 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
std::shared_ptr< Texture > DisplayListToTexture(const sk_sp< flutter::DisplayList > &display_list, ISize size, AiksContext &context, bool reset_host_buffer, bool generate_mips)
Render the provided display list to a texture with the given size.
Point DrawPlaygroundPoint(PlaygroundPoint &point)
std::tuple< Point, Point > DrawPlaygroundLine(PlaygroundPoint &point_a, PlaygroundPoint &point_b)
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