summaryrefslogtreecommitdiff
path: root/src/mbgl/sprite
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/sprite')
-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>());