Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 3fb6195

Browse files
authored
[CP] [Impeller] Limit blur kernel to 1000x1000 pixels (#42154) (#42217)
CP for #42154
1 parent 90fa3ae commit 3fb6195

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

impeller/aiks/aiks_unittests.cc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,6 +1951,22 @@ TEST_P(AiksTest, CanRenderTinyOverlappingSubpasses) {
19511951
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
19521952
}
19531953

1954+
TEST_P(AiksTest, CanRenderBackdropBlurHugeSigma) {
1955+
Canvas canvas;
1956+
canvas.DrawCircle({400, 400}, 300, {.color = Color::Green()});
1957+
canvas.SaveLayer({.blend_mode = BlendMode::kSource}, std::nullopt,
1958+
[](const FilterInput::Ref& input,
1959+
const Matrix& effect_transform, bool is_subpass) {
1960+
return FilterContents::MakeGaussianBlur(
1961+
input, Sigma(999999), Sigma(999999),
1962+
FilterContents::BlurStyle::kNormal,
1963+
Entity::TileMode::kClamp, effect_transform);
1964+
});
1965+
canvas.Restore();
1966+
1967+
ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
1968+
}
1969+
19541970
// Regression test for https://github.com/flutter/flutter/issues/126701 .
19551971
TEST_P(AiksTest, CanRenderClippedRuntimeEffects) {
19561972
if (GetParam() != PlaygroundBackend::kMetal) {

impeller/entity/contents/filters/gaussian_blur_filter_contents.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ std::optional<Entity> DirectionalGaussianBlurFilterContents::RenderFilter(
9898
return std::nullopt;
9999
}
100100

101+
// Limit the kernel size to 1000x1000 pixels, like Skia does.
102+
auto radius = std::min(Radius{blur_sigma_}.radius, 500.0f);
101103
// Input 0 snapshot.
102104

103105
auto input_snapshot = inputs[0]->GetSnapshot(renderer, entity);
@@ -111,8 +113,6 @@ std::optional<Entity> DirectionalGaussianBlurFilterContents::RenderFilter(
111113
entity.GetStencilDepth()); // No blur to render.
112114
}
113115

114-
auto radius = Radius{blur_sigma_}.radius;
115-
116116
auto transform = entity.GetTransformation() * effect_transform.Basis();
117117
auto transformed_blur_radius =
118118
transform.TransformDirection(blur_direction_ * radius);
@@ -337,7 +337,7 @@ std::optional<Rect> DirectionalGaussianBlurFilterContents::GetFilterCoverage(
337337

338338
auto transform = inputs[0]->GetTransform(entity) * effect_transform.Basis();
339339
auto transformed_blur_vector =
340-
transform.TransformDirection(blur_direction_* Radius{blur_sigma_}.radius)
340+
transform.TransformDirection(blur_direction_ * Radius{blur_sigma_}.radius)
341341
.Abs();
342342
auto extent = coverage->size + transformed_blur_vector * 2;
343343
return Rect(coverage->origin - transformed_blur_vector,

0 commit comments

Comments
 (0)