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 auto callback = [&]() -> sk_sp<DisplayList> {
388 DisplayListBuilder builder;
389 auto location = point -
Point(400, 400);
390 builder.Translate(location.x, location.y);
395 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
396 paint.setColor(DlColor::kRed());
398 DlPath path = DlPath::MakeRect(DlRect::MakeLTRB(0, 0, 800, 800));
399 path = path + DlPath::MakeCircle(
DlPoint(0, 0), 0.5);
400 builder.DrawPath(path, paint);
401 return builder.Build();
403 ASSERT_TRUE(OpenPlaygroundHere(callback));
407 DisplayListBuilder builder;
408 builder.Translate(0, -400);
413 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
414 paint.setColor(DlColor::kRed());
416 DlPath path = DlPath::MakeRect(DlRect::MakeLTRB(0, 0, 800, 800));
417 path = path + DlPath::MakeCircle(
DlPoint(0, 0), 0.5);
418 builder.DrawPath(path, paint);
420 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
424 DisplayListBuilder builder;
426 paint.setColor(DlColor::kBlue());
427 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600.0, 600.0), paint);
430 clear.setBlendMode(DlBlendMode::kClear);
431 clear.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
433 builder.DrawCircle(
DlPoint(300.0, 300.0), 200.0, clear);
435 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
440 auto callback = [&]() -> sk_sp<DisplayList> {
442 ImGuiWindowFlags_AlwaysAutoResize)) {
443 ImGui::SliderFloat(
"Sigma", &sigma, 0, 50);
446 DisplayListBuilder builder;
447 builder.Scale(GetContentScale().
x, GetContentScale().y);
448 builder.DrawPaint({});
451 paint.setColor(DlColor::kGreen());
452 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
454 builder.DrawRect(DlRect::MakeXYWH(300, 300, 200, 200), paint);
455 return builder.Build();
458 ASSERT_TRUE(OpenPlaygroundHere(callback));
462 DisplayListBuilder builder;
465 paint.setColor(DlColor::kBlue());
466 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 0));
468 builder.DrawCircle(
DlPoint(300, 300), 200, paint);
469 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
471 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
476 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
479 DisplayListBuilder builder;
480 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
483 paint.setColor(DlColor::kBlue());
484 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 10));
487 builder.DrawRect(DlRect::MakeLTRB(100, 250, 500, 250), paint);
489 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
491 builder.DrawRect(DlRect::MakeLTRB(550, 300, 550, 600), paint);
493 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
497 DlBlurStyle style = DlBlurStyle::kNormal;
501 bool invert_colors =
false;
502 DlBlendMode blend_mode = DlBlendMode::kSrcOver;
508 DisplayListBuilder builder;
511 builder.Scale(0.8f, 0.8f);
512 builder.Translate(50.f, 50.f);
518 builder.DrawPaint(draw_paint);
521 paint.setMaskFilter(DlBlurMaskFilter::Make(config.
style, config.
sigma));
527 const Scalar radius = 20.0f;
528 const Scalar y_spacing = 100.0f;
532 paint.setColor(DlColor::kCrimson().withAlpha(alpha));
533 builder.DrawRect(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
534 radius, 60.0f - radius),
538 paint.setColor(DlColor::kBlue().withAlpha(alpha));
539 builder.DrawCircle(
DlPoint{
x + 25, y + 25}, radius, paint);
542 paint.setColor(DlColor::kGreen().withAlpha(alpha));
543 builder.DrawOval(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
544 radius, 60.0f - radius),
548 paint.setColor(DlColor::kPurple().withAlpha(alpha));
550 DlRect::MakeXYWH(
x, y, 60.0f, 60.0f), radius, radius);
551 builder.DrawRoundRect(rrect, paint);
554 paint.setColor(DlColor::kOrange().withAlpha(alpha));
556 rrect = DlRoundRect::MakeRectXY(DlRect::MakeXYWH(
x, y, 60.0f, 60.0f),
558 builder.DrawRoundRect(rrect, paint);
561 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
564 DlPathBuilder path_builder;
565 path_builder.MoveTo(
DlPoint(
x + 0, y + 60));
566 path_builder.LineTo(
DlPoint(
x + 30, y + 0));
567 path_builder.LineTo(
DlPoint(
x + 60, y + 60));
568 path_builder.Close();
570 builder.DrawPath(path_builder.TakePath(), paint);
574 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
580 builder.DrawPath(path, paint);
583 return builder.Build();
588 {
"NormalTranslucentZeroSigma",
589 {.style = DlBlurStyle::kNormal, .sigma = 0.0f, .alpha = 0.5f}},
591 {
"NormalTranslucent",
592 {.style = DlBlurStyle::kNormal, .sigma = 8.0f, .alpha = 0.5f}},
595 {.style = DlBlurStyle::kSolid, .sigma = 8.0f, .alpha = 0.5f}},
597 {
"SolidOpaque", {.style = DlBlurStyle::kSolid, .sigma = 8.0f}},
599 {
"SolidTranslucentWithFilters",
600 {.style = DlBlurStyle::kSolid,
603 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp),
604 .invert_colors =
true}},
606 {
"SolidTranslucentExclusionBlend",
607 {.style = DlBlurStyle::kSolid,
610 .blend_mode = DlBlendMode::kExclusion}},
613 {.style = DlBlurStyle::kInner, .sigma = 8.0f, .alpha = 0.5f}},
615 {
"InnerTranslucentWithBlurImageFilter",
616 {.style = DlBlurStyle::kInner,
619 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}},
622 {.style = DlBlurStyle::kOuter, .sigma = 8.0f, .alpha = 0.5f}},
624 {
"OuterOpaqueWithBlurImageFilter",
625 {.style = DlBlurStyle::kOuter,
627 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}}};
629 #define MASK_BLUR_VARIANT_TEST(config) \
630 TEST_P(AiksTest, MaskBlurVariantTest##config) { \
631 ASSERT_TRUE(OpenPlaygroundHere( \
632 MaskBlurVariantTest(*this, kPaintVariations.at(#config)))); \
646 #undef MASK_BLUR_VARIANT_TEST
649 DisplayListBuilder builder;
650 builder.Scale(GetContentScale().
x, GetContentScale().y);
653 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1));
654 builder.DrawPaint(paint);
656 paint.setColor(DlColor::kGreen());
657 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
659 DlPathBuilder path_builder;
660 path_builder.MoveTo(
DlPoint(200, 200));
661 path_builder.LineTo(
DlPoint(300, 400));
662 path_builder.LineTo(
DlPoint(100, 400));
663 path_builder.Close();
665 builder.DrawPath(path_builder.TakePath(), paint);
669 red.setColor(DlColor::kRed());
670 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
672 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
676 DisplayListBuilder builder;
677 builder.Scale(GetContentScale().
x, GetContentScale().y);
680 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
681 builder.DrawPaint(paint);
683 paint.setColor(DlColor::kGreen());
684 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
686 DlPathBuilder path_builder;
687 path_builder.MoveTo(
DlPoint(200, 200));
688 path_builder.LineTo(
DlPoint(300, 400));
689 path_builder.LineTo(
DlPoint(100, 400));
690 path_builder.Close();
692 builder.DrawPath(path_builder.TakePath(), paint);
696 red.setColor(DlColor::kRed());
697 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
699 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
703 DisplayListBuilder builder;
704 builder.Scale(GetContentScale().
x, GetContentScale().y);
707 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
708 builder.DrawPaint(paint);
710 paint.setColor(DlColor::kGreen());
711 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
713 DlPathBuilder path_builder;
714 path_builder.MoveTo(
DlPoint(200, 200));
715 path_builder.LineTo(
DlPoint(300, 400));
716 path_builder.LineTo(
DlPoint(100, 400));
717 path_builder.Close();
719 builder.DrawPath(path_builder.TakePath(), paint);
723 red.setColor(DlColor::kRed());
724 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
726 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
731 auto callback = [&]() -> sk_sp<DisplayList> {
733 ImGuiWindowFlags_AlwaysAutoResize)) {
734 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
738 DisplayListBuilder builder;
739 builder.Scale(GetContentScale().
x, GetContentScale().y);
742 paint.setColor(DlColor::kGreen());
743 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
747 DlPoint(200, 200), DlImageSampling::kNearestNeighbor, &paint);
750 red.setColor(DlColor::kRed());
751 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
753 return builder.Build();
755 ASSERT_TRUE(OpenPlaygroundHere(callback));
760 auto callback = [&]() -> sk_sp<DisplayList> {
762 ImGuiWindowFlags_AlwaysAutoResize)) {
763 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
767 DisplayListBuilder builder;
768 builder.Scale(GetContentScale().
x, GetContentScale().y);
771 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
772 builder.DrawPaint(paint);
774 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
779 paint.setColorSource(DlColorSource::MakeImage(
781 DlImageSampling::kMipmapLinear));
782 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
784 builder.DrawRect(DlRect::MakeXYWH(0, 0, boston->GetSize().width,
785 boston->GetSize().height),
788 return builder.Build();
790 ASSERT_TRUE(OpenPlaygroundHere(callback));
794 DisplayListBuilder builder;
797 builder.Scale(GetContentScale().
x, GetContentScale().y);
799 paint.setColor(DlColor::kLimeGreen());
801 DlRect::MakeLTRB(0, 0, GetWindowSize().width, 100), 10, 10);
802 builder.DrawRoundRect(rrect, paint);
804 paint.setColor(DlColor::kMagenta());
805 rrect = DlRoundRect::MakeRectXY(
806 DlRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
807 builder.DrawRoundRect(rrect, paint);
808 builder.ClipRect(DlRect::MakeLTRB(100, 0, 200, GetWindowSize().height));
811 save_paint.setBlendMode(DlBlendMode::kSrc);
813 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
815 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
818 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
822 DisplayListBuilder builder;
824 builder.Scale(GetContentScale().
x, GetContentScale().y);
825 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
826 builder.DrawImageRect(
828 DlRect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height),
829 DlRect::MakeLTRB(0, 0, GetWindowSize().width, 100),
830 DlImageSampling::kNearestNeighbor);
833 paint.setColor(DlColor::kMagenta());
836 DlRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
837 builder.DrawRoundRect(rrect, paint);
838 builder.ClipRect(DlRect::MakeLTRB(0, 50, GetWindowSize().width, 150));
841 save_paint.setBlendMode(DlBlendMode::kSrc);
843 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
844 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
847 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
856 CreateTextureForFixture(
"boston.jpg",
true);
862 auto callback = [&]() -> sk_sp<DisplayList> {
864 ImGuiWindowFlags_AlwaysAutoResize)) {
865 ImGui::SliderFloat(
"Sigma", &sigma, 0, 200);
866 ImGui::SliderFloat(
"Frequency", &freq, 0.01, 2.0);
867 ImGui::SliderFloat(
"Amplitude", &, 1, 100);
871 DisplayListBuilder builder;
872 builder.Scale(GetContentScale().
x, GetContentScale().y);
873 Scalar y = amp * sin(freq * 2.0 * M_PI * count / 60);
875 DlPoint(1024 / 2 - boston->GetSize().width / 2,
876 (768 / 2 - boston->GetSize().height / 2) + y),
877 DlImageSampling::kMipmapLinear);
883 DlRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
884 builder.ClipRect(DlRect::MakeLTRB(100, 100, 900, 700));
887 paint.setBlendMode(DlBlendMode::kSrc);
889 auto backdrop_filter =
890 DlImageFilter::MakeBlur(sigma, sigma, DlTileMode::kClamp);
891 builder.SaveLayer(std::nullopt, &paint, backdrop_filter.get());
893 return builder.Build();
895 ASSERT_TRUE(OpenPlaygroundHere(callback));
899 DisplayListBuilder builder;
901 builder.Scale(GetContentScale().
x, GetContentScale().y);
904 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
905 builder.DrawPaint(paint);
907 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
908 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
909 std::vector<Scalar> stops = {0.0, 1.0};
912 paint.setColorSource(DlColorSource::MakeLinear(
918 DlTileMode::kMirror));
919 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
921 DlPathBuilder path_builder;
922 path_builder.MoveTo(
DlPoint(200, 200));
923 path_builder.LineTo(
DlPoint(300, 400));
924 path_builder.LineTo(
DlPoint(100, 400));
925 path_builder.Close();
926 builder.DrawPath(path_builder.TakePath(), paint);
930 red.setColor(DlColor::kRed());
931 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
933 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
937 DisplayListBuilder builder;
938 builder.Scale(GetContentScale().
x, GetContentScale().y);
941 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
942 builder.DrawPaint(paint);
944 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
945 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
946 std::vector<Scalar> stops = {0.0, 1.0};
949 paint.setColorSource(DlColorSource::MakeLinear(
955 DlTileMode::kMirror));
956 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
958 DlPathBuilder path_builder;
959 path_builder.MoveTo(
DlPoint(200, 200));
960 path_builder.LineTo(
DlPoint(300, 400));
961 path_builder.LineTo(
DlPoint(100, 400));
962 path_builder.Close();
963 builder.DrawPath(path_builder.TakePath(), paint);
967 red.setColor(DlColor::kRed());
968 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
969 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
973 DisplayListBuilder builder;
974 builder.Scale(GetContentScale().
x, GetContentScale().y);
977 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
978 builder.DrawPaint(paint);
980 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
981 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
982 std::vector<Scalar> stops = {0.0, 1.0};
985 paint.setColorSource(DlColorSource::MakeLinear(
991 DlTileMode::kMirror));
992 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
994 DlPathBuilder path_builder;
995 path_builder.MoveTo(
DlPoint(200, 200));
996 path_builder.LineTo(
DlPoint(300, 400));
997 path_builder.LineTo(
DlPoint(100, 400));
998 path_builder.Close();
999 builder.DrawPath(path_builder.TakePath(), paint);
1003 red.setColor(DlColor::kRed());
1004 builder.DrawRect(DlRect::MakeXYWH(0, 0, 200, 200), red);
1005 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1009 DisplayListBuilder builder;
1010 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1012 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1016 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
1018 Vector2 clip_size = {150, 75};
1020 builder.Scale(GetContentScale().
x, GetContentScale().y);
1024 builder.ClipRect(DlRect::MakeLTRB(rect.GetLeft(), rect.GetTop(),
1025 rect.GetRight(), rect.GetBottom()));
1026 builder.Translate(center.
x, center.
y);
1027 builder.Scale(0.6, 0.6);
1031 Rect dest = bounds.
Shift(-image_center);
1035 sk_dst, DlImageSampling::kNearestNeighbor,
1038 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1042 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1044 auto callback = [&]() -> sk_sp<DisplayList> {
1045 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1046 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1047 DlTileMode::kMirror, DlTileMode::kDecal};
1049 static float rotation = 0;
1050 static float scale = 0.6;
1051 static int selected_tile_mode = 3;
1054 ImGuiWindowFlags_AlwaysAutoResize)) {
1055 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1056 ImGui::SliderFloat(
"Scale", &scale, 0, 2.0);
1057 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1058 sizeof(tile_mode_names) /
sizeof(
char*));
1062 DisplayListBuilder builder;
1064 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1067 paint.setImageFilter(
1068 DlImageFilter::MakeBlur(20, 20, tile_modes[selected_tile_mode]));
1075 builder.Scale(GetContentScale().
x, GetContentScale().y);
1077 DlRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
1078 builder.Translate(center.
x, center.
y);
1079 builder.Scale(scale, scale);
1080 builder.
Rotate(rotation);
1084 Rect dest = bounds.
Shift(-image_center);
1088 sk_dst, DlImageSampling::kNearestNeighbor,
1090 return builder.Build();
1093 ASSERT_TRUE(OpenPlaygroundHere(callback));
1097 DisplayListBuilder builder;
1099 builder.Scale(GetContentScale().
x, GetContentScale().y);
1100 builder.Scale(0.5, 0.5);
1102 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1106 paint.setBlendMode(DlBlendMode::kSrc);
1108 auto backdrop_filter = DlImageFilter::MakeBlur(50, 0, DlTileMode::kClamp);
1109 builder.SaveLayer(std::nullopt, &paint, backdrop_filter.get());
1111 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1119 DisplayListBuilder builder;
1121 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1123 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1126 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
1129 Vector2 clip_size = {150, 75};
1131 builder.Scale(GetContentScale().
x, GetContentScale().y);
1135 builder.ClipRect(DlRect::MakeLTRB(clip_bounds.GetLeft(), clip_bounds.GetTop(),
1136 clip_bounds.GetRight(),
1137 clip_bounds.GetBottom()));
1138 builder.Translate(center.
x, center.
y);
1139 builder.Scale(0.6, 0.6);
1142 auto dst_rect = bounds.
Shift(-image_center);
1143 builder.DrawImageRect(
1148 DlRect::MakeLTRB(dst_rect.GetLeft(), dst_rect.GetTop(),
1149 dst_rect.GetRight(), dst_rect.GetBottom()),
1150 DlImageSampling::kMipmapLinear, &paint);
1152 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1156 auto callback = [&]() -> sk_sp<DisplayList> {
1157 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1158 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1159 DlTileMode::kMirror, DlTileMode::kDecal};
1161 static float rotation = 45;
1162 static float scale = 0.6;
1163 static int selected_tile_mode = 3;
1166 ImGuiWindowFlags_AlwaysAutoResize)) {
1167 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1168 ImGui::SliderFloat(
"Scale", &scale, 0, 2.0);
1169 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1170 sizeof(tile_mode_names) /
sizeof(
char*));
1174 DisplayListBuilder builder;
1177 paint.setColor(DlColor::kGreen());
1178 paint.setImageFilter(
1179 DlImageFilter::MakeBlur(50, 0, tile_modes[selected_tile_mode]));
1182 builder.Scale(GetContentScale().
x, GetContentScale().y);
1183 builder.Translate(center.
x, center.
y);
1184 builder.Scale(scale, scale);
1185 builder.
Rotate(rotation);
1188 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(-100, -100, 200, 200), 10, 10);
1189 builder.DrawRoundRect(rrect, paint);
1190 return builder.Build();
1193 ASSERT_TRUE(OpenPlaygroundHere(callback));
1197 DisplayListBuilder builder;
1198 builder.Scale(GetContentScale().
x, GetContentScale().y);
1200 auto paint_lines = [&builder](
Scalar dx,
Scalar dy, DlPaint paint) {
1202 DlPath line = DlPath::MakeLine(a,
b);
1203 builder.DrawPath(line, paint);
1205 paint.setStrokeWidth(5);
1206 paint.setDrawStyle(DlDrawStyle::kStroke);
1207 draw_line(
DlPoint(dx + 100, dy + 100),
DlPoint(dx + 200, dy + 200));
1208 draw_line(
DlPoint(dx + 100, dy + 200),
DlPoint(dx + 200, dy + 100));
1209 draw_line(
DlPoint(dx + 150, dy + 100),
DlPoint(dx + 200, dy + 150));
1210 draw_line(
DlPoint(dx + 100, dy + 150),
DlPoint(dx + 150, dy + 200));
1214 DisplayListBuilder recorder_builder;
1215 for (
int x = 0;
x < 5; ++
x) {
1216 for (
int y = 0; y < 5; ++y) {
1217 DlRect rect = DlRect::MakeXYWH(
x * 20, y * 20, 20, 20);
1219 paint.setColor(((
x + y) & 1) == 0 ? DlColor::kYellow()
1220 : DlColor::kBlue());
1222 recorder_builder.DrawRect(rect, paint);
1228 auto image_source = DlColorSource::MakeImage(
1230 auto blur_filter = DlImageFilter::MakeBlur(5, 5, DlTileMode::kDecal);
1233 paint.setColor(DlColor::kDarkGreen());
1234 builder.DrawRect(DlRect::MakeLTRB(0, 0, 300, 600), paint);
1236 paint.setColorSource(image_source);
1237 builder.DrawRect(DlRect::MakeLTRB(100, 100, 200, 200), paint);
1239 paint.setColorSource(
nullptr);
1240 paint.setColor(DlColor::kRed());
1241 builder.DrawRect(DlRect::MakeLTRB(300, 0, 600, 600), paint);
1243 paint.setColorSource(image_source);
1244 paint.setImageFilter(blur_filter);
1245 builder.DrawRect(DlRect::MakeLTRB(400, 100, 500, 200), paint);
1247 paint.setImageFilter(
nullptr);
1248 paint_lines(0, 300, paint);
1250 paint.setImageFilter(blur_filter);
1251 paint_lines(300, 300, paint);
1253 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1262 for (int32_t i = 1; i < 5; ++i) {
1263 DisplayListBuilder builder;
1265 DlPathBuilder path_builder;
1266 path_builder.MoveTo(
DlPoint(100, 100));
1267 path_builder.LineTo(
DlPoint(100 + fi, 100 + fi));
1270 paint.setColor(DlColor::kChartreuse());
1271 auto blur_filter = DlImageFilter::MakeBlur(0.1, 0.1, DlTileMode::kClamp);
1272 paint.setImageFilter(blur_filter);
1274 builder.DrawPath(path_builder.TakePath(), paint);
1277 EXPECT_TRUE(image) <<
" length " << i;
1286 for (int32_t i = 1; i < 5; ++i) {
1287 DisplayListBuilder builder;
1292 DlRect::MakeXYWH(400, 400, clip_size.
width, clip_size.
height));
1295 paint.setColor(DlColor::kGreen());
1296 auto blur_filter = DlImageFilter::MakeBlur(0.1, 0.1, DlTileMode::kDecal);
1297 paint.setImageFilter(blur_filter);
1299 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
1303 EXPECT_TRUE(image) <<
" length " << i;
1308 CanRenderMultipleBackdropBlurWithSingleBackdropIdDifferentLayers) {
1311 DisplayListBuilder builder;
1314 builder.DrawImage(image,
DlPoint(50.0, 50.0),
1315 DlImageSampling::kNearestNeighbor, &paint);
1317 for (
int i = 0; i < 6; i++) {
1320 paint.setColor(DlColor::kWhite().withAlphaF(0.95));
1321 builder.SaveLayer(std::nullopt, &paint);
1324 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
1326 builder.ClipRoundRect(rrect);
1329 save_paint.setBlendMode(DlBlendMode::kSrc);
1330 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
1331 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
1340 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1344 DisplayListBuilder builder;
1345 builder.Scale(GetContentScale().
x, GetContentScale().y);
1347 std::vector<DlColor> colors = {DlColor(0xFFFF0000), DlColor(0xFF00FF00)};
1348 std::vector<Scalar> stops = {0.0, 1.0};
1350 auto gradient = DlColorSource::MakeLinear(
1351 {0, 0}, {400, 400}, 2, colors.data(), stops.data(), DlTileMode::kClamp);
1354 save_paint.setOpacity(0.5);
1355 builder.SaveLayer(std::nullopt, &save_paint);
1358 paint.setColorSource(gradient);
1359 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 1));
1360 builder.DrawRect(DlRect::MakeXYWH(100, 100, 200, 200), paint);
1364 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1373 auto callback = [&]() -> sk_sp<DisplayList> {
1374 DisplayListBuilder builder;
1378 Scalar offset = amp * sin(freq * 2.0 * M_PI * count / 60.0);
1382 paint.setColor(DlColor::kCornflowerBlue());
1383 builder.DrawCircle(
DlPoint(100 + offset, 100), 50, paint);
1384 paint.setColor(DlColor::kGreenYellow());
1385 builder.DrawCircle(
DlPoint(300, 200 + offset), 100, paint);
1386 paint.setColor(DlColor::kDarkMagenta());
1387 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
1388 paint.setColor(DlColor::kOrangeRed());
1389 builder.DrawCircle(
DlPoint(180 + offset, 120 + offset), 100, paint);
1392 auto backdrop_filter1 = DlImageFilter::MakeBlur(15, 15, DlTileMode::kClamp);
1393 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter1.get());
1396 DlPaint transparent_paint;
1397 transparent_paint.setColor(DlColor::kWhite().withAlpha(0.1 * 255));
1398 builder.DrawPaint(transparent_paint);
1402 auto backdrop_filter2 =
1403 DlImageFilter::MakeBlur(10, 10, DlTileMode::kClamp);
1405 builder.ClipRect(DlRect::MakeXYWH(150, 150, 300, 300));
1406 builder.SaveLayer(std::nullopt,
nullptr, backdrop_filter2.get());
1414 return builder.Build();
1416 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