diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-11-22 13:58:21 +0200 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-11-29 11:12:55 +0200 |
commit | 06c80cae3c36b196fab6adc1320c11444a52a26e (patch) | |
tree | 84fce181b37c6323df4d17dc68c56e10aede90d4 /src | |
parent | 6419cd0ab2ba877bbae51ae7590ddba47765dac7 (diff) | |
download | qtlocation-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/tile/geojson_tile.cpp | 21 | ||||
-rw-r--r-- | src/mbgl/tile/geojson_tile.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.cpp | 13 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile.hpp | 5 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.cpp | 18 | ||||
-rw-r--r-- | src/mbgl/tile/geometry_tile_worker.hpp | 2 |
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); |