Revert "Expose API for custom image decode and cache sizes (#41415)" (#42764)
diff --git a/packages/flutter/lib/src/painting/_network_image_io.dart b/packages/flutter/lib/src/painting/_network_image_io.dart index d976b93..2b2c4a7 100644 --- a/packages/flutter/lib/src/painting/_network_image_io.dart +++ b/packages/flutter/lib/src/painting/_network_image_io.dart
@@ -9,6 +9,7 @@ import 'package:flutter/foundation.dart'; +import 'binding.dart'; import 'debug.dart'; import 'image_provider.dart' as image_provider; import 'image_stream.dart'; @@ -37,14 +38,14 @@ } @override - ImageStreamCompleter load(image_provider.NetworkImage key, image_provider.DecoderCallback decode) { + ImageStreamCompleter load(image_provider.NetworkImage key) { // Ownership of this controller is handed off to [_loadAsync]; it is that // method's responsibility to close the controller's stream when the image // has been loaded or an error is thrown. final StreamController<ImageChunkEvent> chunkEvents = StreamController<ImageChunkEvent>(); return MultiFrameImageStreamCompleter( - codec: _loadAsync(key, chunkEvents, decode), + codec: _loadAsync(key, chunkEvents), chunkEvents: chunkEvents.stream, scale: key.scale, informationCollector: () { @@ -75,7 +76,6 @@ Future<ui.Codec> _loadAsync( NetworkImage key, StreamController<ImageChunkEvent> chunkEvents, - image_provider.DecoderCallback decode, ) async { try { assert(key == this); @@ -101,7 +101,7 @@ if (bytes.lengthInBytes == 0) throw Exception('NetworkImage is an empty file: $resolved'); - return decode(bytes); + return PaintingBinding.instance.instantiateImageCodec(bytes); } finally { chunkEvents.close(); }
diff --git a/packages/flutter/lib/src/painting/_network_image_web.dart b/packages/flutter/lib/src/painting/_network_image_web.dart index ba28c8a..6b566de 100644 --- a/packages/flutter/lib/src/painting/_network_image_web.dart +++ b/packages/flutter/lib/src/painting/_network_image_web.dart
@@ -11,8 +11,6 @@ import 'image_stream.dart'; /// The dart:html implemenation of [image_provider.NetworkImage]. -/// -/// NetworkImage on the web does not support decoding to a specified size. class NetworkImage extends image_provider.ImageProvider<image_provider.NetworkImage> implements image_provider.NetworkImage { /// Creates an object that fetches the image at the given URL. /// @@ -36,9 +34,9 @@ } @override - ImageStreamCompleter load(image_provider.NetworkImage key, image_provider.DecoderCallback decode) { + ImageStreamCompleter load(image_provider.NetworkImage key) { return MultiFrameImageStreamCompleter( - codec: _loadAsync(key, decode), + codec: _loadAsync(key), scale: key.scale, informationCollector: () { return <DiagnosticsNode>[ @@ -49,10 +47,7 @@ ); } - // Web does not support decoding network images to a specified size. The decode parameter - // here is ignored and the web-only `ui.webOnlyInstantiateImageCodecFromUrl` will be used - // directly in place of the typical `instantiateImageCodec` method. - Future<ui.Codec> _loadAsync(NetworkImage key, image_provider.DecoderCallback decode) async { + Future<ui.Codec> _loadAsync(NetworkImage key) async { assert(key == this); final Uri resolved = Uri.base.resolve(key.url);
diff --git a/packages/flutter/lib/src/painting/binding.dart b/packages/flutter/lib/src/painting/binding.dart index c022373..4eb915d 100644 --- a/packages/flutter/lib/src/painting/binding.dart +++ b/packages/flutter/lib/src/painting/binding.dart
@@ -70,26 +70,8 @@ ImageCache createImageCache() => ImageCache(); /// Calls through to [dart:ui] with [decodedCacheRatioCap] from [ImageCache]. - /// - /// The [cacheWidth] and [cacheHeight] parameters, when specified, indicate the - /// size to decode the image to. - /// - /// Both [cacheWidth] and [cacheHeight] must be positive values greater than or - /// equal to 1 or null. It is valid to specify only one of [cacheWidth] and - /// [cacheHeight] with the other remaining null, in which case the omitted - /// dimension will decode to its original size. When both are null or omitted, - /// the image will be decoded at its native resolution. - Future<ui.Codec> instantiateImageCodec(Uint8List bytes, { - int cacheWidth, - int cacheHeight, - }) { - assert(cacheWidth == null || cacheWidth > 0); - assert(cacheHeight == null || cacheHeight > 0); - return ui.instantiateImageCodec( - bytes, - targetWidth: cacheWidth, - targetHeight: cacheHeight, - ); + Future<ui.Codec> instantiateImageCodec(Uint8List list) { + return ui.instantiateImageCodec(list); } @override
diff --git a/packages/flutter/lib/src/painting/image_provider.dart b/packages/flutter/lib/src/painting/image_provider.dart index 69790b2..a08e4c9 100644 --- a/packages/flutter/lib/src/painting/image_provider.dart +++ b/packages/flutter/lib/src/painting/image_provider.dart
@@ -152,16 +152,6 @@ } } -/// Performs the decode process for use in [ImageProvider.load]. -/// -/// This callback allows decoupling of the `cacheWidth` and `cacheHeight` -/// parameters from implementations of [ImageProvider] that do not use them. -/// -/// See also: -/// -/// * [ResizeImage], which uses this to override the `cacheWidth` and `cacheHeight` parameters. -typedef DecoderCallback = Future<ui.Codec> Function(Uint8List bytes, {int cacheWidth, int cacheHeight}); - /// Identifies an image without committing to the precise final asset. This /// allows a set of images to be identified and for the precise image to later /// be resolved based on the environment, e.g. the device pixel ratio. @@ -322,11 +312,8 @@ } key.then<void>((T key) { obtainedKey = key; - final ImageStreamCompleter completer = PaintingBinding.instance.imageCache.putIfAbsent( - key, - () => load(key, PaintingBinding.instance.instantiateImageCodec), - onError: handleError, - ); + final ImageStreamCompleter completer = PaintingBinding.instance + .imageCache.putIfAbsent(key, () => load(key), onError: handleError); if (completer != null) { stream.setCompleter(completer); } @@ -392,15 +379,8 @@ /// Converts a key into an [ImageStreamCompleter], and begins fetching the /// image. - /// - /// The [decode] callback provides the logic to obtain the codec for the - /// image. - /// - /// See also: - /// - /// * [ResizeImage], for modifying the key to account for cache dimensions. @protected - ImageStreamCompleter load(T key, DecoderCallback decode); + ImageStreamCompleter load(T key); @override String toString() => '$runtimeType()'; @@ -464,9 +444,9 @@ /// Converts a key into an [ImageStreamCompleter], and begins fetching the /// image using [loadAsync]. @override - ImageStreamCompleter load(AssetBundleImageKey key, DecoderCallback decode) { + ImageStreamCompleter load(AssetBundleImageKey key) { return MultiFrameImageStreamCompleter( - codec: _loadAsync(key, decode), + codec: _loadAsync(key), scale: key.scale, informationCollector: () sync* { yield DiagnosticsProperty<ImageProvider>('Image provider', this); @@ -480,82 +460,11 @@ /// /// This function is used by [load]. @protected - Future<ui.Codec> _loadAsync(AssetBundleImageKey key, DecoderCallback decode) async { + Future<ui.Codec> _loadAsync(AssetBundleImageKey key) async { final ByteData data = await key.bundle.load(key.name); if (data == null) throw 'Unable to read data'; - return await decode(data.buffer.asUint8List()); - } -} - -class _SizeAwareCacheKey { - const _SizeAwareCacheKey(this.providerCacheKey, this.width, this.height); - - final Object providerCacheKey; - - final int width; - - final int height; - - @override - bool operator ==(Object other) { - if (other.runtimeType != runtimeType) - return false; - final _SizeAwareCacheKey typedOther = other; - return providerCacheKey == typedOther.providerCacheKey - && width == typedOther.width - && height == typedOther.height; - } - - @override - int get hashCode => hashValues(providerCacheKey, width, height); -} - -/// Instructs Flutter to decode the image at the specified dimensions -/// instead of at its native size. -/// -/// This allows finer control of the size of the image in [ImageCache] and is -/// generally used to reduce the memory footprint of [ImageCache]. -/// -/// The decoded image may still be displayed at sizes other than the -/// cached size provided here. -class ResizeImage extends ImageProvider<_SizeAwareCacheKey> { - /// Creates an ImageProvider that decodes the image to the specified size. - /// - /// The cached image will be directly decoded and stored at the resolution - /// defined by `width` and `height`. The image will lose detail and - /// use less memory if resized to a size smaller than the native size. - const ResizeImage( - this.imageProvider, { - this.width, - this.height, - }) : assert(width != null || height != null); - - /// The [ImageProvider] that this class wraps. - final ImageProvider imageProvider; - - /// The width the image should decode to and cache. - final int width; - - /// The height the image should decode to and cache. - final int height; - - @override - ImageStreamCompleter load(_SizeAwareCacheKey key, DecoderCallback decode) { - final DecoderCallback decodeResize = (Uint8List bytes, {int cacheWidth, int cacheHeight}) { - assert( - cacheWidth == null && cacheHeight == null, - 'ResizeImage cannot be composed with another ImageProvider that applies cacheWidth or cacheHeight.' - ); - return decode(bytes, cacheWidth: width, cacheHeight: height); - }; - return imageProvider.load(key.providerCacheKey, decodeResize); - } - - @override - Future<_SizeAwareCacheKey> obtainKey(ImageConfiguration configuration) async { - final Object providerCacheKey = await imageProvider.obtainKey(configuration); - return _SizeAwareCacheKey(providerCacheKey, width, height); + return await PaintingBinding.instance.instantiateImageCodec(data.buffer.asUint8List()); } } @@ -563,11 +472,6 @@ /// /// The image will be cached regardless of cache headers from the server. /// -/// When a network image is used on the Web platform, the [cacheWidth] and -/// [cacheHeight] parameters of the [DecoderCallback] are ignored as the Web -/// engine delegates image decoding of network images to the Web, which does -/// not support custom decode sizes. -/// /// See also: /// /// * [Image.network] for a shorthand of an [Image] widget backed by [NetworkImage]. @@ -592,7 +496,7 @@ Map<String, String> get headers; @override - ImageStreamCompleter load(NetworkImage key, DecoderCallback decode); + ImageStreamCompleter load(NetworkImage key); } /// Decodes the given [File] object as an image, associating it with the given @@ -621,9 +525,9 @@ } @override - ImageStreamCompleter load(FileImage key, DecoderCallback decode) { + ImageStreamCompleter load(FileImage key) { return MultiFrameImageStreamCompleter( - codec: _loadAsync(key, decode), + codec: _loadAsync(key), scale: key.scale, informationCollector: () sync* { yield ErrorDescription('Path: ${file?.path}'); @@ -631,14 +535,14 @@ ); } - Future<ui.Codec> _loadAsync(FileImage key, DecoderCallback decode) async { + Future<ui.Codec> _loadAsync(FileImage key) async { assert(key == this); final Uint8List bytes = await file.readAsBytes(); if (bytes.lengthInBytes == 0) return null; - return await decode(bytes); + return await PaintingBinding.instance.instantiateImageCodec(bytes); } @override @@ -689,17 +593,17 @@ } @override - ImageStreamCompleter load(MemoryImage key, DecoderCallback decode) { + ImageStreamCompleter load(MemoryImage key) { return MultiFrameImageStreamCompleter( - codec: _loadAsync(key, decode), + codec: _loadAsync(key), scale: key.scale, ); } - Future<ui.Codec> _loadAsync(MemoryImage key, DecoderCallback decode) { + Future<ui.Codec> _loadAsync(MemoryImage key) { assert(key == this); - return decode(bytes); + return PaintingBinding.instance.instantiateImageCodec(bytes); } @override
diff --git a/packages/flutter/lib/src/widgets/image.dart b/packages/flutter/lib/src/widgets/image.dart index 83f8a9e..9dfa4a5 100644 --- a/packages/flutter/lib/src/widgets/image.dart +++ b/packages/flutter/lib/src/widgets/image.dart
@@ -55,13 +55,6 @@ ); } -ImageProvider<dynamic> _resizeIfNeeded(int cacheWidth, int cacheHeight, ImageProvider<dynamic> provider) { - if (cacheWidth != null || cacheHeight != null) { - return ResizeImage(provider, width: cacheWidth, height: cacheHeight); - } - return provider; -} - /// Prefetches an image into the image cache. /// /// Returns a [Future] that will complete when the first image yielded by the @@ -239,17 +232,6 @@ /// ``` /// {@end-tool} /// -/// The [Image.asset], [Image.network], [Image.file], and [Image.memory] -/// constructors allow a custom decode size to be specified through -/// [cacheWidth] and [cacheHeight] parameters. The engine will decode the -/// image to the specified size, which is primarily intended to reduce the -/// memory usage of [ImageCache]. -/// -/// In the case where a network image is used on the Web platform, the -/// [cacheWidth] and [cacheHeight] parameters are ignored as the Web engine -/// delegates image decoding of network images to the Web, which does not support -/// custom decode sizes. -/// /// See also: /// /// * [Icon], which shows an image from a font. @@ -323,16 +305,6 @@ /// [FilterQuality.none] which corresponds to nearest-neighbor. /// /// If [excludeFromSemantics] is true, then [semanticLabel] will be ignored. - /// - /// If [cacheWidth] or [cacheHeight] are provided, it indicates to the - /// engine that the image should be decoded at the specified size. The image - /// will be rendered to the constraints of the layout or [width] and [height] - /// regardless of these parameters. These parameters are primarily intended - /// to reduce the memory usage of [ImageCache]. - /// - /// In the case where the network image is on the Web platform, the [cacheWidth] - /// and [cacheHeight] parameters are ignored as the web engine delegates - /// image decoding to the web which does not support custom decode sizes. Image.network( String src, { Key key, @@ -353,14 +325,10 @@ this.gaplessPlayback = false, this.filterQuality = FilterQuality.low, Map<String, String> headers, - int cacheWidth, - int cacheHeight, - }) : image = _resizeIfNeeded(cacheWidth, cacheHeight, NetworkImage(src, scale: scale, headers: headers)), + }) : image = NetworkImage(src, scale: scale, headers: headers), assert(alignment != null), assert(repeat != null), assert(matchTextDirection != null), - assert(cacheWidth == null || cacheWidth > 0), - assert(cacheHeight == null || cacheHeight > 0), super(key: key); /// Creates a widget that displays an [ImageStream] obtained from a [File]. @@ -381,12 +349,6 @@ /// [FilterQuality.none] which corresponds to nearest-neighbor. /// /// If [excludeFromSemantics] is true, then [semanticLabel] will be ignored. - /// - /// If [cacheWidth] or [cacheHeight] are provided, it indicates to the - /// engine that the image must be decoded at the specified size. The image - /// will be rendered to the constraints of the layout or [width] and [height] - /// regardless of these parameters. These parameters are primarily intended - /// to reduce the memory usage of [ImageCache]. Image.file( File file, { Key key, @@ -405,16 +367,12 @@ this.matchTextDirection = false, this.gaplessPlayback = false, this.filterQuality = FilterQuality.low, - int cacheWidth, - int cacheHeight, - }) : image = _resizeIfNeeded(cacheWidth, cacheHeight, FileImage(file, scale: scale)), + }) : image = FileImage(file, scale: scale), loadingBuilder = null, assert(alignment != null), assert(repeat != null), assert(filterQuality != null), assert(matchTextDirection != null), - assert(cacheWidth == null || cacheWidth > 0), - assert(cacheHeight == null || cacheHeight > 0), super(key: key); @@ -446,12 +404,6 @@ /// /// If [excludeFromSemantics] is true, then [semanticLabel] will be ignored. /// - /// If [cacheWidth] or [cacheHeight] are provided, it indicates to the - /// engine that the image must be decoded at the specified size. The image - /// will be rendered to the constraints of the layout or [width] and [height] - /// regardless of these parameters. These parameters are primarily intended - /// to reduce the memory usage of [ImageCache]. - /// /// The [name] and [repeat] arguments must not be null. /// /// Either the [width] and [height] arguments should be specified, or the @@ -568,18 +520,13 @@ this.gaplessPlayback = false, String package, this.filterQuality = FilterQuality.low, - int cacheWidth, - int cacheHeight, - }) : image = _resizeIfNeeded(cacheWidth, cacheHeight, scale != null + }) : image = scale != null ? ExactAssetImage(name, bundle: bundle, scale: scale, package: package) - : AssetImage(name, bundle: bundle, package: package) - ), + : AssetImage(name, bundle: bundle, package: package), loadingBuilder = null, assert(alignment != null), assert(repeat != null), assert(matchTextDirection != null), - assert(cacheWidth == null || cacheWidth > 0), - assert(cacheHeight == null || cacheHeight > 0), super(key: key); /// Creates a widget that displays an [ImageStream] obtained from a [Uint8List]. @@ -601,12 +548,6 @@ /// [FilterQuality.none] which corresponds to nearest-neighbor. /// /// If [excludeFromSemantics] is true, then [semanticLabel] will be ignored. - /// - /// If [cacheWidth] or [cacheHeight] are provided, it indicates to the - /// engine that the image must be decoded at the specified size. The image - /// will be rendered to the constraints of the layout or [width] and [height] - /// regardless of these parameters. These parameters are primarily intended - /// to reduce the memory usage of [ImageCache]. Image.memory( Uint8List bytes, { Key key, @@ -625,15 +566,11 @@ this.matchTextDirection = false, this.gaplessPlayback = false, this.filterQuality = FilterQuality.low, - int cacheWidth, - int cacheHeight, - }) : image = _resizeIfNeeded(cacheWidth, cacheHeight, MemoryImage(bytes, scale: scale)), + }) : image = MemoryImage(bytes, scale: scale), loadingBuilder = null, assert(alignment != null), assert(repeat != null), assert(matchTextDirection != null), - assert(cacheWidth == null || cacheWidth > 0), - assert(cacheHeight == null || cacheHeight > 0), super(key: key); /// The image to display.
diff --git a/packages/flutter/test/painting/binding_test.dart b/packages/flutter/test/painting/binding_test.dart index d849abd..ea46e60 100644 --- a/packages/flutter/test/painting/binding_test.dart +++ b/packages/flutter/test/painting/binding_test.dart
@@ -19,9 +19,7 @@ final Uint8List bytes = Uint8List.fromList(kTransparentImage); final MemoryImage memoryImage = MemoryImage(bytes); - memoryImage.load(memoryImage, (Uint8List bytes, {int cacheWidth, int cacheHeight}) { - return PaintingBinding.instance.instantiateImageCodec(bytes, cacheWidth: cacheWidth, cacheHeight: cacheHeight); - }); + memoryImage.load(memoryImage); expect(binding.instantiateImageCodecCalledCount, 1); }); }
diff --git a/packages/flutter/test/painting/decoration_test.dart b/packages/flutter/test/painting/decoration_test.dart index 872a8ca..c5ae1e5 100644 --- a/packages/flutter/test/painting/decoration_test.dart +++ b/packages/flutter/test/painting/decoration_test.dart
@@ -33,7 +33,7 @@ } @override - ImageStreamCompleter load(int key, DecoderCallback decode) { + ImageStreamCompleter load(int key) { return OneFrameImageStreamCompleter( SynchronousFuture<ImageInfo>(TestImageInfo(key, image: TestImage(), scale: 1.0)) ); @@ -47,7 +47,7 @@ } @override - ImageStreamCompleter load(int key, DecoderCallback decode) { + ImageStreamCompleter load(int key) { return OneFrameImageStreamCompleter( Future<ImageInfo>.value(TestImageInfo(key)) ); @@ -63,7 +63,7 @@ } @override - ImageStreamCompleter load(DelayedImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(DelayedImageProvider key) { return OneFrameImageStreamCompleter(_completer.future); }
diff --git a/packages/flutter/test/painting/fake_image_provider.dart b/packages/flutter/test/painting/fake_image_provider.dart index a8937e2..58ebb1a 100644 --- a/packages/flutter/test/painting/fake_image_provider.dart +++ b/packages/flutter/test/painting/fake_image_provider.dart
@@ -26,7 +26,7 @@ } @override - ImageStreamCompleter load(FakeImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(FakeImageProvider key) { assert(key == this); return MultiFrameImageStreamCompleter( codec: SynchronousFuture<ui.Codec>(_codec),
diff --git a/packages/flutter/test/painting/image_cache_test.dart b/packages/flutter/test/painting/image_cache_test.dart index da8758e..13b14bf 100644 --- a/packages/flutter/test/painting/image_cache_test.dart +++ b/packages/flutter/test/painting/image_cache_test.dart
@@ -133,9 +133,9 @@ test('Returns null if an error is caught resolving an image', () { final ErrorImageProvider errorImage = ErrorImageProvider(); - expect(() => imageCache.putIfAbsent(errorImage, () => errorImage.load(errorImage, null)), throwsA(isInstanceOf<Error>())); + expect(() => imageCache.putIfAbsent(errorImage, () => errorImage.load(errorImage)), throwsA(isInstanceOf<Error>())); bool caughtError = false; - final ImageStreamCompleter result = imageCache.putIfAbsent(errorImage, () => errorImage.load(errorImage, null), onError: (dynamic error, StackTrace stackTrace) { + final ImageStreamCompleter result = imageCache.putIfAbsent(errorImage, () => errorImage.load(errorImage), onError: (dynamic error, StackTrace stackTrace) { caughtError = true; }); expect(result, null);
diff --git a/packages/flutter/test/painting/image_provider_test.dart b/packages/flutter/test/painting/image_provider_test.dart index de638f4..3571dcf 100644 --- a/packages/flutter/test/painting/image_provider_test.dart +++ b/packages/flutter/test/painting/image_provider_test.dart
@@ -18,11 +18,6 @@ import 'mocks_for_image_cache.dart'; void main() { - - final DecoderCallback basicDecoder = (Uint8List bytes, {int cacheWidth, int cacheHeight}) { - return PaintingBinding.instance.instantiateImageCodec(bytes, cacheWidth: cacheWidth, cacheHeight: cacheHeight); - }; - group(ImageProvider, () { setUpAll(() { TestRenderingFlutterBinding(); // initializes the imageCache @@ -51,7 +46,7 @@ final Uint8List bytes = Uint8List.fromList(kTransparentImage); final MemoryImage imageProvider = MemoryImage(bytes); final ImageStreamCompleter cacheStream = otherCache.putIfAbsent( - imageProvider, () => imageProvider.load(imageProvider, basicDecoder), + imageProvider, () => imageProvider.load(imageProvider), ); final ImageStream stream = imageProvider.resolve(ImageConfiguration.empty); final Completer<void> completer = Completer<void>(); @@ -200,7 +195,7 @@ Future<void> loadNetworkImage() async { final NetworkImage networkImage = NetworkImage(nonconst('foo')); - final ImageStreamCompleter completer = networkImage.load(networkImage, basicDecoder); + final ImageStreamCompleter completer = networkImage.load(networkImage); completer.addListener(ImageStreamListener( (ImageInfo image, bool synchronousCall) { }, onError: (dynamic error, StackTrace stackTrace) { @@ -298,83 +293,6 @@ }, skip: isBrowser); }); }); - - test('ResizeImage resizes to the correct dimensions', () async { - final Uint8List bytes = Uint8List.fromList(kTransparentImage); - final MemoryImage imageProvider = MemoryImage(bytes); - final Size rawImageSize = await _resolveAndGetSize(imageProvider); - expect(rawImageSize, const Size(1, 1)); - - const Size resizeDims = Size(14, 7); - final ResizeImage resizedImage = ResizeImage(MemoryImage(bytes), width: resizeDims.width.round(), height: resizeDims.height.round()); - const ImageConfiguration resizeConfig = ImageConfiguration(size: resizeDims); - final Size resizedImageSize = await _resolveAndGetSize(resizedImage, configuration: resizeConfig); - expect(resizedImageSize, resizeDims); - }); - - test('ResizeImage does not resize when no size is passed', () async { - final Uint8List bytes = Uint8List.fromList(kTransparentImage); - final MemoryImage imageProvider = MemoryImage(bytes); - final Size rawImageSize = await _resolveAndGetSize(imageProvider); - expect(rawImageSize, const Size(1, 1)); - - // Cannot pass in two null arguments for cache dimensions, so will use the regular - // MemoryImage - final MemoryImage resizedImage = MemoryImage(bytes); - final Size resizedImageSize = await _resolveAndGetSize(resizedImage); - expect(resizedImageSize, const Size(1, 1)); - }); - - test('ResizeImage stores values', () async { - final Uint8List bytes = Uint8List.fromList(kTransparentImage); - final MemoryImage memoryImage = MemoryImage(bytes); - final ResizeImage resizeImage = ResizeImage(memoryImage, width: 10, height: 20); - expect(resizeImage.width, 10); - expect(resizeImage.height, 20); - expect(resizeImage.imageProvider, memoryImage); - - expect(memoryImage.resolve(ImageConfiguration.empty) != resizeImage.resolve(ImageConfiguration.empty), true); - }); - - test('ResizeImage takes one dim', () async { - final Uint8List bytes = Uint8List.fromList(kTransparentImage); - final MemoryImage memoryImage = MemoryImage(bytes); - final ResizeImage resizeImage = ResizeImage(memoryImage, width: 10, height: null); - expect(resizeImage.width, 10); - expect(resizeImage.height, null); - expect(resizeImage.imageProvider, memoryImage); - - expect(memoryImage.resolve(ImageConfiguration.empty) != resizeImage.resolve(ImageConfiguration.empty), true); - }); - - test('ResizeImage forms closure', () async { - final Uint8List bytes = Uint8List.fromList(kTransparentImage); - final MemoryImage memoryImage = MemoryImage(bytes); - final ResizeImage resizeImage = ResizeImage(memoryImage, width: 123, height: 321); - - final DecoderCallback decode = (Uint8List bytes, {int cacheWidth, int cacheHeight}) { - expect(cacheWidth, 123); - expect(cacheHeight, 321); - return PaintingBinding.instance.instantiateImageCodec(bytes, cacheWidth: cacheWidth, cacheHeight: cacheHeight); - }; - - resizeImage.load(await resizeImage.obtainKey(ImageConfiguration.empty), decode); - }); -} - -Future<Size> _resolveAndGetSize(ImageProvider imageProvider, - {ImageConfiguration configuration = ImageConfiguration.empty}) async { - final ImageStream stream = imageProvider.resolve(configuration); - final Completer<Size> completer = Completer<Size>(); - final ImageStreamListener listener = - ImageStreamListener((ImageInfo image, bool synchronousCall) { - final int height = image.image.height; - final int width = image.image.width; - completer.complete(Size(width.toDouble(), height.toDouble())); - } - ); - stream.addListener(listener); - return await completer.future; } class MockHttpClient extends Mock implements HttpClient {}
diff --git a/packages/flutter/test/painting/image_test_utils.dart b/packages/flutter/test/painting/image_test_utils.dart index 923fd14..bce8798 100644 --- a/packages/flutter/test/painting/image_test_utils.dart +++ b/packages/flutter/test/painting/image_test_utils.dart
@@ -31,7 +31,7 @@ } @override - ImageStreamCompleter load(TestImageProvider key, DecoderCallback decode) => + ImageStreamCompleter load(TestImageProvider key) => OneFrameImageStreamCompleter(_completer.future); ImageInfo complete() {
diff --git a/packages/flutter/test/painting/mocks_for_image_cache.dart b/packages/flutter/test/painting/mocks_for_image_cache.dart index dfc8901..656967e 100644 --- a/packages/flutter/test/painting/mocks_for_image_cache.dart +++ b/packages/flutter/test/painting/mocks_for_image_cache.dart
@@ -37,7 +37,7 @@ } @override - ImageStreamCompleter load(int key, DecoderCallback decode) { + ImageStreamCompleter load(int key) { return OneFrameImageStreamCompleter( SynchronousFuture<ImageInfo>(TestImageInfo(imageValue, image: image)) ); @@ -51,7 +51,7 @@ const FailingTestImageProvider(int key, int imageValue, { ui.Image image }) : super(key, imageValue, image: image); @override - ImageStreamCompleter load(int key, DecoderCallback decode) { + ImageStreamCompleter load(int key) { return OneFrameImageStreamCompleter(Future<ImageInfo>.sync(() => Future<ImageInfo>.error('loading failed!'))); } } @@ -85,7 +85,7 @@ class ErrorImageProvider extends ImageProvider<ErrorImageProvider> { @override - ImageStreamCompleter load(ErrorImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(ErrorImageProvider key) { throw Error(); } @@ -97,7 +97,7 @@ class ObtainKeyErrorImageProvider extends ImageProvider<ObtainKeyErrorImageProvider> { @override - ImageStreamCompleter load(ObtainKeyErrorImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(ObtainKeyErrorImageProvider key) { throw Error(); } @@ -109,7 +109,7 @@ class LoadErrorImageProvider extends ImageProvider<LoadErrorImageProvider> { @override - ImageStreamCompleter load(LoadErrorImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(LoadErrorImageProvider key) { throw Error(); } @@ -121,7 +121,7 @@ class LoadErrorCompleterImageProvider extends ImageProvider<LoadErrorCompleterImageProvider> { @override - ImageStreamCompleter load(LoadErrorCompleterImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(LoadErrorCompleterImageProvider key) { final Completer<void> completer = Completer<void>.sync(); completer.completeError(Error()); return OneFrameImageStreamCompleter(completer.future);
diff --git a/packages/flutter/test/painting/painting_utils.dart b/packages/flutter/test/painting/painting_utils.dart index ba6f953..378fb0d 100644 --- a/packages/flutter/test/painting/painting_utils.dart +++ b/packages/flutter/test/painting/painting_utils.dart
@@ -14,7 +14,7 @@ int get instantiateImageCodecCalledCount => counter; @override - Future<ui.Codec> instantiateImageCodec(Uint8List list, {int cacheWidth, int cacheHeight}) { + Future<ui.Codec> instantiateImageCodec(Uint8List list) { counter++; return ui.instantiateImageCodec(list); }
diff --git a/packages/flutter/test/painting/shape_decoration_test.dart b/packages/flutter/test/painting/shape_decoration_test.dart index c3f02d8..dbdcb62 100644 --- a/packages/flutter/test/painting/shape_decoration_test.dart +++ b/packages/flutter/test/painting/shape_decoration_test.dart
@@ -107,7 +107,7 @@ } @override - ImageStreamCompleter load(TestImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(TestImageProvider key) { return OneFrameImageStreamCompleter( SynchronousFuture<ImageInfo>(ImageInfo(image: TestImage(), scale: 1.0)), );
diff --git a/packages/flutter/test/widgets/box_decoration_test.dart b/packages/flutter/test/widgets/box_decoration_test.dart index be7cd3e..110fd3d 100644 --- a/packages/flutter/test/widgets/box_decoration_test.dart +++ b/packages/flutter/test/widgets/box_decoration_test.dart
@@ -28,7 +28,7 @@ } @override - ImageStreamCompleter load(TestImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(TestImageProvider key) { return OneFrameImageStreamCompleter( future.then<ImageInfo>((void value) => ImageInfo(image: image)) );
diff --git a/packages/flutter/test/widgets/image_data.dart b/packages/flutter/test/widgets/image_data.dart deleted file mode 100644 index 83a83af..0000000 --- a/packages/flutter/test/widgets/image_data.dart +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -const List<int> kTransparentImage = <int>[ - 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, - 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x06, - 0x00, 0x00, 0x00, 0x1F, 0x15, 0xC4, 0x89, 0x00, 0x00, 0x00, 0x0A, 0x49, 0x44, - 0x41, 0x54, 0x78, 0x9C, 0x63, 0x00, 0x01, 0x00, 0x00, 0x05, 0x00, 0x01, 0x0D, - 0x0A, 0x2D, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, -]; - -/// An animated GIF image with 3 1x1 pixel frames (a red, green, and blue -/// frames). The gif animates forever, and each frame has a 100ms delay. -const List<int> kAnimatedGif = <int> [ - 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00, 0xa1, 0x03, 0x00, - 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0x21, - 0xff, 0x0b, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x50, 0x45, 0x32, 0x2e, 0x30, - 0x03, 0x01, 0x00, 0x00, 0x00, 0x21, 0xf9, 0x04, 0x00, 0x0a, 0x00, 0xff, 0x00, - 0x2c, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x4c, - 0x01, 0x00, 0x21, 0xf9, 0x04, 0x00, 0x0a, 0x00, 0xff, 0x00, 0x2c, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x54, 0x01, 0x00, 0x21, - 0xf9, 0x04, 0x00, 0x0a, 0x00, 0xff, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x01, - 0x00, 0x01, 0x00, 0x00, 0x02, 0x02, 0x44, 0x01, 0x00, 0x3b, -];
diff --git a/packages/flutter/test/widgets/image_resolution_test.dart b/packages/flutter/test/widgets/image_resolution_test.dart index 4508e6d..ebf2db3 100644 --- a/packages/flutter/test/widgets/image_resolution_test.dart +++ b/packages/flutter/test/widgets/image_resolution_test.dart
@@ -13,8 +13,6 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'image_data.dart'; - class TestImage implements ui.Image { TestImage(this.scale); final double scale; @@ -106,7 +104,7 @@ TestAssetImage(String name) : super(name); @override - ImageStreamCompleter load(AssetBundleImageKey key, DecoderCallback decode) { + ImageStreamCompleter load(AssetBundleImageKey key) { ImageInfo imageInfo; key.bundle.load(key.name).then<void>((ByteData data) { final TestByteData testData = data; @@ -152,30 +150,6 @@ ); } -Widget buildImageCacheResized(String name, Key key, int width, int height, int cacheWidth, int cacheHeight) { - return Center( - child: RepaintBoundary( - child: Container( - width: 250, - height: 250, - child: Center( - child: Image.memory( - Uint8List.fromList(kTransparentImage), - key: key, - excludeFromSemantics: true, - color: const Color(0xFF00FFFF), - colorBlendMode: BlendMode.plus, - width: width.toDouble(), - height: height.toDouble(), - cacheWidth: cacheWidth, - cacheHeight: cacheHeight, - ), - ), - ), - ), - ); -} - RenderImage getRenderImage(WidgetTester tester, Key key) { return tester.renderObject<RenderImage>(find.byKey(key)); } @@ -329,22 +303,4 @@ expect(getTestImage(tester, key).scale, 10.0); }); - testWidgets('Image cache resize upscale display 5', (WidgetTester tester) async { - final Key key = GlobalKey(); - await pumpTreeToLayout(tester, buildImageCacheResized(image, key, 5, 5, 20, 20)); - expect(getRenderImage(tester, key).size, const Size(5.0, 5.0)); - }); - - testWidgets('Image cache resize upscale display 50', (WidgetTester tester) async { - final Key key = GlobalKey(); - await pumpTreeToLayout(tester, buildImageCacheResized(image, key, 50, 50, 20, 20)); - expect(getRenderImage(tester, key).size, const Size(50.0, 50.0)); - }); - - testWidgets('Image cache resize downscale display 5', (WidgetTester tester) async { - final Key key = GlobalKey(); - await pumpTreeToLayout(tester, buildImageCacheResized(image, key, 5, 5, 1, 1)); - expect(getRenderImage(tester, key).size, const Size(5.0, 5.0)); - }); - }
diff --git a/packages/flutter/test/widgets/image_rtl_test.dart b/packages/flutter/test/widgets/image_rtl_test.dart index cd7222e..c2e6daf 100644 --- a/packages/flutter/test/widgets/image_rtl_test.dart +++ b/packages/flutter/test/widgets/image_rtl_test.dart
@@ -19,7 +19,7 @@ } @override - ImageStreamCompleter load(TestImageProvider key, DecoderCallback decode) { + ImageStreamCompleter load(TestImageProvider key) { return OneFrameImageStreamCompleter( SynchronousFuture<ImageInfo>(ImageInfo(image: TestImage())) );
diff --git a/packages/flutter/test/widgets/image_test.dart b/packages/flutter/test/widgets/image_test.dart index 5a400fe..da2a2f0 100644 --- a/packages/flutter/test/widgets/image_test.dart +++ b/packages/flutter/test/widgets/image_test.dart
@@ -1199,7 +1199,7 @@ } @override - ImageStreamCompleter load(TestImageProvider key, DecoderCallback decode) => _streamCompleter; + ImageStreamCompleter load(TestImageProvider key) => _streamCompleter; void complete() { _completer.complete(ImageInfo(image: TestImage()));