diff --git a/bin/style.js b/bin/style.js index cca10b346..35346fe91 100644 --- a/bin/style.js +++ b/bin/style.js @@ -2085,8 +2085,7 @@ module.exports = { "filter": { "scalerank": [1, 2] }, "type": "symbol", "render": { - "icon-image": "{maki}-12", - "icon-size": 12 + "icon-image": "{maki}-12" }, "style.night": {} }, { @@ -2123,8 +2122,7 @@ module.exports = { "filter": { "scalerank": 3 }, "type": "symbol", "render": { - "icon-image": "{maki}-12", - "icon-size": 12 + "icon-image": "{maki}-12" }, "style": { "icon-opacity": { @@ -2176,8 +2174,7 @@ module.exports = { "filter": { "scalerank": 4 }, "type": "symbol", "render": { - "icon-image": "{maki}-12", - "icon-size": 12 + "icon-image": "{maki}-12" }, "style": { "icon-opacity": { @@ -2229,8 +2226,7 @@ module.exports = { "filter": { "maki": "airport" }, "type": "symbol", "render": { - "icon-image": "{maki}-12", - "icon-size": 12 + "icon-image": "{maki}-12" }, "style": { "icon-opacity": { diff --git a/include/mbgl/map/sprite.hpp b/include/mbgl/map/sprite.hpp index 40d37d5da..969f15c16 100644 --- a/include/mbgl/map/sprite.hpp +++ b/include/mbgl/map/sprite.hpp @@ -46,9 +46,13 @@ public: operator bool() const; +private: + const bool valid; + public: const float pixelRatio; - const std::string url; + const std::string spriteURL; + const std::string jsonURL; std::unique_ptr raster; private: diff --git a/src/map/map.cpp b/src/map/map.cpp index 269d174c8..e640ec68a 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -185,6 +185,7 @@ void Map::setup() { void Map::setStyleJSON(std::string newStyleJSON) { styleJSON.swap(newStyleJSON); + sprite.reset(); style->loadJSON((const uint8_t *)styleJSON.c_str()); update(); } @@ -202,9 +203,9 @@ std::string Map::getAccessToken() const { } std::shared_ptr Map::getSprite() { - float pixelRatio = state.getPixelRatio(); + const float pixelRatio = state.getPixelRatio(); const std::string &sprite_url = style->getSpriteURL(); - if (!sprite || sprite->pixelRatio != pixelRatio || sprite->url != sprite_url) { + if (!sprite || sprite->pixelRatio != pixelRatio) { sprite = Sprite::Create(sprite_url, pixelRatio); } @@ -531,11 +532,8 @@ void Map::prepare() { updateSources(); style->updateProperties(state.getNormalizedZoom(), animationTime); - if (pixelRatioChanged) { - spriteAtlas->resize(state.getPixelRatio()); - } - // Allow the sprite atlas to potentially pull new sprite images if needed. + spriteAtlas->resize(state.getPixelRatio()); spriteAtlas->update(*getSprite()); updateTiles(); diff --git a/src/map/sprite.cpp b/src/map/sprite.cpp index 6cf40f23f..1cbc220ac 100644 --- a/src/map/sprite.cpp +++ b/src/map/sprite.cpp @@ -27,8 +27,10 @@ std::shared_ptr Sprite::Create(const std::string& base_url, float pixelR } Sprite::Sprite(const Key &, const std::string& base_url, float pixelRatio) - : pixelRatio(pixelRatio), - url(base_url), + : valid(base_url.length() > 0), + pixelRatio(pixelRatio), + spriteURL(base_url + (pixelRatio > 1 ? "@2x" : "") + ".png"), + jsonURL(base_url + (pixelRatio > 1 ? "@2x" : "") + ".json"), raster(), loadedImage(false), loadedJSON(false), @@ -40,7 +42,7 @@ void Sprite::waitUntilLoaded() const { } Sprite::operator bool() const { - return isLoaded() && !pos.empty(); + return valid && isLoaded() && !pos.empty(); } @@ -48,8 +50,8 @@ Sprite::operator bool() const { // The reason this isn't part of the constructor is that calling shared_from_this() in // the constructor fails. void Sprite::load() { - if (url.length() == 0) { - // Treat a non-existent sprite as an empty sprite. + if (!valid) { + // Treat a non-existent sprite as a successfully loaded empty sprite. loadedImage = true; loadedJSON = true; promise.set_value(); @@ -58,28 +60,24 @@ void Sprite::load() { std::shared_ptr sprite = shared_from_this(); - const std::string suffix = (pixelRatio > 1 ? "@2x" : ""); - - platform::request_http(url + suffix + ".json", [sprite](platform::Response *res) { + platform::request_http(jsonURL, [sprite](platform::Response *res) { if (res->code == 200) { sprite->body.swap(res->body); sprite->parseJSON(); sprite->complete(); } else { - fprintf(stderr, "failed to load sprite info\n"); - fprintf(stderr, "error %d: %s\n", res->code, res->error_message.c_str()); + Log::Warning(Event::Sprite, "Failed to load sprite info: Error %d: %s", res->code, res->error_message.c_str()); sprite->promise.set_exception(std::make_exception_ptr(std::runtime_error(res->error_message))); } }); - platform::request_http(url + suffix + ".png", [sprite](platform::Response *res) { + platform::request_http(spriteURL, [sprite](platform::Response *res) { if (res->code == 200) { sprite->image.swap(res->body); sprite->parseImage(); sprite->complete(); } else { - fprintf(stderr, "failed to load sprite image\n"); - fprintf(stderr, "error %d: %s\n", res->code, res->error_message.c_str()); + Log::Warning(Event::Sprite, "Failed to load sprite image: Error %d: %s", res->code, res->error_message.c_str()); sprite->promise.set_exception(std::make_exception_ptr(std::runtime_error(res->error_message))); } }); @@ -87,7 +85,7 @@ void Sprite::load() { void Sprite::complete() { if (loadedImage && loadedJSON) { - Log::Info(Event::Sprite, "loaded %s", url.c_str()); + Log::Info(Event::Sprite, "loaded %s", spriteURL.c_str()); promise.set_value(); } }