From 8f23ecb7e2b057c7ffc918f20a0bca29186a1da4 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Thu, 12 Dec 2019 14:16:52 -0800 Subject: [PATCH 1/5] Made ios_platform_images set the correct image scale. --- packages/ios_platform_images/CHANGELOG.md | 3 + .../ios/Classes/IosPlatformImagesPlugin.m | 5 +- .../lib/ios_platform_images.dart | 66 +++++++++++++++---- packages/ios_platform_images/pubspec.yaml | 2 +- 4 files changed, 62 insertions(+), 14 deletions(-) diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md index 7745906c1edc..7e256db0f8ad 100644 --- a/packages/ios_platform_images/CHANGELOG.md +++ b/packages/ios_platform_images/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.0.2 +Fixed a bug where the scale value of the image wasn't respected. + ## 0.0.1 Initial release. Includes functionality to share images iOS images with Flutter diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m index df2e291129c1..1cd9fe5e1596 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m @@ -20,7 +20,10 @@ + (void)registerWithRegistrar:(NSObject*)registrar { UIImage* image = [UIImage imageNamed:name]; NSData* data = UIImagePNGRepresentation(image); if (data) { - result([FlutterStandardTypedData typedDataWithBytes:data]); + result(@{ + @"scale" : @(image.scale), + @"data" : [FlutterStandardTypedData typedDataWithBytes:data], + }); } else { result(nil); } diff --git a/packages/ios_platform_images/lib/ios_platform_images.dart b/packages/ios_platform_images/lib/ios_platform_images.dart index 1ee11e3995d2..bfa366a93896 100644 --- a/packages/ios_platform_images/lib/ios_platform_images.dart +++ b/packages/ios_platform_images/lib/ios_platform_images.dart @@ -8,20 +8,54 @@ import 'package:flutter/painting.dart'; import 'package:flutter/foundation.dart' show SynchronousFuture, describeIdentity; +class _FutureImageStreamCompleter extends ImageStreamCompleter { + final Future futureScale; + final InformationCollector informationCollector; + + _FutureImageStreamCompleter( + {Future codec, this.futureScale, this.informationCollector}) + : assert(codec != null), + assert(futureScale != null) { + codec.then(_onCodecReady, onError: (dynamic error, StackTrace stack) { + reportError( + context: ErrorDescription('resolving a single-frame image stream'), + exception: error, + stack: stack, + informationCollector: informationCollector, + silent: true, + ); + }); + } + + Future _onCodecReady(ui.Codec codec) async { + try { + ui.FrameInfo nextFrame = await codec.getNextFrame(); + double scale = await futureScale; + setImage(ImageInfo(image: nextFrame.image, scale: scale)); + } catch (exception, stack) { + reportError( + context: ErrorDescription('resolving an image frame'), + exception: exception, + stack: stack, + informationCollector: this.informationCollector, + silent: true, + ); + } + } +} + /// Performs exactly like a [MemoryImage] but instead of taking in bytes it takes /// in a future that represents bytes. class FutureMemoryImage extends ImageProvider { /// Constructor for FutureMemoryImage. [_futureBytes] is the bytes that will - /// be loaded into an image and [scale] is the scale that will be applied to + /// be loaded into an image and [_scale] is the scale that will be applied to /// that image to account for high-resolution images. - const FutureMemoryImage(this._futureBytes, {this.scale = 1.0}) + const FutureMemoryImage(this._futureBytes, this._futureScale) : assert(_futureBytes != null), - assert(scale != null); + assert(_futureScale != null); final Future _futureBytes; - - /// The scale to place in the ImageInfo object of the image. - final double scale; + final Future _futureScale; /// See [ImageProvider.obtainKey]. @override @@ -32,9 +66,9 @@ class FutureMemoryImage extends ImageProvider { /// See [ImageProvider.load]. @override ImageStreamCompleter load(FutureMemoryImage key, DecoderCallback decode) { - return MultiFrameImageStreamCompleter( + return _FutureImageStreamCompleter( codec: _loadAsync(key, decode), - scale: key.scale, + futureScale: _futureScale, ); } @@ -51,17 +85,18 @@ class FutureMemoryImage extends ImageProvider { bool operator ==(dynamic other) { if (other.runtimeType != runtimeType) return false; final FutureMemoryImage typedOther = other; - return _futureBytes == typedOther._futureBytes && scale == typedOther.scale; + return _futureBytes == typedOther._futureBytes && + _futureScale == typedOther._futureScale; } /// See [ImageProvider.hashCode]. @override - int get hashCode => hashValues(_futureBytes.hashCode, scale); + int get hashCode => hashValues(_futureBytes.hashCode, _futureScale); /// See [ImageProvider.toString]. @override String toString() => - '$runtimeType(${describeIdentity(_futureBytes)}, scale: $scale)'; + '$runtimeType(${describeIdentity(_futureBytes)}, scale: $_futureScale)'; } /// Class to help loading of iOS platform images into Flutter. @@ -78,7 +113,14 @@ class IosPlatformImages { /// /// See [https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed?language=objc] static FutureMemoryImage load(String name) { - return FutureMemoryImage(_channel.invokeMethod('loadImage', name)); + Future loadInfo = _channel.invokeMethod('loadImage', name); + Completer bytesCompleter = Completer(); + Completer scaleCompleter = Completer(); + loadInfo.then((map) { + scaleCompleter.complete(map["scale"]); + bytesCompleter.complete(map["data"]); + }); + return FutureMemoryImage(bytesCompleter.future, scaleCompleter.future); } /// Resolves an URL for a resource. The equivalent would be: diff --git a/packages/ios_platform_images/pubspec.yaml b/packages/ios_platform_images/pubspec.yaml index 08792afc6ba8..8a8181cb2fa9 100644 --- a/packages/ios_platform_images/pubspec.yaml +++ b/packages/ios_platform_images/pubspec.yaml @@ -1,6 +1,6 @@ name: ios_platform_images description: A plugin to share images between Flutter and iOS in add-to-app setups. -version: 0.0.1 +version: 0.0.2 homepage: https://github.com/flutter/plugins/tree/master/packages/ios_platform_images/ios_platform_images environment: From 46cc95b565630fd2a6f2af37312d5b25b08372d6 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Thu, 12 Dec 2019 16:09:12 -0800 Subject: [PATCH 2/5] Update packages/ios_platform_images/CHANGELOG.md Co-Authored-By: Collin Jackson --- packages/ios_platform_images/CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md index 7e256db0f8ad..a79a56b970f9 100644 --- a/packages/ios_platform_images/CHANGELOG.md +++ b/packages/ios_platform_images/CHANGELOG.md @@ -1,5 +1,6 @@ ## 0.0.2 -Fixed a bug where the scale value of the image wasn't respected. + +* Fixed a bug where the scale value of the image wasn't respected. ## 0.0.1 From 068827c1202192de6d25c9af4f435ec44a4364d9 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Thu, 12 Dec 2019 16:09:52 -0800 Subject: [PATCH 3/5] Update packages/ios_platform_images/CHANGELOG.md Co-Authored-By: Collin Jackson --- packages/ios_platform_images/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md index a79a56b970f9..2ccfd4139059 100644 --- a/packages/ios_platform_images/CHANGELOG.md +++ b/packages/ios_platform_images/CHANGELOG.md @@ -4,5 +4,5 @@ ## 0.0.1 -Initial release. Includes functionality to share images iOS images with Flutter +* Initial release. Includes functionality to share images iOS images with Flutter and Flutter assets with iOS. From ecf724dc27e2755340654d1a377e529a6d2f4537 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Thu, 12 Dec 2019 16:14:33 -0800 Subject: [PATCH 4/5] made FutureMemoryImage private --- .../lib/ios_platform_images.dart | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/ios_platform_images/lib/ios_platform_images.dart b/packages/ios_platform_images/lib/ios_platform_images.dart index bfa366a93896..c7c12616ec36 100644 --- a/packages/ios_platform_images/lib/ios_platform_images.dart +++ b/packages/ios_platform_images/lib/ios_platform_images.dart @@ -46,11 +46,11 @@ class _FutureImageStreamCompleter extends ImageStreamCompleter { /// Performs exactly like a [MemoryImage] but instead of taking in bytes it takes /// in a future that represents bytes. -class FutureMemoryImage extends ImageProvider { +class _FutureMemoryImage extends ImageProvider<_FutureMemoryImage> { /// Constructor for FutureMemoryImage. [_futureBytes] is the bytes that will - /// be loaded into an image and [_scale] is the scale that will be applied to + /// be loaded into an image and [_futureScale] is the scale that will be applied to /// that image to account for high-resolution images. - const FutureMemoryImage(this._futureBytes, this._futureScale) + const _FutureMemoryImage(this._futureBytes, this._futureScale) : assert(_futureBytes != null), assert(_futureScale != null); @@ -59,13 +59,13 @@ class FutureMemoryImage extends ImageProvider { /// See [ImageProvider.obtainKey]. @override - Future obtainKey(ImageConfiguration configuration) { - return SynchronousFuture(this); + Future<_FutureMemoryImage> obtainKey(ImageConfiguration configuration) { + return SynchronousFuture<_FutureMemoryImage>(this); } /// See [ImageProvider.load]. @override - ImageStreamCompleter load(FutureMemoryImage key, DecoderCallback decode) { + ImageStreamCompleter load(_FutureMemoryImage key, DecoderCallback decode) { return _FutureImageStreamCompleter( codec: _loadAsync(key, decode), futureScale: _futureScale, @@ -73,7 +73,7 @@ class FutureMemoryImage extends ImageProvider { } Future _loadAsync( - FutureMemoryImage key, DecoderCallback decode) async { + _FutureMemoryImage key, DecoderCallback decode) async { assert(key == this); return _futureBytes.then((Uint8List bytes) { return decode(bytes); @@ -84,7 +84,7 @@ class FutureMemoryImage extends ImageProvider { @override bool operator ==(dynamic other) { if (other.runtimeType != runtimeType) return false; - final FutureMemoryImage typedOther = other; + final _FutureMemoryImage typedOther = other; return _futureBytes == typedOther._futureBytes && _futureScale == typedOther._futureScale; } @@ -112,7 +112,7 @@ class IosPlatformImages { /// Throws an exception if the image can't be found. /// /// See [https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed?language=objc] - static FutureMemoryImage load(String name) { + static ImageProvider load(String name) { Future loadInfo = _channel.invokeMethod('loadImage', name); Completer bytesCompleter = Completer(); Completer scaleCompleter = Completer(); @@ -120,7 +120,7 @@ class IosPlatformImages { scaleCompleter.complete(map["scale"]); bytesCompleter.complete(map["data"]); }); - return FutureMemoryImage(bytesCompleter.future, scaleCompleter.future); + return _FutureMemoryImage(bytesCompleter.future, scaleCompleter.future); } /// Resolves an URL for a resource. The equivalent would be: From cbb82772d435dc11addf3c3e1b4c10cca02c18e0 Mon Sep 17 00:00:00 2001 From: Aaron Clarke Date: Fri, 13 Dec 2019 13:13:35 -0800 Subject: [PATCH 5/5] switched version to 0.1.0 --- packages/ios_platform_images/CHANGELOG.md | 2 +- packages/ios_platform_images/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md index 2ccfd4139059..704434d374d6 100644 --- a/packages/ios_platform_images/CHANGELOG.md +++ b/packages/ios_platform_images/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.0.2 +## 0.1.0 * Fixed a bug where the scale value of the image wasn't respected. diff --git a/packages/ios_platform_images/pubspec.yaml b/packages/ios_platform_images/pubspec.yaml index 8a8181cb2fa9..1b4cf46fa197 100644 --- a/packages/ios_platform_images/pubspec.yaml +++ b/packages/ios_platform_images/pubspec.yaml @@ -1,6 +1,6 @@ name: ios_platform_images description: A plugin to share images between Flutter and iOS in add-to-app setups. -version: 0.0.2 +version: 0.1.0 homepage: https://github.com/flutter/plugins/tree/master/packages/ios_platform_images/ios_platform_images environment: