Skip to content

Commit 3267fa2

Browse files
authored
[Impeller] Limit blur kernel to 1000x1000 pixels (flutter#42154)
Resolves flutter/flutter#127151. This is the same internal limit that Skia uses.
1 parent c94eb1d commit 3267fa2

2 files changed

Lines changed: 18 additions & 1 deletion

File tree

impeller/aiks/aiks_unittests.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2286,6 +2286,22 @@ TEST_P(AiksTest, CanRenderBackdropBlur) {
22862286
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
22872287
}
22882288

2289+
TEST_P(AiksTest, CanRenderBackdropBlurHugeSigma) {
2290+
Canvas canvas;
2291+
canvas.DrawCircle({400, 400}, 300, {.color = Color::Green()});
2292+
canvas.SaveLayer({.blend_mode = BlendMode::kSource}, std::nullopt,
2293+
[](const FilterInput::Ref& input,
2294+
const Matrix& effect_transform, bool is_subpass) {
2295+
return FilterContents::MakeGaussianBlur(
2296+
input, Sigma(999999), Sigma(999999),
2297+
FilterContents::BlurStyle::kNormal,
2298+
Entity::TileMode::kClamp, effect_transform);
2299+
});
2300+
canvas.Restore();
2301+
2302+
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
2303+
}
2304+
22892305
// Regression test for https://github.com/flutter/flutter/issues/126701 .
22902306
TEST_P(AiksTest, CanRenderClippedRuntimeEffects) {
22912307
if (GetParam() != PlaygroundBackend::kMetal) {

impeller/entity/contents/filters/gaussian_blur_filter_contents.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ std::optional<Entity> DirectionalGaussianBlurFilterContents::RenderFilter(
101101
return std::nullopt;
102102
}
103103

104-
auto radius = Radius{blur_sigma_}.radius;
104+
// Limit the kernel size to 1000x1000 pixels, like Skia does.
105+
auto radius = std::min(Radius{blur_sigma_}.radius, 500.0f);
105106

106107
// Input 0 snapshot.
107108

0 commit comments

Comments
 (0)