diff --git a/flutter_frontend_server/test/to_string_test.dart b/flutter_frontend_server/test/to_string_test.dart index ded3b98362730..53957fdae1b78 100644 --- a/flutter_frontend_server/test/to_string_test.dart +++ b/flutter_frontend_server/test/to_string_test.dart @@ -45,7 +45,9 @@ Future main(List args) async { ])); final ProcessResult runResult = Process.runSync(dart, [regularDill]); checkProcessResult(runResult); - String paintString = '"Paint.toString":"Paint(Color(0xffffffff))"'; + // TODO(matanlurey): "dither: true" is now present by default, until it is + // remove entirely. See https://github.com/flutter/flutter/issues/112498. + String paintString = '"Paint.toString":"Paint(Color(0xffffffff); dither: true)"'; if (buildDir.contains('release')) { paintString = '"Paint.toString":"Instance of \'Paint\'"'; } diff --git a/lib/ui/painting.dart b/lib/ui/painting.dart index cfb5e2348f06f..638a257301d3b 100644 --- a/lib/ui/painting.dart +++ b/lib/ui/painting.dart @@ -1091,8 +1091,9 @@ class Paint { /// Constructs an empty [Paint] object with all fields initialized to /// their defaults. Paint() { - // TODO(matanlurey): Remove as part of https://github.com/flutter/flutter/issues/112498. - _enableDithering(); + if (enableDithering) { + _dither = true; + } } // Paint objects are encoded in two buffers: @@ -1478,11 +1479,27 @@ class Paint { _data.setInt32(_kInvertColorOffset, value ? 1 : 0, _kFakeHostEndian); } - // TODO(matanlurey): Remove as part of https://github.com/flutter/flutter/issues/112498. - void _enableDithering() { - _data.setInt32(_kDitherOffset, 1, _kFakeHostEndian); + bool get _dither { + return _data.getInt32(_kDitherOffset, _kFakeHostEndian) == 1; + } + set _dither(bool value) { + _data.setInt32(_kDitherOffset, value ? 1 : 0, _kFakeHostEndian); } + /// Whether to dither the output when drawing some elements such as gradients. + /// + /// It is not expected that this flag will be used in the future; please leave + /// feedback in if there is + /// a use case for this flag to remain long term. + @Deprecated( + 'Dithering is now enabled by default on some elements (such as gradients) ' + 'and further support for dithering is expected to be handled by custom ' + 'shaders, so this flag is being removed: ' + 'https://github.com/flutter/flutter/issues/112498.' + 'This feature was deprecated after 3.14.0-0.1.pre.' + ) + static bool enableDithering = true; + @override String toString() { if (const bool.fromEnvironment('dart.vm.product')) { @@ -1545,6 +1562,9 @@ class Paint { if (invertColors) { result.write('${semicolon}invert: $invertColors'); } + if (_dither) { + result.write('${semicolon}dither: $_dither'); + } result.write(')'); return result.toString(); } diff --git a/lib/web_ui/lib/painting.dart b/lib/web_ui/lib/painting.dart index c050e43dec611..026f20bfe6bad 100644 --- a/lib/web_ui/lib/painting.dart +++ b/lib/web_ui/lib/painting.dart @@ -217,6 +217,7 @@ enum Clip { abstract class Paint { factory Paint() => engine.renderer.createPaint(); + static bool enableDithering = false; BlendMode get blendMode; set blendMode(BlendMode value); PaintingStyle get style; diff --git a/testing/dart/canvas_test.dart b/testing/dart/canvas_test.dart index 6732423695d2b..716233fa8a783 100644 --- a/testing/dart/canvas_test.dart +++ b/testing/dart/canvas_test.dart @@ -202,7 +202,28 @@ void main() { ); } - test('Simple gradient, which is implicitly dithered', () async { + test('Simple gradient', () async { + // TODO(matanl): While deprecated, we still don't want to accidentally + // change the behavior of the old API, + // https://github.com/flutter/flutter/issues/112498. + // ignore: deprecated_member_use + Paint.enableDithering = false; + final Image image = await toImage((Canvas canvas) { + final Paint paint = Paint()..shader = makeGradient(); + canvas.drawPaint(paint); + }, 100, 100); + expect(image.width, equals(100)); + expect(image.height, equals(100)); + + final bool areEqual = + await fuzzyGoldenImageCompare(image, 'canvas_test_gradient.png'); + expect(areEqual, true); + }, skip: !Platform.isLinux); // https://github.com/flutter/flutter/issues/53784 + + test('Simple dithered gradient', () async { + // TODO(matanl): Reword this test once we remove the deprecated API. + // ignore: deprecated_member_use + Paint.enableDithering = true; final Image image = await toImage((Canvas canvas) { final Paint paint = Paint()..shader = makeGradient(); canvas.drawPaint(paint);