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 "include/core/SkRRect.h"
24 #include "include/core/SkRect.h"
25 #include "third_party/imgui/imgui.h"
40 DisplayListBuilder builder;
41 builder.Scale(GetContentScale().
x, GetContentScale().y);
43 std::vector<float> sigmas = {0.0, 0.01, 1.0};
44 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
46 for (uint32_t i = 0; i < sigmas.size(); ++i) {
48 paint.setColor(colors[i]);
50 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
53 builder.Translate(100 + (i * 100), 100);
55 SkRRect::MakeRectXY(SkRect::MakeXYWH(0, 0, 60.0f, 160.0f), 50, 100);
56 builder.DrawRRect(rrect, paint);
60 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
66 DisplayListBuilder builder;
67 builder.Scale(content_Scale.
x, content_Scale.
y);
69 DlPaint background_paint;
70 background_paint.setColor(DlColor(1, 0.1, 0.1, 0.1, DlColorSpace::kSRGB));
71 builder.DrawPaint(background_paint);
73 std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kBlue()};
74 std::vector<Scalar> stops = {0.0, 1.0};
77 paint.setMaskFilter(DlBlurMaskFilter::Make(style, sigma));
78 auto gradient = DlColorSource::MakeLinear(
79 {0, 0}, {200, 200}, 2, colors.data(), stops.data(), DlTileMode::kClamp);
80 paint.setColorSource(gradient);
81 paint.setColor(DlColor::kWhite());
82 paint.setDrawStyle(DlDrawStyle::kStroke);
83 paint.setStrokeWidth(20);
86 builder.Translate(100, 100);
90 line_paint.setColor(DlColor::kWhite());
91 builder.DrawLine(SkPoint{100, 0}, SkPoint{100, 60}, line_paint);
92 builder.DrawLine(SkPoint{0, 30}, SkPoint{200, 30}, line_paint);
96 SkRRect::MakeRectXY(SkRect::MakeXYWH(0, 0, 200.0f, 60.0f), 50, 100);
97 builder.DrawRRect(rrect, paint);
100 return builder.Build();
106 GetContentScale(), 10, DlBlurStyle::kNormal)));
111 GetContentScale(), 0, DlBlurStyle::kNormal)));
116 GetContentScale(), 10, DlBlurStyle::kOuter)));
121 GetContentScale(), 10, DlBlurStyle::kInner)));
126 GetContentScale(), 10, DlBlurStyle::kSolid)));
130 DisplayListBuilder builder;
131 builder.Scale(GetContentScale().
x, GetContentScale().y);
133 std::vector<float> sigmas = {0.0, 0.01, 1.0};
134 std::vector<DlColor> colors = {DlColor::kGreen(), DlColor::kYellow(),
136 for (uint32_t i = 0; i < sigmas.size(); ++i) {
138 paint.setColor(colors[i]);
140 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigmas[i]));
143 builder.Translate(100 + (i * 100), 100);
145 SkRRect::MakeRectXY(SkRect::MakeXYWH(0, 0, 100.0f, 100.0f), 100, 100);
146 builder.DrawRRect(rrect, paint);
150 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
154 DisplayListBuilder builder;
157 paint.setColor(DlColor::kGreen());
158 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 99999));
159 builder.DrawCircle(SkPoint{400, 400}, 300, paint);
162 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
168 DisplayListBuilder builder;
169 builder.ClipRect(SkRect::MakeXYWH(100, 150, 400, 400));
172 paint.setColor(DlColor::kWhite());
176 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
177 paint.setColorFilter(
178 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kSrc));
179 builder.DrawCircle(SkPoint{400, 400}, 200, paint);
181 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
187 DisplayListBuilder builder;
188 builder.ClipRect(SkRect::MakeXYWH(100, 150, 400, 400));
192 DlColor::RGBA(128.0f / 255.0f, 128.0f / 255.0f, 128.0f / 255.0f, 1.0f));
196 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
197 paint.setColorFilter(
198 DlColorFilter::MakeBlend(DlColor::kGreen(), DlBlendMode::kColor));
199 builder.DrawCircle(SkPoint{400, 400}, 200, paint);
202 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
206 auto callback = [&]() -> sk_sp<DisplayList> {
211 DisplayListBuilder builder;
213 paint.setColor(DlColor::kCornflowerBlue());
214 builder.DrawCircle(SkPoint{100, 100}, 50, paint);
216 paint.setColor(DlColor::kGreenYellow());
217 builder.DrawCircle(SkPoint{300, 200}, 100, paint);
219 paint.setColor(DlColor::kDarkMagenta());
220 builder.DrawCircle(SkPoint{140, 170}, 75, paint);
222 paint.setColor(DlColor::kOrangeRed());
223 builder.DrawCircle(SkPoint{180, 120}, 100, paint);
226 SkRRect::MakeRectXY(SkRect::MakeLTRB(a.x, a.y,
b.x,
b.y), 20, 20);
227 builder.ClipRRect(rrect);
230 save_paint.setBlendMode(DlBlendMode::kSrc);
232 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
233 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
236 return builder.Build();
239 ASSERT_TRUE(OpenPlaygroundHere(callback));
243 DisplayListBuilder builder;
246 paint.setColor(DlColor::kCornflowerBlue());
247 builder.DrawCircle(SkPoint{100, 100}, 50, paint);
249 paint.setColor(DlColor::kGreenYellow());
250 builder.DrawCircle(SkPoint{300, 200}, 100, paint);
252 paint.setColor(DlColor::kDarkMagenta());
253 builder.DrawCircle(SkPoint{140, 170}, 75, paint);
255 paint.setColor(DlColor::kOrangeRed());
256 builder.DrawCircle(SkPoint{180, 120}, 100, paint);
259 SkRRect::MakeRectXY(SkRect::MakeLTRB(75, 50, 375, 275), 20, 20);
260 builder.ClipRRect(rrect);
263 save_paint.setBlendMode(DlBlendMode::kSrc);
264 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
265 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
268 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
274 DisplayListBuilder builder;
277 builder.DrawImage(image, SkPoint::Make(50.0, 50.0),
278 DlImageSampling::kNearestNeighbor, &paint);
281 SkRRect::MakeRectXY(SkRect::MakeXYWH(50, 250, 100, 100), 20, 20);
283 builder.ClipRRect(rrect);
286 save_paint.setBlendMode(DlBlendMode::kSrc);
287 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
288 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get(),
293 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
299 DisplayListBuilder builder;
302 builder.DrawImage(image, SkPoint::Make(50.0, 50.0),
303 DlImageSampling::kNearestNeighbor, &paint);
305 for (
int i = 0; i < 6; i++) {
306 SkRRect rrect = SkRRect::MakeRectXY(
307 SkRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
309 builder.ClipRRect(rrect);
312 save_paint.setBlendMode(DlBlendMode::kSrc);
313 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
314 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get(),
320 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
324 CanRenderMultipleBackdropBlurWithSingleBackdropIdAndDistinctFilters) {
327 DisplayListBuilder builder;
330 builder.DrawImage(image, SkPoint::Make(50.0, 50.0),
331 DlImageSampling::kNearestNeighbor, &paint);
333 for (
int i = 0; i < 6; i++) {
334 SkRRect rrect = SkRRect::MakeRectXY(
335 SkRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
337 builder.ClipRRect(rrect);
340 save_paint.setBlendMode(DlBlendMode::kSrc);
341 auto backdrop_filter =
342 DlImageFilter::MakeBlur(30 + i, 30, DlTileMode::kClamp);
343 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get(),
349 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
353 DisplayListBuilder builder;
356 paint.setColor(DlColor::kGreen());
357 builder.DrawCircle(SkPoint{400, 400}, 300, paint);
360 save_paint.setBlendMode(DlBlendMode::kSrc);
362 auto backdrop_filter =
363 DlImageFilter::MakeBlur(999999, 999999, DlTileMode::kClamp);
364 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
367 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
371 DisplayListBuilder builder;
372 builder.ClipRect(SkRect::MakeXYWH(100, 150, 400, 400));
375 paint.setColor(DlColor::kGreen());
376 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
377 builder.DrawCircle(SkPoint{400, 400}, 200, paint);
380 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
384 auto callback = [&]() -> sk_sp<DisplayList> {
389 DisplayListBuilder builder;
390 auto location = point -
Point(400, 400);
391 builder.Translate(location.x, location.y);
396 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
397 paint.setColor(DlColor::kRed());
399 SkPath path =
SkPath::Rect(SkRect::MakeLTRB(0, 0, 800, 800));
400 path.addCircle(0, 0, 0.5);
401 builder.DrawPath(path, paint);
402 return builder.Build();
404 ASSERT_TRUE(OpenPlaygroundHere(callback));
408 DisplayListBuilder builder;
409 builder.Translate(0, -400);
414 DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma.
sigma));
415 paint.setColor(DlColor::kRed());
417 SkPath path =
SkPath::Rect(SkRect::MakeLTRB(0, 0, 800, 800));
418 path.addCircle(0, 0, 0.5);
419 builder.DrawPath(path, paint);
421 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
425 DisplayListBuilder builder;
427 paint.setColor(DlColor::kBlue());
428 builder.DrawRect(SkRect::MakeXYWH(0, 0, 600.0, 600.0), paint);
431 clear.setBlendMode(DlBlendMode::kClear);
432 clear.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 20));
434 builder.DrawCircle(SkPoint{300.0, 300.0}, 200.0, clear);
436 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
441 auto callback = [&]() -> sk_sp<DisplayList> {
443 ImGuiWindowFlags_AlwaysAutoResize)) {
444 ImGui::SliderFloat(
"Sigma", &sigma, 0, 50);
447 DisplayListBuilder builder;
448 builder.Scale(GetContentScale().
x, GetContentScale().y);
449 builder.DrawPaint({});
452 paint.setColor(DlColor::kGreen());
453 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
455 builder.DrawRect(SkRect::MakeXYWH(300, 300, 200, 200), paint);
456 return builder.Build();
459 ASSERT_TRUE(OpenPlaygroundHere(callback));
463 DisplayListBuilder builder;
466 paint.setColor(DlColor::kBlue());
467 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 0));
469 builder.DrawCircle(SkPoint{300, 300}, 200, paint);
470 builder.DrawRect(SkRect::MakeLTRB(100, 300, 500, 600), paint);
472 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
477 EXPECT_EQ(GetContext()->GetCapabilities()->GetDefaultColorFormat(),
480 DisplayListBuilder builder;
481 builder.DrawColor(DlColor::kWhite(), DlBlendMode::kSrc);
484 paint.setColor(DlColor::kBlue());
485 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, 10));
488 builder.DrawRect(DlRect::MakeLTRB(100, 250, 500, 250), paint);
490 builder.DrawRect(DlRect::MakeLTRB(100, 300, 500, 600), paint);
492 builder.DrawRect(DlRect::MakeLTRB(550, 300, 550, 600), paint);
494 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
498 DlBlurStyle style = DlBlurStyle::kNormal;
502 bool invert_colors =
false;
503 DlBlendMode blend_mode = DlBlendMode::kSrcOver;
509 DisplayListBuilder builder;
512 builder.Scale(0.8f, 0.8f);
513 builder.Translate(50.f, 50.f);
519 builder.DrawPaint(draw_paint);
522 paint.setMaskFilter(DlBlurMaskFilter::Make(config.
style, config.
sigma));
528 const Scalar radius = 20.0f;
529 const Scalar y_spacing = 100.0f;
533 paint.setColor(DlColor::kCrimson().withAlpha(alpha));
534 builder.DrawRect(SkRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
535 radius, 60.0f - radius),
539 paint.setColor(DlColor::kBlue().withAlpha(alpha));
540 builder.DrawCircle(SkPoint{
x + 25, y + 25}, radius, paint);
543 paint.setColor(DlColor::kGreen().withAlpha(alpha));
544 builder.DrawOval(SkRect::MakeXYWH(
x + 25 - radius / 2, y + radius / 2,
545 radius, 60.0f - radius),
549 paint.setColor(DlColor::kPurple().withAlpha(alpha));
551 SkRRect::MakeRectXY(SkRect::MakeXYWH(
x, y, 60.0f, 60.0f), radius, radius);
552 builder.DrawRRect(rrect, paint);
555 paint.setColor(DlColor::kOrange().withAlpha(alpha));
558 SkRRect::MakeRectXY(SkRect::MakeXYWH(
x, y, 60.0f, 60.0f), radius, 5.0);
559 builder.DrawRRect(rrect, paint);
562 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
566 path.moveTo(
x + 0, y + 60);
567 path.lineTo(
x + 30, y + 0);
568 path.lineTo(
x + 60, y + 60);
571 builder.DrawPath(path, paint);
575 paint.setColor(DlColor::kMaroon().withAlpha(alpha));
578 path.addArc(SkRect::MakeXYWH(
x + 5, y, 50, 50), 90, 180);
579 path.addArc(SkRect::MakeXYWH(
x + 25, y, 50, 50), 90, 180);
581 builder.DrawPath(path, paint);
584 return builder.Build();
589 {
"NormalTranslucentZeroSigma",
590 {.style = DlBlurStyle::kNormal, .sigma = 0.0f, .alpha = 0.5f}},
592 {
"NormalTranslucent",
593 {.style = DlBlurStyle::kNormal, .sigma = 8.0f, .alpha = 0.5f}},
596 {.style = DlBlurStyle::kSolid, .sigma = 8.0f, .alpha = 0.5f}},
598 {
"SolidOpaque", {.style = DlBlurStyle::kSolid, .sigma = 8.0f}},
600 {
"SolidTranslucentWithFilters",
601 {.style = DlBlurStyle::kSolid,
604 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp),
605 .invert_colors =
true}},
607 {
"SolidTranslucentExclusionBlend",
608 {.style = DlBlurStyle::kSolid,
611 .blend_mode = DlBlendMode::kExclusion}},
614 {.style = DlBlurStyle::kInner, .sigma = 8.0f, .alpha = 0.5f}},
616 {
"InnerTranslucentWithBlurImageFilter",
617 {.style = DlBlurStyle::kInner,
620 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}},
623 {.style = DlBlurStyle::kOuter, .sigma = 8.0f, .alpha = 0.5f}},
625 {
"OuterOpaqueWithBlurImageFilter",
626 {.style = DlBlurStyle::kOuter,
628 .image_filter = DlImageFilter::MakeBlur(3, 3, DlTileMode::kClamp)}},
631 #define MASK_BLUR_VARIANT_TEST(config) \
632 TEST_P(AiksTest, MaskBlurVariantTest##config) { \
633 ASSERT_TRUE(OpenPlaygroundHere( \
634 MaskBlurVariantTest(*this, kPaintVariations.at(#config)))); \
648 #undef MASK_BLUR_VARIANT_TEST
651 DisplayListBuilder builder;
652 builder.Scale(GetContentScale().
x, GetContentScale().y);
655 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1));
656 builder.DrawPaint(paint);
658 paint.setColor(DlColor::kGreen());
659 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
662 path.moveTo(200, 200);
663 path.lineTo(300, 400);
664 path.lineTo(100, 400);
667 builder.DrawPath(path, paint);
671 red.setColor(DlColor::kRed());
672 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
674 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
678 DisplayListBuilder builder;
679 builder.Scale(GetContentScale().
x, GetContentScale().y);
682 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
683 builder.DrawPaint(paint);
685 paint.setColor(DlColor::kGreen());
686 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
689 path.moveTo(200, 200);
690 path.lineTo(300, 400);
691 path.lineTo(100, 400);
694 builder.DrawPath(path, paint);
698 red.setColor(DlColor::kRed());
699 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
701 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
705 DisplayListBuilder builder;
706 builder.Scale(GetContentScale().
x, GetContentScale().y);
709 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
710 builder.DrawPaint(paint);
712 paint.setColor(DlColor::kGreen());
713 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
716 path.moveTo(200, 200);
717 path.lineTo(300, 400);
718 path.lineTo(100, 400);
721 builder.DrawPath(path, paint);
725 red.setColor(DlColor::kRed());
726 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
728 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
733 auto callback = [&]() -> sk_sp<DisplayList> {
735 ImGuiWindowFlags_AlwaysAutoResize)) {
736 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
740 DisplayListBuilder builder;
741 builder.Scale(GetContentScale().
x, GetContentScale().y);
744 paint.setColor(DlColor::kGreen());
745 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
749 SkPoint{200, 200}, DlImageSampling::kNearestNeighbor, &paint);
752 red.setColor(DlColor::kRed());
753 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
755 return builder.Build();
757 ASSERT_TRUE(OpenPlaygroundHere(callback));
762 auto callback = [&]() -> sk_sp<DisplayList> {
764 ImGuiWindowFlags_AlwaysAutoResize)) {
765 ImGui::SliderFloat(
"Sigma", &sigma, 0, 500);
769 DisplayListBuilder builder;
770 builder.Scale(GetContentScale().
x, GetContentScale().y);
773 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
774 builder.DrawPaint(paint);
776 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
778 builder.Transform(SkMatrix::Translate(100, 100) *
779 SkMatrix::Scale(0.5, 0.5));
781 paint.setColorSource(DlColorSource::MakeImage(
783 DlImageSampling::kMipmapLinear));
784 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kNormal, sigma));
786 builder.DrawRect(SkRect::MakeXYWH(0, 0, boston->GetSize().width,
787 boston->GetSize().height),
790 return builder.Build();
792 ASSERT_TRUE(OpenPlaygroundHere(callback));
796 DisplayListBuilder builder;
799 builder.Scale(GetContentScale().
x, GetContentScale().y);
801 paint.setColor(DlColor::kLimeGreen());
802 SkRRect rrect = SkRRect::MakeRectXY(
803 SkRect::MakeLTRB(0, 0, GetWindowSize().width, 100), 10, 10);
804 builder.DrawRRect(rrect, paint);
806 paint.setColor(DlColor::kMagenta());
807 rrect = SkRRect::MakeRectXY(
808 SkRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
809 builder.DrawRRect(rrect, paint);
810 builder.ClipRect(SkRect::MakeLTRB(100, 0, 200, GetWindowSize().height));
813 save_paint.setBlendMode(DlBlendMode::kSrc);
815 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
817 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
820 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
824 DisplayListBuilder builder;
826 builder.Scale(GetContentScale().
x, GetContentScale().y);
827 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
828 builder.DrawImageRect(
830 SkRect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height),
831 SkRect::MakeLTRB(0, 0, GetWindowSize().width, 100),
832 DlImageSampling::kNearestNeighbor);
835 paint.setColor(DlColor::kMagenta());
837 SkRRect rrect = SkRRect::MakeRectXY(
838 SkRect::MakeLTRB(0, 110, GetWindowSize().width, 210), 10, 10);
839 builder.DrawRRect(rrect, paint);
840 builder.ClipRect(SkRect::MakeLTRB(0, 50, GetWindowSize().width, 150));
843 save_paint.setBlendMode(DlBlendMode::kSrc);
845 auto backdrop_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kClamp);
846 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get());
849 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
858 CreateTextureForFixture(
"boston.jpg",
true);
864 auto callback = [&]() -> sk_sp<DisplayList> {
866 ImGuiWindowFlags_AlwaysAutoResize)) {
867 ImGui::SliderFloat(
"Sigma", &sigma, 0, 200);
868 ImGui::SliderFloat(
"Frequency", &freq, 0.01, 2.0);
869 ImGui::SliderFloat(
"Amplitude", &, 1, 100);
873 DisplayListBuilder builder;
874 builder.Scale(GetContentScale().
x, GetContentScale().y);
875 Scalar y = amp * sin(freq * 2.0 * M_PI * count / 60);
878 SkPoint::Make(1024 / 2 - boston->GetSize().width / 2,
879 (768 / 2 - boston->GetSize().height / 2) + y),
880 DlImageSampling::kMipmapLinear);
886 SkRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
887 builder.ClipRect(SkRect::MakeLTRB(100, 100, 900, 700));
890 paint.setBlendMode(DlBlendMode::kSrc);
892 auto backdrop_filter =
893 DlImageFilter::MakeBlur(sigma, sigma, DlTileMode::kClamp);
894 builder.SaveLayer(
nullptr, &paint, backdrop_filter.get());
896 return builder.Build();
898 ASSERT_TRUE(OpenPlaygroundHere(callback));
902 DisplayListBuilder builder;
904 builder.Scale(GetContentScale().
x, GetContentScale().y);
907 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
908 builder.DrawPaint(paint);
910 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
911 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
912 std::vector<Scalar> stops = {0.0, 1.0};
915 paint.setColorSource(DlColorSource::MakeLinear(
921 DlTileMode::kMirror));
922 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kInner, 30));
925 path.moveTo(200, 200);
926 path.lineTo(300, 400);
927 path.lineTo(100, 400);
929 builder.DrawPath(path, paint);
933 red.setColor(DlColor::kRed());
934 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
936 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
940 DisplayListBuilder builder;
941 builder.Scale(GetContentScale().
x, GetContentScale().y);
944 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
945 builder.DrawPaint(paint);
947 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
948 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
949 std::vector<Scalar> stops = {0.0, 1.0};
952 paint.setColorSource(DlColorSource::MakeLinear(
958 DlTileMode::kMirror));
959 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kSolid, 30));
962 path.moveTo(200, 200);
963 path.lineTo(300, 400);
964 path.lineTo(100, 400);
966 builder.DrawPath(path, paint);
970 red.setColor(DlColor::kRed());
971 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
972 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
976 DisplayListBuilder builder;
977 builder.Scale(GetContentScale().
x, GetContentScale().y);
980 paint.setColor(DlColor::RGBA(0.1, 0.1, 0.1, 1.0));
981 builder.DrawPaint(paint);
983 std::vector<DlColor> colors = {DlColor::RGBA(0.9568, 0.2627, 0.2118, 1.0),
984 DlColor::RGBA(0.7568, 0.2627, 0.2118, 1.0)};
985 std::vector<Scalar> stops = {0.0, 1.0};
988 paint.setColorSource(DlColorSource::MakeLinear(
994 DlTileMode::kMirror));
995 paint.setMaskFilter(DlBlurMaskFilter::Make(DlBlurStyle::kOuter, 30));
998 path.moveTo(200, 200);
999 path.lineTo(300, 400);
1000 path.lineTo(100, 400);
1002 builder.DrawPath(path, paint);
1006 red.setColor(DlColor::kRed());
1007 builder.DrawRect(SkRect::MakeXYWH(0, 0, 200, 200), red);
1008 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1012 DisplayListBuilder builder;
1013 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1015 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1019 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
1021 Vector2 clip_size = {150, 75};
1023 builder.Scale(GetContentScale().
x, GetContentScale().y);
1027 builder.ClipRect(SkRect::MakeLTRB(rect.GetLeft(), rect.GetTop(),
1028 rect.GetRight(), rect.GetBottom()));
1029 builder.Translate(center.
x, center.
y);
1030 builder.Scale(0.6, 0.6);
1032 SkRect sk_bounds = SkRect::MakeLTRB(bounds.
GetLeft(), bounds.
GetTop(),
1034 Rect dest = bounds.
Shift(-image_center);
1035 SkRect sk_dst = SkRect::MakeLTRB(dest.
GetLeft(), dest.
GetTop(),
1038 sk_dst, DlImageSampling::kNearestNeighbor,
1041 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1045 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1047 auto callback = [&]() -> sk_sp<DisplayList> {
1048 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1049 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1050 DlTileMode::kMirror, DlTileMode::kDecal};
1052 static float rotation = 0;
1053 static float scale = 0.6;
1054 static int selected_tile_mode = 3;
1057 ImGuiWindowFlags_AlwaysAutoResize)) {
1058 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1059 ImGui::SliderFloat(
"Scale", &
scale, 0, 2.0);
1060 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1061 sizeof(tile_mode_names) /
sizeof(
char*));
1065 DisplayListBuilder builder;
1067 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1070 paint.setImageFilter(
1071 DlImageFilter::MakeBlur(20, 20, tile_modes[selected_tile_mode]));
1078 builder.Scale(GetContentScale().
x, GetContentScale().y);
1080 SkRect::MakeLTRB(handle_a.x, handle_a.y, handle_b.x, handle_b.y));
1081 builder.Translate(center.
x, center.
y);
1083 builder.
Rotate(rotation);
1085 SkRect sk_bounds = SkRect::MakeLTRB(bounds.
GetLeft(), bounds.
GetTop(),
1087 Rect dest = bounds.
Shift(-image_center);
1088 SkRect sk_dst = SkRect::MakeLTRB(dest.
GetLeft(), dest.
GetTop(),
1091 sk_dst, DlImageSampling::kNearestNeighbor,
1093 return builder.Build();
1096 ASSERT_TRUE(OpenPlaygroundHere(callback));
1100 DisplayListBuilder builder;
1102 builder.Scale(GetContentScale().
x, GetContentScale().y);
1103 builder.Scale(0.5, 0.5);
1105 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1109 paint.setBlendMode(DlBlendMode::kSrc);
1111 auto backdrop_filter = DlImageFilter::MakeBlur(50, 0, DlTileMode::kClamp);
1112 builder.SaveLayer(
nullptr, &paint, backdrop_filter.get());
1114 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1122 DisplayListBuilder builder;
1124 std::shared_ptr<Texture> boston = CreateTextureForFixture(
"boston.jpg");
1126 Rect::MakeXYWH(0, 0, boston->GetSize().width, boston->GetSize().height);
1129 paint.setImageFilter(DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal));
1132 Vector2 clip_size = {150, 75};
1134 builder.Scale(GetContentScale().
x, GetContentScale().y);
1138 builder.ClipRect(SkRect::MakeLTRB(clip_bounds.GetLeft(), clip_bounds.GetTop(),
1139 clip_bounds.GetRight(),
1140 clip_bounds.GetBottom()));
1141 builder.Translate(center.
x, center.
y);
1142 builder.Scale(0.6, 0.6);
1145 auto dst_rect = bounds.
Shift(-image_center);
1146 builder.DrawImageRect(
1151 SkRect::MakeLTRB(dst_rect.GetLeft(), dst_rect.GetTop(),
1152 dst_rect.GetRight(), dst_rect.GetBottom()),
1153 DlImageSampling::kMipmapLinear, &paint);
1155 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1159 auto callback = [&]() -> sk_sp<DisplayList> {
1160 const char* tile_mode_names[] = {
"Clamp",
"Repeat",
"Mirror",
"Decal"};
1161 const DlTileMode tile_modes[] = {DlTileMode::kClamp, DlTileMode::kRepeat,
1162 DlTileMode::kMirror, DlTileMode::kDecal};
1164 static float rotation = 45;
1165 static float scale = 0.6;
1166 static int selected_tile_mode = 3;
1169 ImGuiWindowFlags_AlwaysAutoResize)) {
1170 ImGui::SliderFloat(
"Rotation (degrees)", &rotation, -180, 180);
1171 ImGui::SliderFloat(
"Scale", &
scale, 0, 2.0);
1172 ImGui::Combo(
"Tile mode", &selected_tile_mode, tile_mode_names,
1173 sizeof(tile_mode_names) /
sizeof(
char*));
1177 DisplayListBuilder builder;
1180 paint.setColor(DlColor::kGreen());
1181 paint.setImageFilter(
1182 DlImageFilter::MakeBlur(50, 0, tile_modes[selected_tile_mode]));
1185 builder.Scale(GetContentScale().
x, GetContentScale().y);
1186 builder.Translate(center.
x, center.
y);
1188 builder.
Rotate(rotation);
1191 SkRRect::MakeRectXY(SkRect::MakeXYWH(-100, -100, 200, 200), 10, 10);
1192 builder.DrawRRect(rrect, paint);
1193 return builder.Build();
1196 ASSERT_TRUE(OpenPlaygroundHere(callback));
1200 DisplayListBuilder builder;
1201 builder.Scale(GetContentScale().
x, GetContentScale().y);
1203 auto paint_lines = [&builder](
Scalar dx,
Scalar dy, DlPaint paint) {
1204 auto draw_line = [&builder, &paint](SkPoint a, SkPoint
b) {
1205 SkPath line = SkPath::Line(a,
b);
1206 builder.DrawPath(line, paint);
1208 paint.setStrokeWidth(5);
1209 paint.setDrawStyle(DlDrawStyle::kStroke);
1210 draw_line(SkPoint::Make(dx + 100, dy + 100),
1211 SkPoint::Make(dx + 200, dy + 200));
1212 draw_line(SkPoint::Make(dx + 100, dy + 200),
1213 SkPoint::Make(dx + 200, dy + 100));
1214 draw_line(SkPoint::Make(dx + 150, dy + 100),
1215 SkPoint::Make(dx + 200, dy + 150));
1216 draw_line(SkPoint::Make(dx + 100, dy + 150),
1217 SkPoint::Make(dx + 150, dy + 200));
1221 DisplayListBuilder recorder_builder;
1222 for (
int x = 0;
x < 5; ++
x) {
1223 for (
int y = 0; y < 5; ++y) {
1224 SkRect rect = SkRect::MakeXYWH(
x * 20, y * 20, 20, 20);
1226 paint.setColor(((
x + y) & 1) == 0 ? DlColor::kYellow()
1227 : DlColor::kBlue());
1229 recorder_builder.DrawRect(rect, paint);
1235 auto image_source = DlColorSource::MakeImage(
1237 auto blur_filter = DlImageFilter::MakeBlur(5, 5, DlTileMode::kDecal);
1240 paint.setColor(DlColor::kDarkGreen());
1241 builder.DrawRect(SkRect::MakeLTRB(0, 0, 300, 600), paint);
1243 paint.setColorSource(image_source);
1244 builder.DrawRect(SkRect::MakeLTRB(100, 100, 200, 200), paint);
1246 paint.setColorSource(
nullptr);
1247 paint.setColor(DlColor::kRed());
1248 builder.DrawRect(SkRect::MakeLTRB(300, 0, 600, 600), paint);
1250 paint.setColorSource(image_source);
1251 paint.setImageFilter(blur_filter);
1252 builder.DrawRect(SkRect::MakeLTRB(400, 100, 500, 200), paint);
1254 paint.setImageFilter(
nullptr);
1255 paint_lines(0, 300, paint);
1257 paint.setImageFilter(blur_filter);
1258 paint_lines(300, 300, paint);
1260 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1266 <<
"This backend doesn't yet support setting device capabilities.";
1268 if (!WillRenderSomething()) {
1272 GTEST_SKIP() <<
"This test requires playgrounds.";
1275 std::shared_ptr<const Capabilities> old_capabilities =
1276 GetContext()->GetCapabilities();
1277 auto mock_capabilities = std::make_shared<MockCapabilities>();
1278 EXPECT_CALL(*mock_capabilities, SupportsDecalSamplerAddressMode())
1279 .Times(::testing::AtLeast(1))
1280 .WillRepeatedly(::testing::Return(
false));
1281 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultColorFormat);
1282 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultStencilFormat);
1283 FLT_FORWARD(mock_capabilities, old_capabilities,
1284 GetDefaultDepthStencilFormat);
1285 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsOffscreenMSAA);
1286 FLT_FORWARD(mock_capabilities, old_capabilities,
1287 SupportsImplicitResolvingMSAA);
1288 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsReadFromResolve);
1289 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsFramebufferFetch);
1290 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsSSBO);
1291 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsCompute);
1292 FLT_FORWARD(mock_capabilities, old_capabilities,
1293 SupportsTextureToTextureBlits);
1294 FLT_FORWARD(mock_capabilities, old_capabilities, GetDefaultGlyphAtlasFormat);
1295 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsTriangleFan);
1296 FLT_FORWARD(mock_capabilities, old_capabilities, SupportsPrimitiveRestart);
1297 ASSERT_TRUE(SetCapabilities(mock_capabilities).ok());
1301 DisplayListBuilder builder;
1302 builder.Scale(GetContentScale().
x * 0.5, GetContentScale().y * 0.5);
1305 paint.setColor(DlColor::kBlack());
1306 builder.DrawPaint(paint);
1308 auto blur_filter = DlImageFilter::MakeBlur(20, 20, DlTileMode::kDecal);
1309 paint.setImageFilter(blur_filter);
1310 builder.DrawImage(texture, SkPoint::Make(200, 200), {}, &paint);
1311 ASSERT_TRUE(OpenPlaygroundHere(builder.Build()));
1320 for (int32_t i = 1; i < 5; ++i) {
1321 DisplayListBuilder builder;
1324 path.moveTo(100, 100);
1325 path.lineTo(100 + fi, 100 + fi);
1328 paint.setColor(DlColor::kChartreuse());
1329 auto blur_filter = DlImageFilter::MakeBlur(0.1, 0.1, DlTileMode::kClamp);
1330 paint.setImageFilter(blur_filter);
1332 builder.DrawPath(path, paint);
1335 EXPECT_TRUE(image) <<
" length " << i;
1344 for (int32_t i = 1; i < 5; ++i) {
1345 DisplayListBuilder builder;
1350 SkRect::MakeXYWH(400, 400, clip_size.
width, clip_size.
height));
1353 paint.setColor(DlColor::kGreen());
1354 auto blur_filter = DlImageFilter::MakeBlur(0.1, 0.1, DlTileMode::kDecal);
1355 paint.setImageFilter(blur_filter);
1357 builder.DrawCircle(SkPoint{400, 400}, 200, paint);
1361 EXPECT_TRUE(image) <<
" length " << i;
1366 CanRenderMultipleBackdropBlurWithSingleBackdropIdDifferentLayers) {
1369 DisplayListBuilder builder;
1372 builder.DrawImage(image, SkPoint::Make(50.0, 50.0),
1373 DlImageSampling::kNearestNeighbor, &paint);
1375 for (
int i = 0; i < 6; i++) {
1378 paint.setColor(DlColor::kWhite().withAlphaF(0.95));
1379 builder.SaveLayer(
nullptr, &paint);
1381 SkRRect rrect = SkRRect::MakeRectXY(
1382 SkRect::MakeXYWH(50 + (i * 100), 250, 100, 100), 20, 20);
1384 builder.ClipRRect(rrect);
1387 save_paint.setBlendMode(DlBlendMode::kSrc);
1388 auto backdrop_filter = DlImageFilter::MakeBlur(30, 30, DlTileMode::kClamp);
1389 builder.SaveLayer(
nullptr, &save_paint, backdrop_filter.get(),
1398 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)
static constexpr Color White()
static constexpr Color Red()
static constexpr Color AntiqueWhite()
static constexpr Color Green()
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