diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index 53b326e6b661e..f0774d436827b 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -1951,6 +1951,22 @@ TEST_P(AiksTest, CanRenderTinyOverlappingSubpasses) { 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 49350b66941b1..2bd5fe9d1fc2b 100644 --- a/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc +++ b/impeller/entity/contents/filters/gaussian_blur_filter_contents.cc @@ -98,6 +98,8 @@ std::optional DirectionalGaussianBlurFilterContents::RenderFilter( return std::nullopt; } + // Limit the kernel size to 1000x1000 pixels, like Skia does. + auto radius = std::min(Radius{blur_sigma_}.radius, 500.0f); // Input 0 snapshot. auto input_snapshot = inputs[0]->GetSnapshot(renderer, entity); @@ -111,8 +113,6 @@ std::optional DirectionalGaussianBlurFilterContents::RenderFilter( entity.GetStencilDepth()); // No blur to render. } - auto radius = Radius{blur_sigma_}.radius; - auto transform = entity.GetTransformation() * effect_transform.Basis(); auto transformed_blur_radius = transform.TransformDirection(blur_direction_ * radius); @@ -337,7 +337,7 @@ std::optional DirectionalGaussianBlurFilterContents::GetFilterCoverage( auto transform = inputs[0]->GetTransform(entity) * effect_transform.Basis(); auto transformed_blur_vector = - transform.TransformDirection(blur_direction_* Radius{blur_sigma_}.radius) + transform.TransformDirection(blur_direction_ * Radius{blur_sigma_}.radius) .Abs(); auto extent = coverage->size + transformed_blur_vector * 2; return Rect(coverage->origin - transformed_blur_vector,