mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
Implement a simple image cache for Sky in Dart. This doesn't yet do any eviction from the cache.
R=abarth@chromium.org, abarth Review URL: https://codereview.chromium.org/1165753004
This commit is contained in:
parent
568b39c889
commit
f396442e0a
@ -13,16 +13,13 @@ namespace blink {
|
||||
CanvasImageLoader::CanvasImageLoader(const String& src, PassOwnPtr<ImageLoaderCallback> callback)
|
||||
: callback_(callback) {
|
||||
// TODO(jackson): Figure out how to determine the proper base URL here
|
||||
url_ = KURL(KURL(), src);
|
||||
KURL url = KURL(KURL(), src);
|
||||
fetcher_ = adoptPtr(new MojoFetcher(this, url));
|
||||
}
|
||||
|
||||
CanvasImageLoader::~CanvasImageLoader() {
|
||||
}
|
||||
|
||||
void CanvasImageLoader::load() {
|
||||
fetcher_ = adoptPtr(new MojoFetcher(this, url_));
|
||||
}
|
||||
|
||||
void CanvasImageLoader::OnReceivedResponse(mojo::URLResponsePtr response) {
|
||||
if (response->status_code != 200) {
|
||||
callback_->handleEvent(nullptr);
|
||||
|
||||
@ -28,8 +28,6 @@ class CanvasImageLoader : public MojoFetcher::Client,
|
||||
}
|
||||
virtual ~CanvasImageLoader();
|
||||
|
||||
void load();
|
||||
|
||||
// MojoFetcher::Client
|
||||
void OnReceivedResponse(mojo::URLResponsePtr) override;
|
||||
|
||||
@ -43,8 +41,6 @@ class CanvasImageLoader : public MojoFetcher::Client,
|
||||
OwnPtr<MojoFetcher> fetcher_;
|
||||
OwnPtr<mojo::common::DataPipeDrainer> drainer_;
|
||||
RefPtr<SharedBuffer> buffer_;
|
||||
|
||||
KURL url_;
|
||||
OwnPtr<ImageLoaderCallback> callback_;
|
||||
};
|
||||
|
||||
|
||||
@ -6,5 +6,4 @@
|
||||
Constructor(DOMString src, ImageLoaderCallback callback),
|
||||
ImplementedAs=CanvasImageLoader,
|
||||
] interface ImageLoader {
|
||||
void load();
|
||||
};
|
||||
|
||||
@ -6,6 +6,6 @@
|
||||
Constructor(),
|
||||
ImplementedAs=CanvasImage,
|
||||
] interface Image {
|
||||
readonly attribute long width;
|
||||
readonly attribute long height;
|
||||
readonly attribute long width; // width in number of image pixels
|
||||
readonly attribute long height; // height in number of image pixels
|
||||
};
|
||||
|
||||
@ -3,10 +3,13 @@
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:sky';
|
||||
import 'package:sky/framework/net/image_cache.dart' as image_cache;
|
||||
|
||||
double timeBase = null;
|
||||
|
||||
Image image = null;
|
||||
String url1 = "https://www.dartlang.org/logos/dart-logo.png";
|
||||
String url2 = "http://i2.kym-cdn.com/photos/images/facebook/000/581/296/c09.jpg";
|
||||
|
||||
void beginFrame(double timeStamp) {
|
||||
if (timeBase == null) timeBase = timeStamp;
|
||||
@ -22,15 +25,32 @@ void beginFrame(double timeStamp) {
|
||||
view.scheduleFrame();
|
||||
}
|
||||
|
||||
void handleImageLoad(result) {
|
||||
if (result != image) {
|
||||
print("${result.width}x${result.width} image loaded!");
|
||||
image = result;
|
||||
view.scheduleFrame();
|
||||
} else {
|
||||
print("Existing image was loaded again");
|
||||
}
|
||||
}
|
||||
|
||||
bool handleEvent(Event event) {
|
||||
if (event.type == "pointerdown") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (event.type == "pointerup") {
|
||||
image_cache.load(url2, handleImageLoad);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void main() {
|
||||
new ImageLoader("https://www.dartlang.org/logos/dart-logo.png", (result) {
|
||||
if (result != null) {
|
||||
print("${result.width}x${result.width} image loaded!");
|
||||
image = result;
|
||||
view.scheduleFrame();
|
||||
} else {
|
||||
print("Image failed to load");
|
||||
}
|
||||
}).load();
|
||||
image_cache.load(url1, handleImageLoad);
|
||||
image_cache.load(url1, handleImageLoad);
|
||||
view.setEventCallback(handleEvent);
|
||||
view.setBeginFrameCallback(beginFrame);
|
||||
}
|
||||
|
||||
@ -93,6 +93,7 @@ dart_pkg("sdk") {
|
||||
"lib/framework/fn2.dart",
|
||||
"lib/framework/layout.dart",
|
||||
"lib/framework/net/fetch.dart",
|
||||
"lib/framework/net/image_cache.dart",
|
||||
"lib/framework/node.dart",
|
||||
"lib/framework/reflect.dart",
|
||||
"lib/framework/rendering/render_block.dart",
|
||||
|
||||
33
sdk/lib/framework/net/image_cache.dart
Normal file
33
sdk/lib/framework/net/image_cache.dart
Normal file
@ -0,0 +1,33 @@
|
||||
// Copyright 2015 The Chromium Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:sky' as sky;
|
||||
import 'dart:collection';
|
||||
|
||||
final HashMap<String, List<sky.ImageLoaderCallback>> _pendingRequests =
|
||||
new HashMap<String, List<sky.ImageLoaderCallback>>();
|
||||
|
||||
final HashMap<String, sky.Image> _completedRequests =
|
||||
new HashMap<String, sky.Image>();
|
||||
|
||||
void load(String url, sky.ImageLoaderCallback callback) {
|
||||
sky.Image result = _completedRequests[url];
|
||||
if (result != null) {
|
||||
callback(_completedRequests[url]);
|
||||
return;
|
||||
}
|
||||
|
||||
bool newRequest = false;
|
||||
_pendingRequests.putIfAbsent(url, () {
|
||||
newRequest = true;
|
||||
return new List<sky.ImageLoaderCallback>();
|
||||
}).add(callback);
|
||||
if (newRequest) {
|
||||
new sky.ImageLoader(url, (image) {
|
||||
_completedRequests[url] = image;
|
||||
_pendingRequests[url].forEach((c) => c(image));
|
||||
_pendingRequests.remove(url);
|
||||
});
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user