diff --git a/src/mbgl/map/tile_worker.cpp b/src/mbgl/map/tile_worker.cpp index 177e8cdd7..990d1c6c4 100644 --- a/src/mbgl/map/tile_worker.cpp +++ b/src/mbgl/map/tile_worker.cpp @@ -31,13 +31,16 @@ TileWorker::~TileWorker() { glyphAtlas.removeGlyphs(reinterpret_cast(this)); } -TileParseResult TileWorker::parseAllLayers(std::vector> layers, +TileParseResult TileWorker::parseAllLayers(std::vector> layers_, const GeometryTile& geometryTile, PlacementConfig config) { // We're doing a fresh parse of the tile, because the underlying data has changed. pending.clear(); partialParse = false; + // Store the layers for use in redoPlacement. + layers = std::move(layers_); + // Reset the collision tile so we have a clean slate; we're placing all features anyway. collisionTile = std::make_unique(config); @@ -46,10 +49,10 @@ TileParseResult TileWorker::parseAllLayers(std::vector parsed; for (auto i = layers.rbegin(); i != layers.rend(); i++) { - std::unique_ptr layer = std::move(*i); + const StyleLayer* layer = i->get(); if (parsed.find(layer->bucketName()) == parsed.end()) { parsed.emplace(layer->bucketName()); - parseLayer(std::move(layer), geometryTile); + parseLayer(layer, geometryTile); } } @@ -89,7 +92,6 @@ TileParseResult TileWorker::parsePendingLayers() { } void TileWorker::redoPlacement( - std::vector> layers, const std::unordered_map>* buckets, PlacementConfig config) { @@ -104,7 +106,7 @@ void TileWorker::redoPlacement( } } -void TileWorker::parseLayer(std::unique_ptr layer, const GeometryTile& geometryTile) { +void TileWorker::parseLayer(const StyleLayer* layer, const GeometryTile& geometryTile) { // Cancel early when parsing. if (state == TileData::State::obsolete) return; @@ -145,7 +147,7 @@ void TileWorker::parseLayer(std::unique_ptr layer, const GeometryTil if (layer->type == StyleLayerType::Symbol && partialParse) { // We cannot parse this bucket yet. Instead, we're saving it for later. - pending.emplace_back(std::move(layer), std::move(bucket)); + pending.emplace_back(layer, std::move(bucket)); } else { insertBucket(layer->bucketName(), std::move(bucket)); } diff --git a/src/mbgl/map/tile_worker.hpp b/src/mbgl/map/tile_worker.hpp index 21e0ec8a3..b2284de49 100644 --- a/src/mbgl/map/tile_worker.hpp +++ b/src/mbgl/map/tile_worker.hpp @@ -51,12 +51,11 @@ public: TileParseResult parsePendingLayers(); - void redoPlacement(std::vector>, - const std::unordered_map>*, + void redoPlacement(const std::unordered_map>*, PlacementConfig); private: - void parseLayer(std::unique_ptr, const GeometryTile&); + void parseLayer(const StyleLayer*, const GeometryTile&); void insertBucket(const std::string& name, std::unique_ptr); const TileID id; @@ -69,11 +68,12 @@ private: bool partialParse = false; + std::vector> layers; std::unique_ptr collisionTile; // Contains buckets that we couldn't parse so far due to missing resources. // They will be attempted on subsequent parses. - std::list, std::unique_ptr>> pending; + std::list>> pending; // Temporary holder TileParseResultBuckets result; diff --git a/src/mbgl/map/vector_tile_data.cpp b/src/mbgl/map/vector_tile_data.cpp index bac13b388..708ded02c 100644 --- a/src/mbgl/map/vector_tile_data.cpp +++ b/src/mbgl/map/vector_tile_data.cpp @@ -166,7 +166,7 @@ void VectorTileData::redoPlacement(const PlacementConfig newConfig) { void VectorTileData::redoPlacement() { workRequest.reset(); - workRequest = worker.redoPlacement(tileWorker, style.getLayers(), buckets, targetConfig, [this, config = targetConfig] { + workRequest = worker.redoPlacement(tileWorker, buckets, targetConfig, [this, config = targetConfig] { workRequest.reset(); // Persist the configuration we just placed so that we can later check whether we need to diff --git a/src/mbgl/util/worker.cpp b/src/mbgl/util/worker.cpp index 054f1df24..34f18dd3f 100644 --- a/src/mbgl/util/worker.cpp +++ b/src/mbgl/util/worker.cpp @@ -55,11 +55,10 @@ public: } void redoPlacement(TileWorker* worker, - std::vector> layers, const std::unordered_map>* buckets, PlacementConfig config, std::function callback) { - worker->redoPlacement(std::move(layers), buckets, config); + worker->redoPlacement(buckets, config); callback(); } }; @@ -103,13 +102,12 @@ Worker::parsePendingGeometryTileLayers(TileWorker& worker, std::unique_ptr Worker::redoPlacement(TileWorker& worker, - std::vector> layers, const std::unordered_map>& buckets, PlacementConfig config, std::function callback) { current = (current + 1) % threads.size(); return threads[current]->invokeWithCallback(&Worker::Impl::redoPlacement, callback, &worker, - std::move(layers), &buckets, config); + &buckets, config); } } // end namespace mbgl diff --git a/src/mbgl/util/worker.hpp b/src/mbgl/util/worker.hpp index 31e45f124..5ba477491 100644 --- a/src/mbgl/util/worker.hpp +++ b/src/mbgl/util/worker.hpp @@ -49,7 +49,6 @@ public: std::function callback); Request redoPlacement(TileWorker&, - std::vector>, const std::unordered_map>&, PlacementConfig config, std::function callback);