Skip to content

Commit be76969

Browse files
committed
## 3.5.0
* Breaking Change: remove loadBuffer method, and add loadImage method [flutter/flutter#118966] * Migrate to 3.7.0
1 parent 37bbeb1 commit be76969

12 files changed

+146
-82
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 3.5.0
2+
3+
* Breaking Change: remove loadBuffer method, and add loadImage method [https://github.com/flutter/flutter/pull/118966]
4+
* Migrate to 3.7.0
5+
16
## 3.4.2
27

38
* Fix issue that cannot compile ExtendedImage.file on the web (566#)

lib/extended_image_library.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ export 'src/extended_asset_bundle_image_provider.dart';
66
export 'src/extended_file_image_provider.dart';
77
export 'src/extended_image_provider.dart';
88
export 'src/extended_memory_image_provider.dart';
9-
export 'src/extended_network_image_provider.dart';
109
export 'src/extended_resize_image_provider.dart';
10+
export 'src/network/extended_network_image_provider.dart';
1111
export 'src/platform.dart';

lib/src/_platform_web.dart

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import 'dart:ui' as ui show Codec;
21
import 'package:flutter/foundation.dart';
32
import 'package:flutter/widgets.dart';
43

@@ -46,23 +45,6 @@ class FileImage extends ImageProvider<FileImage> {
4645
return SynchronousFuture<FileImage>(this);
4746
}
4847

49-
@override
50-
ImageStreamCompleter loadBuffer(FileImage key, DecoderBufferCallback decode) {
51-
return MultiFrameImageStreamCompleter(
52-
codec: _loadAsync(key, decode),
53-
scale: key.scale,
54-
debugLabel: key.file.path,
55-
informationCollector: () sync* {
56-
yield ErrorDescription('Path: ${file.path}');
57-
},
58-
);
59-
}
60-
61-
Future<ui.Codec> _loadAsync(
62-
FileImage key, DecoderBufferCallback decode) async {
63-
return Future<ui.Codec>.error(StateError('not support on web'));
64-
}
65-
6648
@override
6749
bool operator ==(Object other) {
6850
if (other.runtimeType != runtimeType) {

lib/src/extended_asset_bundle_image_provider.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ class ExtendedExactAssetImageProvider extends ExactAssetImage
4545
}
4646

4747
@override
48-
ImageStreamCompleter loadBuffer(
49-
AssetBundleImageKey key, DecoderBufferCallback decode) {
48+
ImageStreamCompleter loadImage(
49+
AssetBundleImageKey key, ImageDecoderCallback decode) {
5050
return MultiFrameImageStreamCompleter(
5151
codec: _loadAsync(key, decode),
5252
scale: key.scale,
@@ -63,7 +63,7 @@ class ExtendedExactAssetImageProvider extends ExactAssetImage
6363
/// This function is used by [load].
6464
@protected
6565
Future<ui.Codec> _loadAsync(
66-
AssetBundleImageKey key, DecoderBufferCallback decode) async {
66+
AssetBundleImageKey key, ImageDecoderCallback decode) async {
6767
ByteData data;
6868
// Hot reload/restart could change whether an asset bundle or key in a
6969
// bundle are available, or if it is a network backed bundle.
@@ -117,8 +117,8 @@ class ExtendedAssetImageProvider extends AssetImage
117117
}
118118

119119
@override
120-
ImageStreamCompleter loadBuffer(
121-
AssetBundleImageKey key, DecoderBufferCallback decode) {
120+
ImageStreamCompleter loadImage(
121+
AssetBundleImageKey key, ImageDecoderCallback decode) {
122122
return MultiFrameImageStreamCompleter(
123123
codec: _loadAsync(key, decode),
124124
scale: key.scale,
@@ -135,7 +135,7 @@ class ExtendedAssetImageProvider extends AssetImage
135135
/// This function is used by [load].
136136
@protected
137137
Future<ui.Codec> _loadAsync(
138-
AssetBundleImageKey key, DecoderBufferCallback decode) async {
138+
AssetBundleImageKey key, ImageDecoderCallback decode) async {
139139
ByteData data;
140140
// Hot reload/restart could change whether an asset bundle or key in a
141141
// bundle are available, or if it is a network backed bundle.

lib/src/extended_file_image_provider.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ class ExtendedFileImageProvider extends FileImage
2626
final String? imageCacheName;
2727

2828
@override
29-
ImageStreamCompleter loadBuffer(FileImage key, DecoderBufferCallback decode) {
29+
ImageStreamCompleter loadImage(FileImage key, ImageDecoderCallback decode) {
3030
return MultiFrameImageStreamCompleter(
3131
codec: _loadAsync(key, decode),
3232
scale: key.scale,
@@ -38,7 +38,7 @@ class ExtendedFileImageProvider extends FileImage
3838
}
3939

4040
Future<ui.Codec> _loadAsync(
41-
FileImage key, DecoderBufferCallback decode) async {
41+
FileImage key, ImageDecoderCallback decode) async {
4242
assert(key == this);
4343

4444
final Uint8List bytes = await file.readAsBytes();

lib/src/extended_image_provider.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ mixin ExtendedImageProvider<T extends Object> on ImageProvider<T> {
5656
/// for example, compress
5757
Future<ui.Codec> instantiateImageCodec(
5858
Uint8List data,
59-
DecoderBufferCallback decode,
59+
ImageDecoderCallback decode,
6060
) async {
6161
if (cacheRawData) {
6262
rawImageDataMap[this] = data;
@@ -104,8 +104,10 @@ mixin ExtendedImageProvider<T extends Object> on ImageProvider<T> {
104104
}
105105
final ImageStreamCompleter? completer = imageCache.putIfAbsent(
106106
key,
107-
() => loadBuffer(
108-
key, PaintingBinding.instance.instantiateImageCodecFromBuffer),
107+
() => loadImage(
108+
key,
109+
PaintingBinding.instance.instantiateImageCodecWithSize,
110+
),
109111
onError: handleError,
110112
);
111113
if (completer != null) {

lib/src/extended_memory_image_provider.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ class ExtendedMemoryImageProvider extends MemoryImage
2525

2626
@override
2727
Uint8List get rawImageData => bytes;
28+
2829
@override
29-
ImageStreamCompleter loadBuffer(
30-
MemoryImage key, DecoderBufferCallback decode) {
30+
ImageStreamCompleter loadImage(MemoryImage key, ImageDecoderCallback decode) {
3131
return MultiFrameImageStreamCompleter(
3232
codec: _loadAsync(key, decode),
3333
scale: key.scale,
3434
);
3535
}
3636

37-
Future<ui.Codec> _loadAsync(MemoryImage key, DecoderBufferCallback decode) {
37+
Future<ui.Codec> _loadAsync(MemoryImage key, ImageDecoderCallback decode) {
3838
assert(key == this);
3939
return instantiateImageCodec(bytes, decode);
4040
}

lib/src/extended_resize_image_provider.dart

Lines changed: 82 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class ExtendedResizeImage extends ImageProvider<_SizeAwareCacheKey>
2525
this.allowUpscaling = false,
2626
this.cacheRawData = false,
2727
this.imageCacheName,
28+
this.policy = ResizeImagePolicy.exact,
2829
}) : assert((compressionRatio != null &&
2930
compressionRatio > 0 &&
3031
compressionRatio < 1) ||
@@ -52,6 +53,11 @@ class ExtendedResizeImage extends ImageProvider<_SizeAwareCacheKey>
5253
/// The height the image should decode to and cache.
5354
final int? height;
5455

56+
/// The policy that determines how [width] and [height] are interpreted.
57+
///
58+
/// Defaults to [ResizeImagePolicy.exact].
59+
final ResizeImagePolicy policy;
60+
5561
/// Whether the [width] and [height] parameters should be clamped to the
5662
/// intrinsic width and height of the image.
5763
///
@@ -108,17 +114,21 @@ class ExtendedResizeImage extends ImageProvider<_SizeAwareCacheKey>
108114
}
109115

110116
@override
111-
ImageStreamCompleter loadBuffer(
112-
_SizeAwareCacheKey key, DecoderBufferCallback decode) {
113-
Future<Codec> decodeResize(ImmutableBuffer buffer,
114-
{int? cacheWidth, int? cacheHeight, bool? allowUpscaling}) {
117+
ImageStreamCompleter loadImage(
118+
_SizeAwareCacheKey key, ImageDecoderCallback decode) {
119+
Future<Codec> decodeResize(
120+
ImmutableBuffer buffer, {
121+
TargetImageSizeCallback? getTargetSize,
122+
}) {
115123
assert(
116-
cacheWidth == null && cacheHeight == null && allowUpscaling == null,
124+
getTargetSize == null,
117125
'ResizeImage cannot be composed with another ImageProvider that applies '
118126
'cacheWidth, cacheHeight, or allowUpscaling.',
119127
);
128+
120129
return _instantiateImageCodec(
121130
buffer,
131+
decode,
122132
compressionRatio: compressionRatio,
123133
maxBytes: maxBytes,
124134
targetWidth: width,
@@ -127,7 +137,7 @@ class ExtendedResizeImage extends ImageProvider<_SizeAwareCacheKey>
127137
}
128138

129139
final ImageStreamCompleter completer =
130-
imageProvider.loadBuffer(key._providerCacheKey, decodeResize);
140+
imageProvider.loadImage(key._providerCacheKey, decodeResize);
131141
if (!kReleaseMode) {
132142
completer.debugLabel =
133143
'${completer.debugLabel} - Resized(${key._width}×${key._height})';
@@ -178,7 +188,8 @@ class ExtendedResizeImage extends ImageProvider<_SizeAwareCacheKey>
178188
}
179189

180190
Future<Codec> _instantiateImageCodec(
181-
ImmutableBuffer buffer, {
191+
ImmutableBuffer buffer,
192+
ImageDecoderCallback decode, {
182193
double? compressionRatio,
183194
int? maxBytes,
184195
int? targetWidth,
@@ -205,14 +216,71 @@ class ExtendedResizeImage extends ImageProvider<_SizeAwareCacheKey>
205216
);
206217
targetWidth = size.width;
207218
targetHeight = size.height;
208-
} else if (!allowUpscaling) {
209-
if (targetWidth != null && targetWidth > descriptor.width) {
210-
targetWidth = descriptor.width;
211-
}
212-
if (targetHeight != null && targetHeight > descriptor.height) {
213-
targetHeight = descriptor.height;
214-
}
215219
}
220+
// else if (!allowUpscaling) {
221+
// if (targetWidth != null && targetWidth > descriptor.width) {
222+
// targetWidth = descriptor.width;
223+
// }
224+
// if (targetHeight != null && targetHeight > descriptor.height) {
225+
// targetHeight = descriptor.height;
226+
// }
227+
// }
228+
else {
229+
return decode(buffer,
230+
getTargetSize: (int intrinsicWidth, int intrinsicHeight) {
231+
switch (policy) {
232+
case ResizeImagePolicy.exact:
233+
int? targetWidth = width;
234+
int? targetHeight = height;
235+
236+
if (!allowUpscaling) {
237+
if (targetWidth != null && targetWidth > intrinsicWidth) {
238+
targetWidth = intrinsicWidth;
239+
}
240+
if (targetHeight != null && targetHeight > intrinsicHeight) {
241+
targetHeight = intrinsicHeight;
242+
}
243+
}
244+
245+
return TargetImageSize(width: targetWidth, height: targetHeight);
246+
case ResizeImagePolicy.fit:
247+
final double aspectRatio = intrinsicWidth / intrinsicHeight;
248+
final int maxWidth = width ?? intrinsicWidth;
249+
final int maxHeight = height ?? intrinsicHeight;
250+
int targetWidth = intrinsicWidth;
251+
int targetHeight = intrinsicHeight;
252+
253+
if (targetWidth > maxWidth) {
254+
targetWidth = maxWidth;
255+
targetHeight = targetWidth ~/ aspectRatio;
256+
}
257+
258+
if (targetHeight > maxHeight) {
259+
targetHeight = maxHeight;
260+
targetWidth = (targetHeight * aspectRatio).floor();
261+
}
262+
263+
if (allowUpscaling) {
264+
if (width == null) {
265+
assert(height != null);
266+
targetHeight = height!;
267+
targetWidth = (targetHeight * aspectRatio).floor();
268+
} else if (height == null) {
269+
targetWidth = width!;
270+
targetHeight = targetWidth ~/ aspectRatio;
271+
} else {
272+
final int derivedMaxWidth = (maxHeight * aspectRatio).floor();
273+
final int derivedMaxHeight = maxWidth ~/ aspectRatio;
274+
targetWidth = min(maxWidth, derivedMaxWidth);
275+
targetHeight = min(maxHeight, derivedMaxHeight);
276+
}
277+
}
278+
279+
return TargetImageSize(width: targetWidth, height: targetHeight);
280+
}
281+
});
282+
}
283+
216284
return descriptor.instantiateCodec(
217285
targetWidth: targetWidth,
218286
targetHeight: targetHeight,

lib/src/extended_network_image_provider.dart renamed to lib/src/network/extended_network_image_provider.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import 'dart:async';
22
import 'dart:typed_data';
3+
import 'package:extended_image_library/src/extended_image_provider.dart';
34
import 'package:flutter/painting.dart';
45
import 'package:http_client_helper/http_client_helper.dart';
5-
import '_network_image_io.dart' if (dart.library.html) '_network_image_web.dart'
6+
import 'network_image_io.dart' if (dart.library.html) '_network_image_web.dart'
67
as network_image;
7-
import 'extended_image_provider.dart';
88

9+
/// [NetworkImage]
910
abstract class ExtendedNetworkImageProvider
1011
extends ImageProvider<ExtendedNetworkImageProvider>
1112
with ExtendedImageProvider<ExtendedNetworkImageProvider> {
@@ -62,10 +63,6 @@ abstract class ExtendedNetworkImageProvider
6263
/// After this time the cache is expired and the image is reloaded.
6364
Duration? get cacheMaxAge;
6465

65-
@override
66-
ImageStreamCompleter loadBuffer(
67-
ExtendedNetworkImageProvider key, DecoderBufferCallback decode);
68-
6966
///get network image data from cached
7067
Future<Uint8List?> getNetworkImageData({
7168
StreamController<ImageChunkEvent>? chunkEvents,

lib/src/_network_image_io.dart renamed to lib/src/network/network_image_io.dart

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import 'dart:async';
22
import 'dart:io';
33
import 'dart:ui' as ui show Codec;
4+
import 'package:extended_image_library/src/extended_image_provider.dart';
5+
import 'package:extended_image_library/src/platform.dart';
46
import 'package:flutter/foundation.dart';
57
import 'package:flutter/widgets.dart';
68
import 'package:http_client_helper/http_client_helper.dart';
79
import 'package:path/path.dart';
810
import 'package:path_provider/path_provider.dart';
9-
import 'extended_image_provider.dart';
11+
1012
import 'extended_network_image_provider.dart' as image_provider;
11-
import 'platform.dart';
1213

1314
class ExtendedNetworkImageProvider
1415
extends ImageProvider<image_provider.ExtendedNetworkImageProvider>
@@ -90,9 +91,10 @@ class ExtendedNetworkImageProvider
9091
final Duration? cacheMaxAge;
9192

9293
@override
93-
ImageStreamCompleter loadBuffer(
94-
image_provider.ExtendedNetworkImageProvider key,
95-
DecoderBufferCallback decode) {
94+
ImageStreamCompleter loadImage(
95+
image_provider.ExtendedNetworkImageProvider key,
96+
ImageDecoderCallback decode,
97+
) {
9698
// Ownership of this controller is handed off to [_loadAsync]; it is that
9799
// method's responsibility to close the controller's stream when the image
98100
// has been loaded or an error is thrown.
@@ -127,7 +129,7 @@ class ExtendedNetworkImageProvider
127129
Future<ui.Codec> _loadAsync(
128130
ExtendedNetworkImageProvider key,
129131
StreamController<ImageChunkEvent> chunkEvents,
130-
DecoderBufferCallback decode,
132+
ImageDecoderCallback decode,
131133
) async {
132134
assert(key == this);
133135
final String md5Key = cacheKey ?? keyToMd5(key.url);

0 commit comments

Comments
 (0)