Skip to content

Commit 91656a5

Browse files
authored
Avoid segfault when converting no-op ColorFilter to ImageFilter (flutter#37596)
1 parent c3d7c59 commit 91656a5

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

lib/ui/painting/image_filter.cc

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,11 @@ void ImageFilter::initMatrix(const tonic::Float64List& matrix4,
7474

7575
void ImageFilter::initColorFilter(ColorFilter* colorFilter) {
7676
FML_DCHECK(colorFilter);
77-
filter_ =
78-
std::make_shared<DlColorFilterImageFilter>(colorFilter->dl_filter());
77+
auto dl_filter = colorFilter->dl_filter();
78+
// Skia may return nullptr if the colorfilter is a no-op.
79+
if (dl_filter) {
80+
filter_ = std::make_shared<DlColorFilterImageFilter>(dl_filter);
81+
}
7982
}
8083

8184
void ImageFilter::initComposeFilter(ImageFilter* outer, ImageFilter* inner) {

testing/dart/canvas_test.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ void testNoCrashes() {
110110
testCanvas((Canvas canvas) => canvas.drawVertices(Vertices(VertexMode.triangles, <Offset>[],
111111
indices: <int>[]), BlendMode.screen, paint));
112112
testCanvas((Canvas canvas) => canvas.drawVertices(Vertices(VertexMode.triangles, <Offset>[])..dispose(), BlendMode.screen, paint));
113+
114+
// Regression test for https://github.com/flutter/flutter/issues/115143
115+
testCanvas((Canvas canvas) => canvas.drawPaint(Paint()..imageFilter = const ColorFilter.mode(Color(0x00000000), BlendMode.xor)));
113116
});
114117
}
115118

0 commit comments

Comments
 (0)