diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index d825e5764..eade8c51c 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -120,11 +120,11 @@ void Style::removeSource(const std::string& id) { sources.erase(it); } -std::vector> Style::getLayers() const { - std::vector> result; +std::vector Style::getLayers() const { + std::vector result; result.reserve(layers.size()); for (const auto& layer : layers) { - result.push_back(layer->baseImpl->clone()); + result.push_back(layer.get()); } return result; } diff --git a/src/mbgl/style/style.hpp b/src/mbgl/style/style.hpp index e83cab805..1a41c4ce4 100644 --- a/src/mbgl/style/style.hpp +++ b/src/mbgl/style/style.hpp @@ -62,7 +62,7 @@ public: void addSource(std::unique_ptr); void removeSource(const std::string& sourceID); - std::vector> getLayers() const; + std::vector getLayers() const; Layer* getLayer(const std::string& id) const; void addLayer(std::unique_ptr, optional beforeLayerID = {}); diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 41673a79c..daa358420 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include #include @@ -12,15 +14,17 @@ namespace mbgl { +using namespace style; + GeometryTile::GeometryTile(const OverscaledTileID& id_, - std::string sourceID, - style::Style& style_, + std::string sourceID_, + Style& style_, const MapMode mode_) : Tile(id_), + sourceID(std::move(sourceID_)), style(style_), worker(style_.workers), tileWorker(id_, - sourceID, *style_.spriteStore, *style_.glyphAtlas, *style_.glyphStore, @@ -28,10 +32,34 @@ GeometryTile::GeometryTile(const OverscaledTileID& id_, mode_) { } +GeometryTile::~GeometryTile() { + cancel(); +} + void GeometryTile::setError(std::exception_ptr err) { observer->onTileError(*this, err); } +std::vector> GeometryTile::cloneStyleLayers() const { + std::vector> result; + + for (const Layer* layer : style.getLayers()) { + // Avoid cloning and including irrelevant layers. + if (layer->is() || + layer->is() || + layer->baseImpl->source != sourceID || + id.overscaledZ < std::floor(layer->baseImpl->minZoom) || + id.overscaledZ >= std::ceil(layer->baseImpl->maxZoom) || + layer->baseImpl->visibility == VisibilityType::None) { + continue; + } + + result.push_back(layer->baseImpl->clone()); + } + + return result; +} + void GeometryTile::setData(std::unique_ptr data_) { if (!data_) { // This is a 404 response. We're treating these as empty tiles. @@ -53,7 +81,7 @@ void GeometryTile::setData(std::unique_ptr 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, style.getLayers(), std::move(data_), targetConfig, [this, config = targetConfig] (TileParseResult result) { + workRequest = worker.parseGeometryTile(tileWorker, cloneStyleLayers(), std::move(data_), targetConfig, [this, config = targetConfig] (TileParseResult result) { workRequest.reset(); if (result.is()) { @@ -82,10 +110,6 @@ void GeometryTile::setData(std::unique_ptr data_) { }); } -GeometryTile::~GeometryTile() { - cancel(); -} - bool GeometryTile::parsePending() { if (workRequest) { // There's already parsing or placement going on. @@ -126,7 +150,7 @@ bool GeometryTile::parsePending() { return true; } -Bucket* GeometryTile::getBucket(const style::Layer& layer) { +Bucket* GeometryTile::getBucket(const Layer& layer) { const auto it = buckets.find(layer.baseImpl->bucketName()); if (it == buckets.end()) { return nullptr; diff --git a/src/mbgl/tile/geometry_tile.hpp b/src/mbgl/tile/geometry_tile.hpp index 71b7db3cf..6072e2b1d 100644 --- a/src/mbgl/tile/geometry_tile.hpp +++ b/src/mbgl/tile/geometry_tile.hpp @@ -8,6 +8,7 @@ #include #include +#include namespace mbgl { @@ -17,6 +18,7 @@ class FeatureIndex; namespace style { class Style; +class Layer; } // namespace style class GeometryTile : public Tile { @@ -46,8 +48,10 @@ public: void cancel() override; private: + std::vector> cloneStyleLayers() const; void redoPlacement(); + const std::string sourceID; style::Style& style; Worker& worker; TileWorker tileWorker; diff --git a/src/mbgl/tile/tile_worker.cpp b/src/mbgl/tile/tile_worker.cpp index ea8cc5b1e..c21a4a4ad 100644 --- a/src/mbgl/tile/tile_worker.cpp +++ b/src/mbgl/tile/tile_worker.cpp @@ -2,8 +2,6 @@ #include #include #include -#include -#include #include #include #include @@ -13,6 +11,7 @@ #include #include #include + #include namespace mbgl { @@ -20,14 +19,12 @@ namespace mbgl { using namespace mbgl::style; TileWorker::TileWorker(OverscaledTileID id_, - std::string sourceID_, SpriteStore& spriteStore_, GlyphAtlas& glyphAtlas_, GlyphStore& glyphStore_, const util::Atomic& obsolete_, const MapMode mode_) : id(std::move(id_)), - sourceID(std::move(sourceID_)), spriteStore(spriteStore_), glyphAtlas(glyphAtlas_), glyphStore(glyphStore_), @@ -135,18 +132,6 @@ void TileWorker::parseLayer(const Layer* layer) { if (obsolete) return; - // Background and custom layers are special cases. - if (layer->is() || layer->is()) - return; - - // Skip this bucket if we are to not render this - if ((layer->baseImpl->source != sourceID) || - (id.overscaledZ < std::floor(layer->baseImpl->minZoom)) || - (id.overscaledZ >= std::ceil(layer->baseImpl->maxZoom)) || - (layer->baseImpl->visibility == VisibilityType::None)) { - return; - } - auto geometryLayer = tileData->getLayer(layer->baseImpl->sourceLayer); if (!geometryLayer) { // The layer specified in the bucket does not exist. Do nothing. diff --git a/src/mbgl/tile/tile_worker.hpp b/src/mbgl/tile/tile_worker.hpp index 34588645a..b25858c95 100644 --- a/src/mbgl/tile/tile_worker.hpp +++ b/src/mbgl/tile/tile_worker.hpp @@ -46,7 +46,6 @@ using TileParseResult = variant< class TileWorker : public util::noncopyable { public: TileWorker(OverscaledTileID, - std::string sourceID, SpriteStore&, GlyphAtlas&, GlyphStore&, @@ -70,7 +69,6 @@ private: std::unique_ptr placeLayers(PlacementConfig); const OverscaledTileID id; - const std::string sourceID; SpriteStore& spriteStore; GlyphAtlas& glyphAtlas;