From fae0508600a02942f536de18ccfb707058cf8875 Mon Sep 17 00:00:00 2001 From: Brandon DeRosier Date: Fri, 19 May 2023 03:59:24 -0700 Subject: [PATCH] [Impeller] Limit blur kernel to 1000x1000px --- impeller/aiks/aiks_unittests.cc | 16 ++++++++++++++++ .../filters/gaussian_blur_filter_contents.cc | 3 ++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index f298e6caea2cb..50d1083bf1f99 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -2286,6 +2286,22 @@ TEST_P(AiksTest, CanRenderBackdropBlur) { ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); } +TEST_P(AiksTest, CanRenderBackdropBlurHugeSigma) { + Canvas canvas; + canvas.DrawCircle({400, 400}, 300, {.color = Color::Green()}); + canvas.SaveLayer({.blend_mode = BlendMode::kSource}, std::nullopt, + [](const FilterInput::Ref& input, + const Matrix& effect_transform, bool is_subpass) { + return FilterContents::MakeGaussianBlur( + input, Sigma(999999), Sigma(999999), + FilterContents::BlurStyle::kNormal, + Entity::TileMode::kClamp, effect_transform); + }); + canvas.Restore(); + + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + // Regression test for https://github.com/flutter/flutter/issues/126701 . TEST_P(AiksTest, CanRenderClippedRuntimeEffects) { if (GetParam() != PlaygroundBackend::kMetal) { diff --git a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc index d565414006682..0226507dbc8b6 100644 --- a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc +++ b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc @@ -101,7 +101,8 @@ std::optional DirectionalGaussianBlurFilterContents::RenderFilter( return std::nullopt; } - auto radius = Radius{blur_sigma_}.radius; + // Limit the kernel size to 1000x1000 pixels, like Skia does. + auto radius = std::min(Radius{blur_sigma_}.radius, 500.0f); // Input 0 snapshot.