From 4795bc576de0c9be7fad5c05927eebc2a10e7ba2 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Tue, 28 May 2024 11:29:09 -0700 Subject: [PATCH] [Impeller] shrunk the buffer for the rrect_blur (flutter/engine#53068) issue https://github.com/flutter/flutter/issues/148496 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style --- .../impeller/aiks/aiks_blur_unittests.cc | 34 ++++++++++++------- .../contents/solid_rrect_blur_contents.cc | 10 ++++-- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/engine/src/flutter/impeller/aiks/aiks_blur_unittests.cc b/engine/src/flutter/impeller/aiks/aiks_blur_unittests.cc index 09e6e188a88..e3253b39488 100644 --- a/engine/src/flutter/impeller/aiks/aiks_blur_unittests.cc +++ b/engine/src/flutter/impeller/aiks/aiks_blur_unittests.cc @@ -199,19 +199,29 @@ TEST_P(AiksTest, ClearBlendWithBlur) { } 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), - }, + Scalar sigma = 47.6; + auto callback = [&](AiksContext& renderer) -> std::optional { + if (AiksTest::ImGuiBegin("Controls", nullptr, + ImGuiWindowFlags_AlwaysAutoResize)) { + ImGui::SliderFloat("Sigma", &sigma, 0, 50); + ImGui::End(); + } + Canvas canvas; + canvas.Scale(GetContentScale()); + canvas.DrawPaint({}); + Paint blur = { + .color = Color::Green(), + .mask_blur_descriptor = + Paint::MaskBlurDescriptor{ + .style = FilterContents::BlurStyle::kNormal, + .sigma = Sigma(sigma), + }, + }; + canvas.DrawRect(Rect::MakeXYWH(300, 300, 200, 200), blur); + return canvas.EndRecordingAsPicture(); }; - canvas.DrawRect(Rect::MakeXYWH(300, 300, 200, 200), blur); - ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); + + ASSERT_TRUE(OpenPlaygroundHere(callback)); } TEST_P(AiksTest, BlurredRectangleWithShader) { 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 4d0c8cb0e33..b6bdffd2b7d 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 @@ -15,10 +15,14 @@ namespace impeller { namespace { -// Generous padding to make sure blurs with large sigmas are fully visible. -// Used to expand the geometry around the rrect. +// Generous padding to make sure blurs with large sigmas are fully visible. Used +// to expand the geometry around the rrect. Larger sigmas have more subtle +// gradients so they need larger padding to avoid hard cutoffs. Sigma is +// maximized to 3.5 since that should cover 99.95% of all samples. 3.0 should +// cover 99.7% but that was seen to be not enough for large sigmas. Scalar PadForSigma(Scalar sigma) { - return sigma * 4.0; + Scalar scalar = std::min((1.0f / 47.6f) * sigma + 2.5f, 3.5f); + return sigma * scalar; } } // namespace