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"
18 #include "gmock/gmock.h"
22 #include "impeller/renderer/testing/mocks.h"
23 #include "third_party/imgui/imgui.h"
38 DisplayListBuilder builder;
39 builder.Scale(GetContentScale().
x, GetContentScale().y);
41 std::vector<float> sigmas = {0.0, 0.01, 1.0};
42 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
44 for (uint32_t i = 0; i < sigmas.size(); ++i) {
46 paint.setColor(colors[i]);
48 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
51 builder.Translate(100 + (i * 100), 100);
53 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 60.0f, 160.0f), 50, 100);
54 builder.DrawRoundRect(rrect, paint);
58 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
64 DisplayListBuilder builder;
65 builder.Scale(content_Scale.
x, content_Scale.
y);
67 DlPaint background_paint;
68 background_paint.setColor(DlColor(1, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
69 builder.DrawPaint(background_paint);
71 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue()};
72 std::vector<Scalar> stops = {0.0, 1.0};
75 paint.setMaskFilter(DlBlurMaskFilter::Make(style, sigma));
76 auto gradient = DlColorSource::MakeLinear(
77 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kClamp);
78 paint.setColorSource(gradient);
79 paint.setColor(DlColor::kWhite());
80 paint.setDrawStyle(DlDrawStyle::kStroke);
81 paint.setStrokeWidth(20);
84 builder.Translate(100, 100);
88 line_paint.setColor(DlColor::kWhite());
94 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(0, 0, 200.0f, 60.0f), 50, 100);
95 builder.DrawRoundRect(rrect, paint);
98 return builder.Build();
104 GetContentScale(), 10, DlBlurStyle::kNormal)));
109 GetContentScale(), 0, DlBlurStyle::kNormal)));
114 GetContentScale(), 10, DlBlurStyle::kOuter)));
119 GetContentScale(), 10, DlBlurStyle::kInner)));
124 GetContentScale(), 10, DlBlurStyle::kSolid)));
128 DisplayListBuilder builder;
129 builder.Scale(GetContentScale().
x, GetContentScale().y);
131 std::vector<float> sigmas = {0.0, 0.01, 1.0};
132 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
134 for (uint32_t i = 0; i < sigmas.size(); ++i) {
136 paint.setColor(colors[i]);
138 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
141 builder.Translate(100 + (i * 100), 100);
143 DlRect::MakeXYWH(0, 0, 100.0f, 100.0f), 100, 100);
144 builder.DrawRoundRect(rrect, paint);
148 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
152 DisplayListBuilder builder;
155 paint.setColor(DlColor::kGreen());
156 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 99999));
157 builder.DrawCircle(
DlPoint(400, 400), 300, paint);
160 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
166 DisplayListBuilder builder;
167 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
170 paint.setColor(DlColor::kWhite());
174 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
175 paint.setColorFilter(
176 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kSrc));
177 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
179 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
185 DisplayListBuilder builder;
186 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
190 DlColor::RGBA(128.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f));
194 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
195 paint.setColorFilter(
196 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kColor));
197 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
200 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
204 auto callback = [&]() -> sk_sp<DisplayList> {
209 DisplayListBuilder builder;
211 paint.setColor(DlColor::kCornflowerBlue());
212 builder.DrawCircle(
DlPoint(100, 100), 50, paint);
214 paint.setColor(DlColor::kGreenYellow());
215 builder.DrawCircle(
DlPoint(300, 200), 100, paint);
217 paint.setColor(DlColor::kDarkMagenta());
218 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
220 paint.setColor(DlColor::kOrangeRed());
221 builder.DrawCircle(
DlPoint(180, 120), 100, paint);
224 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(a.x, a.y,
b.x,
b.y), 20, 20);
225 builder.ClipRoundRect(rrect);
228 save_paint.setBlendMode(DlBlendMode::kSrc);
230 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
231 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
234 return builder.Build();
237 ASSERT_TRUE(OpenPlaygroundHere(callback));
241 DisplayListBuilder builder;
244 paint.setColor(DlColor::kCornflowerBlue());
245 builder.DrawCircle(
DlPoint(100, 100), 50, paint);
247 paint.setColor(DlColor::kGreenYellow());
248 builder.DrawCircle(
DlPoint(300, 200), 100, paint);
250 paint.setColor(DlColor::kDarkMagenta());
251 builder.DrawCircle(
DlPoint(140, 170), 75, paint);
253 paint.setColor(DlColor::kOrangeRed());
254 builder.DrawCircle(
DlPoint(180, 120), 100, paint);
257 DlRoundRect::MakeRectXY(DlRect::MakeLTRB(75, 50, 375, 275), 20, 20);
258 builder.ClipRoundRect(rrect);
261 save_paint.setBlendMode(DlBlendMode::kSrc);
262 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
263 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
266 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
272 DisplayListBuilder builder;
275 builder.DrawImage(image,
DlPoint(50.0, 50.0),
276 DlImageSampling::kNearestNeighbor, &paint);
279 DlRoundRect::MakeRectXY(DlRect::MakeXYWH(50, 250, 100, 100), 20, 20);
281 builder.ClipRoundRect(rrect);
284 save_paint.setBlendMode(DlBlendMode::kSrc);
285 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
286 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
291 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
297 DisplayListBuilder builder;
300 builder.DrawImage(image,
DlPoint(50.0, 50.0),
301 DlImageSampling::kNearestNeighbor, &paint);
303 for (
int i = 0; i < 6; i++) {
305 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
307 builder.ClipRoundRect(rrect);
310 save_paint.setBlendMode(DlBlendMode::kSrc);
311 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
312 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
318 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
322 CanRenderMultipleBackdropBlurWithSingleBackdropIdAndDistinctFilters) {
325 DisplayListBuilder builder;
328 builder.DrawImage(image,
DlPoint(50.0, 50.0),
329 DlImageSampling::kNearestNeighbor, &paint);
331 for (
int i = 0; i < 6; i++) {
333 DlRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
335 builder.ClipRoundRect(rrect);
338 save_paint.setBlendMode(DlBlendMode::kSrc);
339 auto backdrop_filter =
340 DlImageFilter::MakeBlur(30 + i, 30, DlTileMode::kClamp);
341 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get(),
347 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
351 DisplayListBuilder builder;
354 paint.setColor(DlColor::kGreen());
355 builder.DrawCircle(
DlPoint(400, 400), 300, paint);
358 save_paint.setBlendMode(DlBlendMode::kSrc);
360 auto backdrop_filter =
361 DlImageFilter::MakeBlur(999999, 999999, DlTileMode::kClamp);
362 builder.SaveLayer(std::nullopt, &save_paint, backdrop_filter.get());
365 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
369 DisplayListBuilder builder;
370 builder.ClipRect(DlRect::MakeXYWH(100, 150, 400, 400));
373 paint.setColor(DlColor::kGreen());
374 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
375 builder.DrawCircle(
DlPoint(400, 400), 200, paint);
378 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
382 auto callback = [&]() -> sk_sp<DisplayList> {
387 DisplayListBuilder builder;
388 auto location = point -
Point(400, 400);
389 builder.Translate(location.x, location.y);
394 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
395 paint.setColor(DlColor::kRed());
397 DlPath path = DlPath::MakeRect(DlRect::MakeLTRB(0, 0, 800, 800));
398 path = path + DlPath::MakeCircle(
DlPoint(0, 0), 0.5);
399 builder.DrawPath(path, paint);
400 return builder.Build();
402 ASSERT_TRUE(OpenPlaygroundHere(callback));
406 DisplayListBuilder builder;
407 builder.Translate(0, -400);
412 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
413 paint.setColor(DlColor::kRed());
415 DlPath path = DlPath::MakeRect(DlRect::MakeLTRB(0, 0, 800, 800));
416 path = path + DlPath::MakeCircle(
DlPoint(0, 0), 0.5);
417 builder.DrawPath(path, paint);
419 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
423 DisplayListBuilder builder;
425 paint.setColor(DlColor::kBlue());
426 builder.DrawRect(DlRect::MakeXYWH(0, 0, 600.0, 600.0), paint);
429 clear.setBlendMode(DlBlendMode::kClear);
430 clear.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
432 builder.DrawCircle(
DlPoint(300.0, 300.0), 200.0, clear);
434 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
439 auto callback = [&]() -> sk_sp<DisplayList> {
441 ImGuiWindowFlags_AlwaysAutoResize)) {
442 ImGui::SliderFloat(
"Sigma", &sigma, 0, 50);
445 DisplayListBuilder builder;
446 builder.Scale(GetContentScale().
x, GetContentScale().y);
447 builder.DrawPaint({});
450 paint.setColor(DlColor::kGreen());
451 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
453 builder.DrawRect(DlRect::MakeXYWH(300, 300, 200, 200), paint);
454 return builder.Build();
457 ASSERT_TRUE(OpenPlaygroundHere(callback));
461 DisplayListBuilder builder;
464 paint.setColor(DlColor::kBlue());
465 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 0));
467 builder.DrawCircle(
DlPoint(300, 300), 200, paint);
468 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
470 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
475 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
478 DisplayListBuilder builder;
479 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
482 paint.setColor(DlColor::kBlue());
483 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 10));
486 builder.DrawRect(DlRect::MakeLTRB(100, 250, 500, 250), paint);
488 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
490 builder.DrawRect(DlRect::MakeLTRB(550, 300, 550, 600), paint);
492 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
496 DlBlurStyle style = DlBlurStyle::kNormal;
500 bool invert_colors =
false;
501 DlBlendMode blend_mode = DlBlendMode::kSrcOver;
507 DisplayListBuilder builder;
510 builder.Scale(0.8f, 0.8f);
511 builder.Translate(50.f, 50.f);
517 builder.DrawPaint(draw_paint);
520 paint.setMaskFilter(DlBlurMaskFilter::Make(config.
style, config.
sigma));
526 const Scalar radius = 20.0f;
527 const Scalar y_spacing = 100.0f;
531 paint.setColor(DlColor::kCrimson().withAlpha(alpha));
532 builder.DrawRect(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
533 radius, 60.0f - radius),
537 paint.setColor(DlColor::kBlue().withAlpha(alpha));
538 builder.DrawCircle(
DlPoint{
x + 25, y + 25}, radius, paint);
541 paint.setColor(DlColor::kGreen().withAlpha(alpha));
542 builder.DrawOval(DlRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
543 radius, 60.0f - radius),
547 paint.setColor(DlColor::kPurple().withAlpha(alpha));
549 DlRect::MakeXYWH(
x, y, 60.0f, 60.0f), radius, radius);
550 builder.DrawRoundRect(rrect, paint);
553 paint.setColor(DlColor::kOrange().withAlpha(alpha));
555 rrect = DlRoundRect::MakeRectXY(DlRect::MakeXYWH(
x, y, 60.0f, 60.0f),
557 builder.DrawRoundRect(rrect, paint);
560 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
563 DlPathBuilder path_builder;
564 path_builder.MoveTo(
DlPoint(
x + 0, y + 60));
565 path_builder.LineTo(
DlPoint(
x + 30, y + 0));
566 path_builder.LineTo(
DlPoint(
x + 60, y + 60));
567 path_builder.Close();
569 builder.DrawPath(
DlPath(path_builder), paint);
573 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
579 builder.DrawPath(path, paint);
582 return builder.Build();
587 {
"NormalTranslucentZeroSigma",
588 {.style = DlBlurStyle::kNormal, .sigma = 0.0f, .alpha = 0.5f}},
590 {
"NormalTranslucent",
591 {.style = DlBlurStyle::kNormal, .sigma = 8.0f, .alpha = 0.5f}},
594 {.style = DlBlurStyle::kSolid, .sigma = 8.0f, .alpha = 0.5f}},
596 {
"SolidOpaque", {.style = DlBlurStyle::kSolid, .sigma = 8.0f}},
598 {
"SolidTranslucentWithFilters",
599 {.style = DlBlurStyle::kSolid,
602 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp),
603 .invert_colors =
true}},
605 {
"SolidTranslucentExclusionBlend",
606 {.style = DlBlurStyle::kSolid,
609 .blend_mode = DlBlendMode::kExclusion}},
612 {.style = DlBlurStyle::kInner, .sigma = 8.0f, .alpha = 0.5f}},
614 {
"InnerTranslucentWithBlurImageFilter",
615 {.style = DlBlurStyle::kInner,
618 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}},
621 {.style = DlBlurStyle::kOuter, .sigma = 8.0f, .alpha = 0.5f}},
623 {
"OuterOpaqueWithBlurImageFilter",
624 {.style = DlBlurStyle::kOuter,
626 .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(
DlPath(path_builder), 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(
DlPath(path_builder), 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(
DlPath(path_builder), 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(
DlPath(path_builder), 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(
DlPath(path_builder), 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(
DlPath(path_builder), 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);
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);
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(
DlPath(path_builder), 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()));
#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