Fix the rules for determining whether a blur image filter is valid (flutter/engine#43791)

See https://github.com/flutter/flutter/issues/130318
This commit is contained in:
Jason Simmons
2023-07-19 00:14:06 -07:00
committed by GitHub
parent 06181865d4
commit a4d8601b57
3 changed files with 25 additions and 4 deletions

View File

@@ -229,11 +229,15 @@ class DlBlurImageFilter final : public DlImageFilter {
static std::shared_ptr<DlImageFilter> 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<DlBlurImageFilter>(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<DlBlurImageFilter>(sigma_x, sigma_y, tile_mode);
}
std::shared_ptr<DlImageFilter> shared() const override {

View File

@@ -209,6 +209,23 @@ TEST(DisplayListImageFilter, BlurBounds) {
TestBounds(filter, input_bounds, expected_output_bounds);
}
TEST(DisplayListImageFilter, BlurZeroSigma) {
std::shared_ptr<DlImageFilter> 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);
}