diff --git a/engine/src/flutter/impeller/aiks/aiks_unittests.cc b/engine/src/flutter/impeller/aiks/aiks_unittests.cc index 3dda081b04..b0e4139f4e 100644 --- a/engine/src/flutter/impeller/aiks/aiks_unittests.cc +++ b/engine/src/flutter/impeller/aiks/aiks_unittests.cc @@ -3687,5 +3687,21 @@ TEST_P(AiksTest, ClearColorOptimizationWhenSubpassIsBiggerThanParentPass) { ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); } +TEST_P(AiksTest, BlurHasNoEdge) { + Canvas canvas; + canvas.Scale(GetContentScale()); + canvas.DrawPaint({}); + Paint blur = { + .color = Color::Green(), + .mask_blur_descriptor = + Paint::MaskBlurDescriptor{ + .style = FilterContents::BlurStyle::kNormal, + .sigma = Sigma(47.6), + }, + }; + canvas.DrawRect(Rect{300, 300, 200, 200}, blur); + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + } // namespace testing } // namespace impeller diff --git a/engine/src/flutter/impeller/entity/contents/solid_rrect_blur_contents.cc b/engine/src/flutter/impeller/entity/contents/solid_rrect_blur_contents.cc index 665cb599bc..e549856dc1 100644 --- a/engine/src/flutter/impeller/entity/contents/solid_rrect_blur_contents.cc +++ b/engine/src/flutter/impeller/entity/contents/solid_rrect_blur_contents.cc @@ -16,6 +16,14 @@ namespace impeller { +namespace { +// Generous padding to make sure blurs with large sigmas are fully visible. +// Used to expand the geometry around the rrect. +Scalar PadForSigma(Scalar sigma) { + return sigma * 4.0; +} +} // namespace + SolidRRectBlurContents::SolidRRectBlurContents() = default; SolidRRectBlurContents::~SolidRRectBlurContents() = default; @@ -44,7 +52,7 @@ std::optional SolidRRectBlurContents::GetCoverage( return std::nullopt; } - Scalar radius = sigma_.sigma * 2; + Scalar radius = PadForSigma(sigma_.sigma); auto ltrb = rect_->GetLTRB(); Rect bounds = Rect::MakeLTRB(ltrb[0] - radius, ltrb[1] - radius, @@ -66,9 +74,9 @@ bool SolidRRectBlurContents::Render(const ContentContext& renderer, // Clamp the max kernel width/height to 1000. auto blur_sigma = std::min(sigma_.sigma, 250.0f); - // Increase quality by make the radius a bit bigger than the typical + // Increase quality by making the radius a bit bigger than the typical // sigma->radius conversion we use for slower blurs. - auto blur_radius = blur_sigma * 2; + auto blur_radius = PadForSigma(blur_sigma); auto positive_rect = rect_->GetPositive(); { auto left = -blur_radius;