From bd1f71cdbd4aa55ffa1beb61ddee1dd6da32412d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20K=C3=A4fer?= Date: Thu, 7 Jan 2016 16:21:45 +0100 Subject: [core] use stale sprite data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- src/mbgl/sprite/sprite_store.cpp | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'src/mbgl/sprite') 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()) { loaded = true; setSprites(result.get()); -- cgit v1.2.1