summaryrefslogtreecommitdiff
path: root/src/mbgl/map/live_tile_data.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/map/live_tile_data.cpp')
-rw-r--r--src/mbgl/map/live_tile_data.cpp31
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() {