From 3e8c8c71a6e505dde33a936846466694ce583cd1 Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Tue, 18 Jul 2023 14:53:19 -0700 Subject: [PATCH] Fix the rules for determining whether a blur image filter is valid 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/display_list/effects/dl_image_filter.h b/display_list/effects/dl_image_filter.h index 6e6c68f196ec8..f7350e8bd767d 100644 --- a/display_list/effects/dl_image_filter.h +++ b/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/display_list/effects/dl_image_filter_unittests.cc b/display_list/effects/dl_image_filter_unittests.cc index 422cb28dbb454..20aa47fc2fd10 100644 --- a/display_list/effects/dl_image_filter_unittests.cc +++ b/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/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png b/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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 hY83cCf=ZO1eB5-;?tT{d89@l-z+RU