Skip to content

Commit 350534d

Browse files
author
Harry Terkelsen
authored
Handle MaskFilter with 0 sigma (flutter#27710)
1 parent e6d6f2d commit 350534d

File tree

5 files changed

+44
-11
lines changed

5 files changed

+44
-11
lines changed

lib/web_ui/lib/src/engine/canvaskit/canvaskit_api.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -870,7 +870,10 @@ class SkShader {
870870

871871
@JS()
872872
class SkMaskFilterNamespace {
873-
external SkMaskFilter MakeBlur(
873+
// Creates a blur MaskFilter.
874+
//
875+
// Returns `null` if [sigma] is 0 or infinite.
876+
external SkMaskFilter? MakeBlur(
874877
SkBlurStyle blurStyle, double sigma, bool respectCTM);
875878
}
876879

lib/web_ui/lib/src/engine/canvaskit/mask_filter.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class CkMaskFilter extends ManagedSkiaObject<SkMaskFilter> {
2727
toSkBlurStyle(_blurStyle),
2828
_sigma,
2929
true,
30-
);
30+
)!;
3131
}
3232

3333
@override

lib/web_ui/lib/src/engine/canvaskit/painting.dart

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,16 @@ class CkPaint extends ManagedSkiaObject<SkPaint> implements ui.Paint {
144144
}
145145
_maskFilter = value;
146146
if (value != null) {
147-
_ckMaskFilter = CkMaskFilter.blur(
148-
value.webOnlyBlurStyle,
149-
value.webOnlySigma,
150-
);
147+
// CanvasKit returns `null` if the sigma is `0` or infinite.
148+
if (!(value.webOnlySigma.isFinite && value.webOnlySigma > 0)) {
149+
// Don't create a [CkMaskFilter].
150+
_ckMaskFilter = null;
151+
} else {
152+
_ckMaskFilter = CkMaskFilter.blur(
153+
value.webOnlyBlurStyle,
154+
value.webOnlySigma,
155+
);
156+
}
151157
} else {
152158
_ckMaskFilter = null;
153159
}

lib/web_ui/test/canvaskit/canvaskit_api_test.dart

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,16 @@ void _maskFilterTests() {
408408
),
409409
isNotNull);
410410
});
411+
test('MaskFilter.MakeBlur with 0 sigma returns null', () {
412+
expect(
413+
canvasKit.MaskFilter.MakeBlur(canvasKit.BlurStyle.Normal, 0.0, false),
414+
isNull);
415+
});
416+
test('MaskFilter.MakeBlur with NaN sigma returns null', () {
417+
expect(
418+
canvasKit.MaskFilter.MakeBlur(canvasKit.BlurStyle.Normal, double.nan, false),
419+
isNull);
420+
});
411421
}
412422

413423
void _colorFilterTests() {
@@ -1099,7 +1109,8 @@ void _canvasTests() {
10991109
const ui.Color color = ui.Color(0xAABBCCDD);
11001110
final ui.Color inAmbient =
11011111
color.withAlpha((color.alpha * ambientAlpha).round());
1102-
final ui.Color inSpot = color.withAlpha((color.alpha * spotAlpha).round());
1112+
final ui.Color inSpot =
1113+
color.withAlpha((color.alpha * spotAlpha).round());
11031114

11041115
final SkTonalColors inTonalColors = SkTonalColors(
11051116
ambient: makeFreshSkColor(inAmbient),
@@ -1154,8 +1165,8 @@ void _canvasTests() {
11541165

11551166
test('drawPicture', () {
11561167
final SkPictureRecorder otherRecorder = SkPictureRecorder();
1157-
final SkCanvas otherCanvas =
1158-
otherRecorder.beginRecording(Float32List.fromList(<double>[0, 0, 100, 100]));
1168+
final SkCanvas otherCanvas = otherRecorder
1169+
.beginRecording(Float32List.fromList(<double>[0, 0, 100, 100]));
11591170
otherCanvas.drawLine(0, 0, 10, 10, SkPaint());
11601171
canvas.drawPicture(otherRecorder.finishRecordingAsPicture());
11611172
});
@@ -1180,8 +1191,8 @@ void _canvasTests() {
11801191
// ProductionCollector)
11811192
browserSupportsFinalizationRegistry = true;
11821193
final SkPictureRecorder otherRecorder = SkPictureRecorder();
1183-
final SkCanvas otherCanvas =
1184-
otherRecorder.beginRecording(Float32List.fromList(<double>[0, 0, 1, 1]));
1194+
final SkCanvas otherCanvas = otherRecorder
1195+
.beginRecording(Float32List.fromList(<double>[0, 0, 1, 1]));
11851196
otherCanvas.drawRect(
11861197
Float32List.fromList(<double>[0, 0, 1, 1]),
11871198
SkPaint(),

lib/web_ui/test/canvaskit/filter_test.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,17 @@ void testMain() {
9191

9292
// TODO: https://github.com/flutter/flutter/issues/60040
9393
}, skip: isIosSafari);
94+
95+
group('MaskFilter', () {
96+
setUpCanvasKitTest();
97+
98+
test('with 0 sigma can be set on a Paint', () {
99+
final ui.Paint paint = ui.Paint();
100+
final ui.MaskFilter filter = ui.MaskFilter.blur(ui.BlurStyle.normal, 0);
101+
102+
expect(() => paint.maskFilter = filter, isNot(throwsException));
103+
});
104+
105+
// TODO: https://github.com/flutter/flutter/issues/60040
106+
}, skip: isIosSafari);
94107
}

0 commit comments

Comments
 (0)