summaryrefslogtreecommitdiff
path: root/src/mbgl/tile
diff options
context:
space:
mode:
authorJohn Firebaugh <john.firebaugh@gmail.com>2016-08-27 14:43:28 -0700
committerJohn Firebaugh <john.firebaugh@gmail.com>2016-09-06 12:52:14 -0700
commit5b4f6335e384169bcd88633e38d59a500319a47b (patch)
tree0c4f98790ab6d2814b2db26f6fa72454213c6551 /src/mbgl/tile
parent21dc12ee93e890325c61daa0e4183dd1e795f0a9 (diff)
downloadqtlocation-mapboxgl-5b4f6335e384169bcd88633e38d59a500319a47b.tar.gz
[core] Add Source::Impl::reload
Diffstat (limited to 'src/mbgl/tile')
-rw-r--r--src/mbgl/tile/geometry_tile.cpp61
-rw-r--r--src/mbgl/tile/geometry_tile.hpp3
-rw-r--r--src/mbgl/tile/tile.hpp1
-rw-r--r--src/mbgl/tile/tile_worker.cpp14
-rw-r--r--src/mbgl/tile/tile_worker.hpp5
5 files changed, 57 insertions, 27 deletions
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index bd2d8f760f..d353acf574 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -83,33 +83,52 @@ void GeometryTile::setData(std::unique_ptr<const GeometryTileData> data_) {
// when tile data changed. Replacing the workdRequest will cancel a pending work
// request in case there is one.
workRequest.reset();
- workRequest = worker.parseGeometryTile(tileWorker, cloneStyleLayers(), std::move(data_), targetConfig, [this, config = targetConfig] (TileParseResult result) {
- workRequest.reset();
+ workRequest = worker.parseGeometryTile(tileWorker, cloneStyleLayers(), std::move(data_), targetConfig,
+ [this, config = targetConfig] (TileParseResult result) {
+ tileLoaded(std::move(result), config);
+ });
+}
- if (result.is<TileParseResultData>()) {
- auto& resultBuckets = result.get<TileParseResultData>();
- availableData = resultBuckets.complete ? DataAvailability::All : DataAvailability::Some;
+void GeometryTile::redoLayout() {
+ // Mark the tile as pending again if it was complete before to prevent signaling a complete
+ // state despite pending parse operations.
+ if (availableData == DataAvailability::All) {
+ availableData = DataAvailability::Some;
+ }
- // Persist the configuration we just placed so that we can later check whether we need to
- // place again in case the configuration has changed.
- placedConfig = config;
+ workRequest.reset();
+ workRequest = worker.redoLayout(tileWorker, cloneStyleLayers(), targetConfig,
+ [this, config = targetConfig] (TileParseResult result) {
+ tileLoaded(std::move(result), config);
+ });
+}
- // Move over all buckets we received in this parse request, potentially overwriting
- // existing buckets in case we got a refresh parse.
- buckets = std::move(resultBuckets.buckets);
+void GeometryTile::tileLoaded(TileParseResult result, PlacementConfig config) {
+ workRequest.reset();
- if (isComplete()) {
- featureIndex = std::move(resultBuckets.featureIndex);
- data = std::move(resultBuckets.tileData);
- }
+ if (result.is<TileParseResultData>()) {
+ auto& resultBuckets = result.get<TileParseResultData>();
+ availableData = resultBuckets.complete ? DataAvailability::All : DataAvailability::Some;
- redoPlacement();
- observer->onTileLoaded(*this, true);
- } else {
- availableData = DataAvailability::All;
- observer->onTileError(*this, result.get<std::exception_ptr>());
+ // Persist the configuration we just placed so that we can later check whether we need to
+ // place again in case the configuration has changed.
+ placedConfig = config;
+
+ // Move over all buckets we received in this parse request, potentially overwriting
+ // existing buckets in case we got a refresh parse.
+ buckets = std::move(resultBuckets.buckets);
+
+ if (isComplete()) {
+ featureIndex = std::move(resultBuckets.featureIndex);
+ data = std::move(resultBuckets.tileData);
}
- });
+
+ redoPlacement();
+ observer->onTileLoaded(*this, true);
+ } else {
+ availableData = DataAvailability::All;
+ observer->onTileError(*this, result.get<std::exception_ptr>());
+ }
}
bool GeometryTile::parsePending() {
diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp
index adbe81e29f..e0db58325c 100644
--- a/src/mbgl/tile/geometry_tile.hpp
+++ b/src/mbgl/tile/geometry_tile.hpp
@@ -37,6 +37,7 @@ public:
bool parsePending() override;
+ void redoLayout() override;
void redoPlacement(PlacementConfig) override;
void queryRenderedFeatures(
@@ -51,6 +52,8 @@ private:
std::vector<std::unique_ptr<style::Layer>> cloneStyleLayers() const;
void redoPlacement();
+ void tileLoaded(TileParseResult, PlacementConfig);
+
const std::string sourceID;
style::Style& style;
Worker& worker;
diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp
index 65f3aaa245..740ced3898 100644
--- a/src/mbgl/tile/tile.hpp
+++ b/src/mbgl/tile/tile.hpp
@@ -48,6 +48,7 @@ public:
virtual Bucket* getBucket(const style::Layer&) = 0;
virtual bool parsePending() { return true; }
+ virtual void redoLayout() {}
virtual void redoPlacement(PlacementConfig) {}
virtual void queryRenderedFeatures(
diff --git a/src/mbgl/tile/tile_worker.cpp b/src/mbgl/tile/tile_worker.cpp
index 0c90456da0..8fe75d71d4 100644
--- a/src/mbgl/tile/tile_worker.cpp
+++ b/src/mbgl/tile/tile_worker.cpp
@@ -39,15 +39,19 @@ TileWorker::~TileWorker() {
TileParseResult TileWorker::parseAllLayers(std::vector<std::unique_ptr<Layer>> layers_,
std::unique_ptr<const GeometryTileData> tileData_,
PlacementConfig config) {
- // We're doing a fresh parse of the tile, because the underlying data has changed.
+ tileData = std::move(tileData_);
+ return redoLayout(std::move(layers_), config);
+}
+
+TileParseResult TileWorker::redoLayout(std::vector<std::unique_ptr<Layer>> layers_,
+ const PlacementConfig config) {
+ layers = std::move(layers_);
+
+ // We're doing a fresh parse of the tile, because the underlying data or style has changed.
pending.clear();
placementPending.clear();
partialParse = false;
featureIndex = std::make_unique<FeatureIndex>();
- tileData = std::move(tileData_);
-
- // Store the layers for use in redoPlacement.
- layers = std::move(layers_);
// We're storing a set of bucket names we've parsed to avoid parsing a bucket twice that is
// referenced from more than one layer
diff --git a/src/mbgl/tile/tile_worker.hpp b/src/mbgl/tile/tile_worker.hpp
index f0113f738c..5f38c898ff 100644
--- a/src/mbgl/tile/tile_worker.hpp
+++ b/src/mbgl/tile/tile_worker.hpp
@@ -53,11 +53,14 @@ public:
~TileWorker();
TileParseResult parseAllLayers(std::vector<std::unique_ptr<style::Layer>>,
- std::unique_ptr<const GeometryTileData> tileData,
+ std::unique_ptr<const GeometryTileData>,
PlacementConfig);
TileParseResult parsePendingLayers(PlacementConfig);
+ TileParseResult redoLayout(std::vector<std::unique_ptr<style::Layer>>,
+ PlacementConfig);
+
std::unique_ptr<CollisionTile> redoPlacement(const std::unordered_map<std::string, std::unique_ptr<Bucket>>*,
PlacementConfig);