@@ -15,24 +15,33 @@ void skiaInstantiateImageCodec(Uint8List list, Callback<ui.Codec> callback,
1515 callback (codec);
1616}
1717
18- /// Instantiates a [ui.Codec] backed by an `SkAnimatedImage` from Skia after requesting from URI.
19- void skiaInstantiateWebImageCodec (String src, Callback <ui.Codec > callback,
20- WebOnlyImageCodecChunkCallback ? chunkCallback) {
21- chunkCallback? .call (0 , 100 );
18+ /// Instantiates a [ui.Codec] backed by an `SkAnimatedImage` from Skia after
19+ /// requesting from URI.
20+ Future <ui.Codec > skiaInstantiateWebImageCodec (
21+ String src, WebOnlyImageCodecChunkCallback ? chunkCallback) {
22+ Completer <ui.Codec > completer = Completer <ui.Codec >();
2223 //TODO: Switch to using MakeImageFromCanvasImageSource when animated images are supported.
23- html.HttpRequest .request (
24- src,
25- responseType: "arraybuffer" ,
26- ).then ((html.HttpRequest response) {
27- chunkCallback? .call (100 , 100 );
24+ html.HttpRequest .request (src, responseType: "arraybuffer" ,
25+ onProgress: (html.ProgressEvent event) {
26+ if (event.lengthComputable) {
27+ chunkCallback? .call (event.loaded! , event.total! );
28+ }
29+ }).then ((html.HttpRequest response) {
30+ if (response.status != 200 ) {
31+ completer.completeError (Exception (
32+ 'Network image request failed with status: ${response .status }' ));
33+ }
2834 final Uint8List list =
2935 new Uint8List .view ((response.response as ByteBuffer ));
3036 final SkAnimatedImage skAnimatedImage =
3137 canvasKit.MakeAnimatedImageFromEncoded (list);
3238 final CkAnimatedImage animatedImage = CkAnimatedImage (skAnimatedImage);
3339 final CkAnimatedImageCodec codec = CkAnimatedImageCodec (animatedImage);
34- callback (codec);
40+ completer.complete (codec);
41+ }, onError: (dynamic error) {
42+ completer.completeError (error);
3543 });
44+ return completer.future;
3645}
3746
3847/// A wrapper for `SkAnimatedImage` .
@@ -43,7 +52,8 @@ class CkAnimatedImage implements ui.Image {
4352 // being garbage-collected, or by an explicit call to [delete].
4453 late final SkiaObjectBox box;
4554
46- CkAnimatedImage (SkAnimatedImage skAnimatedImage) : this ._(skAnimatedImage, null );
55+ CkAnimatedImage (SkAnimatedImage skAnimatedImage)
56+ : this ._(skAnimatedImage, null );
4757
4858 CkAnimatedImage ._(this ._skAnimatedImage, SkiaObjectBox ? boxToClone) {
4959 if (boxToClone != null ) {
@@ -66,19 +76,21 @@ class CkAnimatedImage implements ui.Image {
6676 if (assertionsEnabled) {
6777 return _disposed;
6878 }
69- throw StateError ('Image.debugDisposed is only available when asserts are enabled.' );
79+ throw StateError (
80+ 'Image.debugDisposed is only available when asserts are enabled.' );
7081 }
7182
7283 ui.Image clone () => CkAnimatedImage ._(_skAnimatedImage, box);
7384
7485 @override
7586 bool isCloneOf (ui.Image other) {
76- return other is CkAnimatedImage
77- && other._skAnimatedImage.isAliasOf (_skAnimatedImage);
87+ return other is CkAnimatedImage &&
88+ other._skAnimatedImage.isAliasOf (_skAnimatedImage);
7889 }
7990
8091 @override
81- List <StackTrace >? debugGetOpenHandleStackTraces () => box.debugGetStackTraces ();
92+ List <StackTrace >? debugGetOpenHandleStackTraces () =>
93+ box.debugGetStackTraces ();
8294
8395 int get frameCount => _skAnimatedImage.getFrameCount ();
8496
@@ -115,8 +127,9 @@ class CkAnimatedImage implements ui.Image {
115127 );
116128 bytes = _skAnimatedImage.readPixels (imageInfo, 0 , 0 );
117129 } else {
118- final SkData skData = _skAnimatedImage.encodeToData (); //defaults to PNG 100%
119- // make a copy that we can return
130+ // Defaults to PNG 100%.
131+ final SkData skData = _skAnimatedImage.encodeToData ();
132+ // Make a copy that we can return.
120133 bytes = Uint8List .fromList (canvasKit.getSkDataBytes (skData));
121134 }
122135
@@ -162,20 +175,21 @@ class CkImage implements ui.Image {
162175 if (assertionsEnabled) {
163176 return _disposed;
164177 }
165- throw StateError ('Image.debugDisposed is only available when asserts are enabled.' );
178+ throw StateError (
179+ 'Image.debugDisposed is only available when asserts are enabled.' );
166180 }
167181
168182 @override
169183 ui.Image clone () => CkImage ._(skImage, box);
170184
171185 @override
172186 bool isCloneOf (ui.Image other) {
173- return other is CkImage
174- && other.skImage.isAliasOf (skImage);
187+ return other is CkImage && other.skImage.isAliasOf (skImage);
175188 }
176189
177190 @override
178- List <StackTrace >? debugGetOpenHandleStackTraces () => box.debugGetStackTraces ();
191+ List <StackTrace >? debugGetOpenHandleStackTraces () =>
192+ box.debugGetStackTraces ();
179193
180194 @override
181195 int get width => skImage.width ();
0 commit comments