Convert image_cache to using Futures rather than callbacks

Future<sky.Image> is easier to work with than a callback that provides an
image. It will also let us use other images sources that vend futures to
images.

R=jackson@google.com

Review URL: https://codereview.chromium.org/1216303005.
This commit is contained in:
Adam Barth 2015-07-01 12:15:48 -07:00
parent f3410b4f51
commit 839cc4cc72
6 changed files with 26 additions and 19 deletions

View File

@ -18,7 +18,7 @@ class ImageMap {
}
void _addURL(String url) {
image_cache.load(url, (Image image) {
image_cache.load(url).then((Image image) {
// Store reference to image
_images[url] = image;
@ -34,4 +34,4 @@ class ImageMap {
Image getImage(String url) => _images[url];
Image operator [](String url) => _images[url];
}
}

View File

@ -59,7 +59,7 @@ bool handleEvent(Event event) {
}
if (event.type == "pointerup") {
image_cache.load(url2, handleImageLoad);
image_cache.load(url2).then(handleImageLoad);
return true;
}
@ -67,8 +67,7 @@ bool handleEvent(Event event) {
}
void main() {
image_cache.load(url1, handleImageLoad);
image_cache.load(url1, handleImageLoad);
image_cache.load(url1).then(handleImageLoad);
view.setEventCallback(handleEvent);
view.setBeginFrameCallback(beginFrame);
}

View File

@ -12,7 +12,7 @@ import 'shell.dart' as shell;
import 'net/fetch.dart';
Future<sky.Image> _decodeImage(core.MojoDataPipeConsumer assetData) {
Completer<sky.Image> completer = new Completer();
Completer<sky.Image> completer = new Completer<sky.Image>();
new sky.ImageDecoder(assetData.handle.h, completer.complete);
return completer.future;
}

View File

@ -2,27 +2,28 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:sky';
import 'dart:async';
import 'dart:sky' as sky;
import 'dart:collection';
import 'package:mojom/mojo/url_response.mojom.dart';
import 'fetch.dart';
final HashMap<String, List<ImageDecoderCallback>> _pendingRequests =
new HashMap<String, List<ImageDecoderCallback>>();
final HashMap<String, List<sky.ImageDecoderCallback>> _pendingRequests =
new HashMap<String, List<sky.ImageDecoderCallback>>();
final HashMap<String, Image> _completedRequests =
new HashMap<String, Image>();
final HashMap<String, sky.Image> _completedRequests =
new HashMap<String, sky.Image>();
void _loadComplete(url, image) {
void _loadComplete(String url, sky.Image image) {
_completedRequests[url] = image;
_pendingRequests[url].forEach((c) => c(image));
_pendingRequests.remove(url);
}
void load(String url, ImageDecoderCallback callback) {
Image result = _completedRequests[url];
void _load(String url, sky.ImageDecoderCallback callback) {
sky.Image result = _completedRequests[url];
if (result != null) {
callback(_completedRequests[url]);
return;
@ -31,7 +32,7 @@ void load(String url, ImageDecoderCallback callback) {
bool newRequest = false;
_pendingRequests.putIfAbsent(url, () {
newRequest = true;
return new List<ImageDecoderCallback>();
return new List<sky.ImageDecoderCallback>();
}).add(callback);
if (newRequest) {
fetchUrl(url).then((UrlResponse response) {
@ -39,8 +40,15 @@ void load(String url, ImageDecoderCallback callback) {
_loadComplete(url, null);
return;
}
new ImageDecoder(response.body.handle.h,
(image) => _loadComplete(url, image));
new sky.ImageDecoder(response.body.handle.h, (image) {
_loadComplete(url, image);
});
});
}
}
Future<sky.Image> load(String url) {
Completer<sky.Image> completer = new Completer<sky.Image>();
_load(url, completer.complete);
return completer.future;
}

View File

@ -140,7 +140,7 @@ class BackgroundImage {
this.fit: BackgroundFit.scaleDown,
this.repeat: BackgroundRepeat.noRepeat
}) {
image_cache.load(src, (image) {
image_cache.load(src).then((image) {
if (image == null)
return;
_image = image;

View File

@ -904,7 +904,7 @@ class RenderImage extends RenderBox {
if (value == _src)
return;
_src = value;
image_cache.load(_src, (result) {
image_cache.load(_src).then((result) {
_image = result;
if (requestedSize.width == null || requestedSize.height == null)
markNeedsLayout();