diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 2ad9fdb9b..cf93fde42 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -1175,26 +1175,26 @@ class ImageModel with ChangeNotifier { clearImage() => _image = null; - onRgba(int display, Uint8List rgba) { + onRgba(int display, Uint8List rgba) async { + try { + await decodeAndUpdate(display, rgba); + } catch (e) { + debugPrint('onRgba error: $e'); + } + platformFFI.nextRgba(sessionId, display); + } + + decodeAndUpdate(int display, Uint8List rgba) async { final pid = parent.target?.id; final rect = parent.target?.ffiModel.pi.getDisplayRect(display); - img.decodeImageFromPixels( - rgba, - rect?.width.toInt() ?? 0, - rect?.height.toInt() ?? 0, - isWeb ? ui.PixelFormat.rgba8888 : ui.PixelFormat.bgra8888, - onPixelsCopied: () { - // Unlock the rgba memory from rust codes. - platformFFI.nextRgba(sessionId, display); - }).then((image) { - if (parent.target?.id != pid) return; - try { - // my throw exception, because the listener maybe already dispose - update(image); - } catch (e) { - debugPrint('update image: $e'); - } - }); + final image = await img.decodeImageFromPixels( + rgba, + rect?.width.toInt() ?? 0, + rect?.height.toInt() ?? 0, + isWeb ? ui.PixelFormat.rgba8888 : ui.PixelFormat.bgra8888, + ); + if (parent.target?.id != pid) return; + await update(image); } update(ui.Image? image) async { @@ -2558,7 +2558,7 @@ class FFI { final rgba = platformFFI.getRgba(sessionId, display, sz); if (rgba != null) { onEvent2UIRgba(); - imageModel.onRgba(display, rgba); + await imageModel.onRgba(display, rgba); } else { platformFFI.nextRgba(sessionId, display); } @@ -2626,7 +2626,7 @@ class FFI { canvasModel.scale, ffiModel.pi.currentDisplay); } - imageModel.update(null); + await imageModel.update(null); cursorModel.clear(); ffiModel.clear(); canvasModel.clear(); diff --git a/flutter/lib/utils/image.dart b/flutter/lib/utils/image.dart index 6280555ba..d5042e61a 100644 --- a/flutter/lib/utils/image.dart +++ b/flutter/lib/utils/image.dart @@ -13,14 +13,12 @@ Future decodeImageFromPixels( int? rowBytes, int? targetWidth, int? targetHeight, - VoidCallback? onPixelsCopied, // must ensure onPixelsCopied is called no matter this function succeeds bool allowUpscaling = true, }) async { if (targetWidth != null) { assert(allowUpscaling || targetWidth <= width); if (!(allowUpscaling || targetWidth <= width)) { print("not allow upscaling but targetWidth > width"); - onPixelsCopied?.call(); return null; } } @@ -28,7 +26,6 @@ Future decodeImageFromPixels( assert(allowUpscaling || targetHeight <= height); if (!(allowUpscaling || targetHeight <= height)) { print("not allow upscaling but targetHeight > height"); - onPixelsCopied?.call(); return null; } } @@ -36,9 +33,7 @@ Future decodeImageFromPixels( final ui.ImmutableBuffer buffer; try { buffer = await ui.ImmutableBuffer.fromUint8List(pixels); - onPixelsCopied?.call(); } catch (e) { - onPixelsCopied?.call(); return null; }