diff options
Diffstat (limited to 'src/mbgl/map/live_tile_data.cpp')
-rw-r--r-- | src/mbgl/map/live_tile_data.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/mbgl/map/live_tile_data.cpp b/src/mbgl/map/live_tile_data.cpp index f6e14fad10..fb8e6c3605 100644 --- a/src/mbgl/map/live_tile_data.cpp +++ b/src/mbgl/map/live_tile_data.cpp @@ -6,6 +6,7 @@ #include <mbgl/util/worker.hpp> #include <mbgl/util/work_request.hpp> #include <mbgl/style/style.hpp> +#include <mbgl/style/style_bucket.hpp> #include <sstream> @@ -32,21 +33,27 @@ LiveTileData::LiveTileData(const TileID& id_, return; } - reparse(callback); + parsePending(callback); } -bool LiveTileData::reparse(std::function<void()> callback) { - if (parsing || (state != State::loaded && state != State::partial)) { +bool LiveTileData::parsePending(std::function<void()> callback) { + if (workRequest || (state != State::loaded && state != State::partial)) { return false; } - parsing = true; - workRequest = worker.parseLiveTile(tileWorker, *tile, [this, callback] (TileParseResult result) { - parsing = false; + workRequest.reset(); + + if (result.is<TileParseResultBuckets>()) { + auto& resultBuckets = result.get<TileParseResultBuckets>(); + state = resultBuckets.state; + + // Move over all buckets we received in this parse request, potentially overwriting + // existing buckets in case we got a refresh parse. + for (auto& bucket : resultBuckets.buckets) { + buckets[bucket.first] = std::move(bucket.second); + } - if (result.is<State>()) { - state = result.get<State>(); } else { error = result.get<std::string>(); state = State::obsolete; @@ -67,7 +74,13 @@ Bucket* LiveTileData::getBucket(const StyleLayer& layer) { return nullptr; } - return tileWorker.getBucket(layer); + const auto it = buckets.find(layer.bucket->name); + if (it == buckets.end()) { + return nullptr; + } + + assert(it->second); + return it->second.get(); } void LiveTileData::cancel() { |