From a4d8601b57affca8e211d2ce704432c2bb14b3f9 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Wed, 19 Jul 2023 00:14:06 -0700 Subject: [PATCH] Fix the rules for determining whether a blur image filter is valid (flutter/engine#43791) See https://github.com/flutter/flutter/issues/130318 --- .../display_list/effects/dl_image_filter.h | 12 ++++++++---- .../effects/dl_image_filter_unittests.cc | 17 +++++++++++++++++ ...one SE (3rd generation)_16.2_simulator.png | Bin 20583 -> 29524 bytes 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/engine/src/flutter/display_list/effects/dl_image_filter.h b/engine/src/flutter/display_list/effects/dl_image_filter.h index 6e6c68f196..f7350e8bd7 100644 --- a/engine/src/flutter/display_list/effects/dl_image_filter.h +++ b/engine/src/flutter/display_list/effects/dl_image_filter.h @@ -229,11 +229,15 @@ class DlBlurImageFilter final : public DlImageFilter { static std::shared_ptr Make(SkScalar sigma_x, SkScalar sigma_y, DlTileMode tile_mode) { - if (SkScalarIsFinite(sigma_x) && sigma_x > SK_ScalarNearlyZero && - SkScalarIsFinite(sigma_y) && sigma_y > SK_ScalarNearlyZero) { - return std::make_shared(sigma_x, sigma_y, tile_mode); + if (!SkScalarIsFinite(sigma_x) || !SkScalarIsFinite(sigma_y)) { + return nullptr; } - return nullptr; + if (sigma_x < SK_ScalarNearlyZero && sigma_y < SK_ScalarNearlyZero) { + return nullptr; + } + sigma_x = (sigma_x < SK_ScalarNearlyZero) ? 0 : sigma_x; + sigma_y = (sigma_y < SK_ScalarNearlyZero) ? 0 : sigma_y; + return std::make_shared(sigma_x, sigma_y, tile_mode); } std::shared_ptr shared() const override { diff --git a/engine/src/flutter/display_list/effects/dl_image_filter_unittests.cc b/engine/src/flutter/display_list/effects/dl_image_filter_unittests.cc index 422cb28dbb..20aa47fc2f 100644 --- a/engine/src/flutter/display_list/effects/dl_image_filter_unittests.cc +++ b/engine/src/flutter/display_list/effects/dl_image_filter_unittests.cc @@ -209,6 +209,23 @@ TEST(DisplayListImageFilter, BlurBounds) { TestBounds(filter, input_bounds, expected_output_bounds); } +TEST(DisplayListImageFilter, BlurZeroSigma) { + std::shared_ptr filter = + DlBlurImageFilter::Make(0, 0, DlTileMode::kMirror); + ASSERT_EQ(filter, nullptr); + filter = DlBlurImageFilter::Make(3, SK_ScalarNaN, DlTileMode::kMirror); + ASSERT_EQ(filter, nullptr); + filter = DlBlurImageFilter::Make(SK_ScalarNaN, 3, DlTileMode::kMirror); + ASSERT_EQ(filter, nullptr); + filter = + DlBlurImageFilter::Make(SK_ScalarNaN, SK_ScalarNaN, DlTileMode::kMirror); + ASSERT_EQ(filter, nullptr); + filter = DlBlurImageFilter::Make(3, 0, DlTileMode::kMirror); + ASSERT_NE(filter, nullptr); + filter = DlBlurImageFilter::Make(0, 3, DlTileMode::kMirror); + ASSERT_NE(filter, nullptr); +} + TEST(DisplayListImageFilter, DilateConstructor) { DlDilateImageFilter filter(5.0, 6.0); } diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png b/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png index bc5162bebdae39fe8d2c50e818cf3e6f5cb94bc7..769f186b1ca4cb60c6bfabc01dacfff5effbbbb4 100644 GIT binary patch literal 29524 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

!>5eQ!0kiTr^H5ubqsyEL^hxMH_`&}Hj@{&*8 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 literal 20583 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 Z|HMPp)i!H;-hmGJ^K|udS?83{1OS;6Hqih8