summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2016-01-07 16:21:45 +0100
committerKonstantin Käfer <mail@kkaefer.com>2016-01-15 17:04:07 +0100
commitbd1f71cdbd4aa55ffa1beb61ddee1dd6da32412d (patch)
tree8bdc66df5446353faa2d315654f0f908c9d8098f /src
parent40e908677e58f186d13ef9a33d2dcde396390ac4 (diff)
downloadqtlocation-mapboxgl-bd1f71cdbd4aa55ffa1beb61ddee1dd6da32412d.tar.gz
[core] use stale sprite data
This is a naïve implementation that essentially merges updated data into existing data. It will *not* remove icons from the stale sprite if they aren't present in the fresh sprite (we aren't tracking the source of a sprite, and the user could have changed it as well). Similarly, it will not update icons that have changed in dimension. This is a rare edge case and probably not worth implementing.
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/sprite/sprite_store.cpp30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/mbgl/sprite/sprite_store.cpp b/src/mbgl/sprite/sprite_store.cpp
index 0c3a7d3ba0..8f99ea7626 100644
--- a/src/mbgl/sprite/sprite_store.cpp
+++ b/src/mbgl/sprite/sprite_store.cpp
@@ -40,15 +40,17 @@ void SpriteStore::setURL(const std::string& url) {
FileSource* fs = util::ThreadContext::getFileSource();
loader->jsonRequest = fs->request({ Resource::Kind::SpriteJSON, jsonURL },
[this, jsonURL](Response res) {
- if (res.stale) {
- // Only handle fresh responses.
+ if (res.error) {
+ observer->onSpriteError(std::make_exception_ptr(std::runtime_error(res.error->message)));
+ }
+
+ if (res.notModified) {
+ // We got the same data back as last time. Abort early.
return;
}
- loader->jsonRequest = nullptr;
- if (res.error) {
- observer->onSpriteError(std::make_exception_ptr(std::runtime_error(res.error->message)));
- } else {
+ if (!loader->json || *loader->json != *res.data) {
+ // Only trigger a sprite loaded event we got new data.
loader->json = res.data;
emitSpriteLoadedIfComplete();
}
@@ -57,15 +59,16 @@ void SpriteStore::setURL(const std::string& url) {
loader->spriteRequest =
fs->request({ Resource::Kind::SpriteImage, spriteURL },
[this, spriteURL](Response res) {
- if (res.stale) {
- // Only handle fresh responses.
+ if (res.error) {
+ observer->onSpriteError(std::make_exception_ptr(std::runtime_error(res.error->message)));
+ }
+
+ if (res.notModified) {
+ // We got the same data back as last time. Abort early.
return;
}
- loader->spriteRequest = nullptr;
- if (res.error) {
- observer->onSpriteError(std::make_exception_ptr(std::runtime_error(res.error->message)));
- } else {
+ if (!loader->image || *loader->image != *res.data) {
loader->image = res.data;
emitSpriteLoadedIfComplete();
}
@@ -79,8 +82,7 @@ void SpriteStore::emitSpriteLoadedIfComplete() {
return;
}
- auto local = std::move(loader);
- auto result = parseSprite(*local->image, *local->json);
+ auto result = parseSprite(*loader->image, *loader->json);
if (result.is<Sprites>()) {
loaded = true;
setSprites(result.get<Sprites>());