mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
[web] Dispose a temporary image that may be created by instantiateImageCodecWithSize (flutter/engine#54096)
Fixes https://github.com/flutter/flutter/issues/147066
This commit is contained in:
parent
9a844d0d61
commit
d103053ca2
@ -130,6 +130,7 @@ class CkResizingCodec extends ResizingCodec {
|
||||
return image;
|
||||
}
|
||||
|
||||
image.dispose();
|
||||
return CkImage(skImage, imageSource: ImageBitmapImageSource(bitmap));
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,6 +21,11 @@ void main() {
|
||||
void testMain() {
|
||||
setUpCanvasKitTest();
|
||||
|
||||
tearDown(() {
|
||||
ui.Image.onCreate = null;
|
||||
ui.Image.onDispose = null;
|
||||
});
|
||||
|
||||
test('toImage succeeds', () async {
|
||||
final ui.Image image = await _createImage();
|
||||
expect(image.runtimeType.toString(), equals('CkImage'));
|
||||
@ -44,8 +49,6 @@ void testMain() {
|
||||
|
||||
expect(onCreateInvokedCount, 2);
|
||||
expect(createdImage, image2);
|
||||
|
||||
ui.Image.onCreate = null;
|
||||
});
|
||||
|
||||
test('dispose() invokes onDispose once', () async {
|
||||
@ -65,8 +68,6 @@ void testMain() {
|
||||
|
||||
expect(onDisposeInvokedCount, 2);
|
||||
expect(disposedImage, image2);
|
||||
|
||||
ui.Image.onDispose = null;
|
||||
});
|
||||
|
||||
test('fetchImage fetches image in chunks', () async {
|
||||
@ -106,6 +107,30 @@ void testMain() {
|
||||
expect(size?.width, 600);
|
||||
expect(size?.height, 300);
|
||||
});
|
||||
|
||||
test('instantiateImageCodecWithSize disposes temporary image', () async {
|
||||
final Set<ui.Image> activeImages = <ui.Image>{};
|
||||
ui.Image.onCreate = activeImages.add;
|
||||
ui.Image.onDispose = activeImages.remove;
|
||||
|
||||
final ui.Image image = await _createImage();
|
||||
final ByteData? imageData = await image.toByteData(format: ui.ImageByteFormat.png);
|
||||
final ui.ImmutableBuffer imageBuffer = await ui.ImmutableBuffer.fromUint8List(imageData!.buffer.asUint8List());
|
||||
image.dispose();
|
||||
|
||||
final ui.Codec codec = await ui.instantiateImageCodecWithSize(
|
||||
imageBuffer,
|
||||
getTargetSize: (w, h) => ui.TargetImageSize(width: w ~/ 2, height: h ~/ 2)
|
||||
);
|
||||
final ui.FrameInfo frameInfo = await codec.getNextFrame();
|
||||
|
||||
expect(activeImages.length, 1);
|
||||
|
||||
frameInfo.image.dispose();
|
||||
codec.dispose();
|
||||
|
||||
expect(activeImages.length, 0);
|
||||
});
|
||||
}
|
||||
|
||||
Future<ui.Image> _createImage() => _createPicture().toImage(10, 10);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user