summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-11-22 13:58:21 +0200
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-11-29 11:12:55 +0200
commit06c80cae3c36b196fab6adc1320c11444a52a26e (patch)
tree84fce181b37c6323df4d17dc68c56e10aede90d4
parent6419cd0ab2ba877bbae51ae7590ddba47765dac7 (diff)
downloadqtlocation-mapboxgl-06c80cae3c36b196fab6adc1320c11444a52a26e.tar.gz
[core] Introduce GeometryTile::reset()
The newly introduced `GeometryTile::reset()` is used while GeoJSON tile update in order to prevent from the parsing of the new data with the stale layers or vice verse.
-rw-r--r--src/mbgl/tile/geojson_tile.cpp21
-rw-r--r--src/mbgl/tile/geojson_tile.hpp2
-rw-r--r--src/mbgl/tile/geometry_tile.cpp13
-rw-r--r--src/mbgl/tile/geometry_tile.hpp5
-rw-r--r--src/mbgl/tile/geometry_tile_worker.cpp18
-rw-r--r--src/mbgl/tile/geometry_tile_worker.hpp2
6 files changed, 44 insertions, 17 deletions
diff --git a/src/mbgl/tile/geojson_tile.cpp b/src/mbgl/tile/geojson_tile.cpp
index a4c48fb809..65a9d80aec 100644
--- a/src/mbgl/tile/geojson_tile.cpp
+++ b/src/mbgl/tile/geojson_tile.cpp
@@ -10,20 +10,21 @@ GeoJSONTile::GeoJSONTile(const OverscaledTileID& overscaledTileID,
const TileParameters& parameters,
std::shared_ptr<style::GeoJSONData> data_)
: GeometryTile(overscaledTileID, sourceID_, parameters) {
- updateData(std::move(data_));
+ updateData(std::move(data_), false /*needsRelayout*/);
}
-void GeoJSONTile::updateData(std::shared_ptr<style::GeoJSONData> data_, bool resetLayers) {
+void GeoJSONTile::updateData(std::shared_ptr<style::GeoJSONData> data_, bool needsRelayout) {
assert(data_);
data = std::move(data_);
- data->getTile(id.canonical,
- [this, self = weakFactory.makeWeakPtr(), capturedData = data.get(), resetLayers](
- style::GeoJSONData::TileFeatures features) {
- if (!self) return;
- if (data.get() != capturedData) return;
- auto tileData = std::make_unique<GeoJSONTileData>(std::move(features));
- setData(std::move(tileData), resetLayers);
- });
+ if (needsRelayout) reset();
+ data->getTile(
+ id.canonical,
+ [this, self = weakFactory.makeWeakPtr(), capturedData = data.get()](style::GeoJSONData::TileFeatures features) {
+ if (!self) return;
+ if (data.get() != capturedData) return;
+ auto tileData = std::make_unique<GeoJSONTileData>(std::move(features));
+ setData(std::move(tileData));
+ });
}
void GeoJSONTile::querySourceFeatures(
diff --git a/src/mbgl/tile/geojson_tile.hpp b/src/mbgl/tile/geojson_tile.hpp
index 26dc300bdc..240b23e9bc 100644
--- a/src/mbgl/tile/geojson_tile.hpp
+++ b/src/mbgl/tile/geojson_tile.hpp
@@ -17,7 +17,7 @@ public:
const TileParameters&,
std::shared_ptr<style::GeoJSONData>);
- void updateData(std::shared_ptr<style::GeoJSONData> data, bool resetLayers = false);
+ void updateData(std::shared_ptr<style::GeoJSONData> data, bool needsRelayout = false);
void querySourceFeatures(
std::vector<Feature>& result,
diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp
index 4a3d91455a..7df81fa30f 100644
--- a/src/mbgl/tile/geometry_tile.cpp
+++ b/src/mbgl/tile/geometry_tile.cpp
@@ -176,14 +176,23 @@ void GeometryTile::setError(std::exception_ptr err) {
observer->onTileError(*this, err);
}
-void GeometryTile::setData(std::unique_ptr<const GeometryTileData> data_, bool resetLayers) {
+void GeometryTile::setData(std::unique_ptr<const GeometryTileData> data_) {
// Mark the tile as pending again if it was complete before to prevent signaling a complete
// state despite pending parse operations.
pending = true;
++correlationID;
worker.self().invoke(
- &GeometryTileWorker::setData, std::move(data_), imageManager.getAvailableImages(), resetLayers, correlationID);
+ &GeometryTileWorker::setData, std::move(data_), imageManager.getAvailableImages(), correlationID);
+}
+
+void GeometryTile::reset() {
+ // Mark the tile as pending again if it was complete before to prevent signaling a complete
+ // state despite pending parse operations.
+ pending = true;
+
+ ++correlationID;
+ worker.self().invoke(&GeometryTileWorker::reset, correlationID);
}
std::unique_ptr<TileRenderData> GeometryTile::createRenderData() {
diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp
index 566b359547..cd771b109f 100644
--- a/src/mbgl/tile/geometry_tile.hpp
+++ b/src/mbgl/tile/geometry_tile.hpp
@@ -34,7 +34,10 @@ public:
~GeometryTile() override;
void setError(std::exception_ptr);
- void setData(std::unique_ptr<const GeometryTileData>, bool resetLayers = false);
+ void setData(std::unique_ptr<const GeometryTileData>);
+ // Resets the tile's data and layers and leaves the tile in pending state, waiting for the new
+ // data and layers to come.
+ void reset();
std::unique_ptr<TileRenderData> createRenderData() override;
void setLayers(const std::vector<Immutable<style::LayerProperties>>&) override;
diff --git a/src/mbgl/tile/geometry_tile_worker.cpp b/src/mbgl/tile/geometry_tile_worker.cpp
index de53c69aee..a61321b363 100644
--- a/src/mbgl/tile/geometry_tile_worker.cpp
+++ b/src/mbgl/tile/geometry_tile_worker.cpp
@@ -118,13 +118,11 @@ GeometryTileWorker::~GeometryTileWorker() = default;
void GeometryTileWorker::setData(std::unique_ptr<const GeometryTileData> data_,
std::set<std::string> availableImages_,
- bool resetLayers_,
uint64_t correlationID_) {
try {
data = std::move(data_);
correlationID = correlationID_;
availableImages = std::move(availableImages_);
- if (resetLayers_) layers = nullopt;
switch (state) {
case Idle:
@@ -170,6 +168,22 @@ void GeometryTileWorker::setLayers(std::vector<Immutable<LayerProperties>> layer
}
}
+void GeometryTileWorker::reset(uint64_t correlationID_) {
+ layers = nullopt;
+ data = nullopt;
+ correlationID = correlationID_;
+
+ switch (state) {
+ case Idle:
+ case NeedsParse:
+ break;
+ case Coalescing:
+ case NeedsSymbolLayout:
+ state = NeedsParse;
+ break;
+ }
+}
+
void GeometryTileWorker::setShowCollisionBoxes(bool showCollisionBoxes_, uint64_t correlationID_) {
try {
showCollisionBoxes = showCollisionBoxes_;
diff --git a/src/mbgl/tile/geometry_tile_worker.hpp b/src/mbgl/tile/geometry_tile_worker.hpp
index 38f7cb9fa6..08dafc6788 100644
--- a/src/mbgl/tile/geometry_tile_worker.hpp
+++ b/src/mbgl/tile/geometry_tile_worker.hpp
@@ -43,8 +43,8 @@ public:
uint64_t correlationID);
void setData(std::unique_ptr<const GeometryTileData>,
std::set<std::string> availableImages,
- bool resetLayers,
uint64_t correlationID);
+ void reset(uint64_t correlationID_);
void setShowCollisionBoxes(bool showCollisionBoxes_, uint64_t correlationID_);
void onGlyphsAvailable(GlyphMap glyphs);