diff --git a/src/mbgl/map/geometry_tile.hpp b/src/mbgl/map/geometry_tile.hpp index fdca90520..a8105a500 100644 --- a/src/mbgl/map/geometry_tile.hpp +++ b/src/mbgl/map/geometry_tile.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -39,15 +40,10 @@ class GeometryTileLayer; class GeometryTileFeature { public: - virtual ~GeometryTileFeature(); - virtual uint64_t getID() const = 0; virtual GeometryFeatureType getType() const = 0; virtual std::map getProperties() const = 0; virtual GeometryCollection nextGeometry() = 0; - -protected: - GeometryTileFeature(); }; std::ostream& operator<<(std::ostream&, const GeometryTileFeature& feature); @@ -75,32 +71,20 @@ class GeometryFilteredTileLayer { public: class iterator { public: - virtual ~iterator(); - void operator++(); bool operator!=(const iterator&) const; GeometryTileFeature& operator*() const; - - protected: - iterator(); }; public: - virtual ~GeometryFilteredTileLayer(); - virtual iterator begin() const = 0; virtual iterator end() const = 0; - -protected: - GeometryFilteredTileLayer(); }; std::ostream& operator<<(std::ostream&, const PositionedGlyph&); class GeometryTileLayer { public: - virtual ~GeometryTileLayer(); - virtual const std::string getName() const = 0; virtual uint32_t getExtent() const = 0; virtual const std::vector getKeys() const = 0; @@ -108,19 +92,11 @@ public: virtual const std::vector getValues() const = 0; virtual const std::map> getShaping() const = 0; virtual std::unique_ptr createFilteredTileLayer(const FilterExpression&) const = 0; - -protected: - GeometryTileLayer(); }; class GeometryTile { public: - virtual ~GeometryTile(); - - virtual std::map getLayers() const = 0; - -protected: - GeometryTile(); + virtual const util::ptr getLayer(const std::string&) const = 0; }; } diff --git a/src/mbgl/map/tile_parser.cpp b/src/mbgl/map/tile_parser.cpp index c75a19b9d..73426a2d1 100644 --- a/src/mbgl/map/tile_parser.cpp +++ b/src/mbgl/map/tile_parser.cpp @@ -187,9 +187,8 @@ std::unique_ptr TileParser::createBucket(const StyleBucket &bucketDesc) if (tile.id.z >= std::ceil(bucketDesc.max_zoom)) return nullptr; if (bucketDesc.visibility == mbgl::VisibilityType::None) return nullptr; - auto layer_it = vectorTile.getLayers().find(bucketDesc.source_layer); - if (layer_it != vectorTile.getLayers().end()) { - const GeometryTileLayer& layer = layer_it->second; + const util::ptr layer = vectorTile.getLayer(bucketDesc.source_layer); + if (layer.get() != nullptr) { if (bucketDesc.type == StyleLayerType::Fill) { return createFillBucket(layer, bucketDesc); } else if (bucketDesc.type == StyleLayerType::Line) { @@ -213,9 +212,9 @@ std::unique_ptr TileParser::createBucket(const StyleBucket &bucketDesc) } template -void TileParser::addBucketGeometries(Bucket& bucket, const GeometryTileLayer& layer, const FilterExpression &filter) { +void TileParser::addBucketGeometries(Bucket& bucket, const util::ptr layer, const FilterExpression &filter) { - std::unique_ptr filtered_layer = layer.createFilteredTileLayer(filter); + std::unique_ptr filtered_layer = layer->createFilteredTileLayer(filter); for (auto feature_it = filtered_layer->begin(); feature_it != filtered_layer->end(); ++feature_it) { @@ -230,7 +229,7 @@ void TileParser::addBucketGeometries(Bucket& bucket, const GeometryTileLayer& la } } -std::unique_ptr TileParser::createFillBucket(const GeometryTileLayer& layer, +std::unique_ptr TileParser::createFillBucket(const util::ptr layer, const StyleBucket &bucket_desc) { auto fill = parseStyleLayoutFill(bucket_desc, tile.id.z); auto bucket = util::make_unique(std::move(fill), @@ -241,7 +240,7 @@ std::unique_ptr TileParser::createFillBucket(const GeometryTileLayer& la return obsolete() ? nullptr : std::move(bucket); } -std::unique_ptr TileParser::createLineBucket(const GeometryTileLayer& layer, +std::unique_ptr TileParser::createLineBucket(const util::ptr layer, const StyleBucket &bucket_desc) { auto line = parseStyleLayoutLine(bucket_desc, tile.id.z); auto bucket = util::make_unique(std::move(line), @@ -252,7 +251,7 @@ std::unique_ptr TileParser::createLineBucket(const GeometryTileLayer& la return obsolete() ? nullptr : std::move(bucket); } -std::unique_ptr TileParser::createSymbolBucket(const GeometryTileLayer& layer, +std::unique_ptr TileParser::createSymbolBucket(const util::ptr layer, const StyleBucket &bucket_desc) { auto symbol = parseStyleLayoutSymbol(bucket_desc, tile.id.z); auto bucket = util::make_unique(std::move(symbol), *collision); diff --git a/src/mbgl/map/tile_parser.hpp b/src/mbgl/map/tile_parser.hpp index 841ae1749..90a9037fd 100644 --- a/src/mbgl/map/tile_parser.hpp +++ b/src/mbgl/map/tile_parser.hpp @@ -53,11 +53,11 @@ private: void parseStyleLayers(util::ptr group); std::unique_ptr createBucket(const StyleBucket& bucketDesc); - std::unique_ptr createFillBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc); - std::unique_ptr createLineBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc); - std::unique_ptr createSymbolBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc); + std::unique_ptr createFillBucket(const util::ptr layer, const StyleBucket& bucketDesc); + std::unique_ptr createLineBucket(const util::ptr layer, const StyleBucket& bucketDesc); + std::unique_ptr createSymbolBucket(const util::ptr layer, const StyleBucket& bucketDesc); - template void addBucketGeometries(Bucket& bucket, const GeometryTileLayer& layer, const FilterExpression& filter); + template void addBucketGeometries(Bucket& bucket, const util::ptr layer, const FilterExpression& filter); private: const VectorTile vectorTile; diff --git a/src/mbgl/map/vector_tile.cpp b/src/mbgl/map/vector_tile.cpp index cdd93d4bb..072860832 100644 --- a/src/mbgl/map/vector_tile.cpp +++ b/src/mbgl/map/vector_tile.cpp @@ -119,6 +119,14 @@ VectorTile& VectorTile::operator=(VectorTile&& other) { return *this; } +const util::ptr VectorTile::getLayer(const std::string& name) const { + auto layer_it = layers.find(name); + if (layer_it != layers.end()) { + return std::make_shared(layer_it->second); + } + return nullptr; +} + VectorTileLayer::VectorTileLayer(pbf layer_pbf) : feature_pbf(layer_pbf) { while (layer_pbf.next()) { diff --git a/src/mbgl/map/vector_tile.hpp b/src/mbgl/map/vector_tile.hpp index 63efbab48..5fc6764b6 100644 --- a/src/mbgl/map/vector_tile.hpp +++ b/src/mbgl/map/vector_tile.hpp @@ -3,6 +3,7 @@ #include #include +#include namespace mbgl { @@ -82,7 +83,7 @@ public: VectorTile(pbf); VectorTile& operator=(VectorTile&&); - virtual std::map getLayers() const; + virtual const util::ptr getLayer(const std::string&) const; private: std::map layers; diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp index 50a0f3c55..53833a759 100644 --- a/src/mbgl/renderer/symbol_bucket.cpp +++ b/src/mbgl/renderer/symbol_bucket.cpp @@ -49,7 +49,7 @@ void SymbolBucket::addGlyphsToAtlas(uint64_t tileid, const std::string stackname glyphAtlas.addGlyphs(tileid, text, stackname, fontStack,face); } -std::vector SymbolBucket::processFeatures(const GeometryTileLayer& layer, +std::vector SymbolBucket::processFeatures(const util::ptr layer, const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite) { @@ -66,7 +66,7 @@ std::vector SymbolBucket::processFeatures(const GeometryTileLayer // Determine and load glyph ranges std::set ranges; - std::unique_ptr filtered_layer = layer.createFilteredTileLayer(filter); + std::unique_ptr filtered_layer = layer->createFilteredTileLayer(filter); for (auto feature_it = filtered_layer->begin(); feature_it != filtered_layer->end(); ++feature_it) { @@ -123,7 +123,7 @@ std::vector SymbolBucket::processFeatures(const GeometryTileLayer return features; } -void SymbolBucket::addFeatures(const GeometryTileLayer& layer, const FilterExpression &filter, +void SymbolBucket::addFeatures(const util::ptr layer, const FilterExpression &filter, const Tile::ID &id, SpriteAtlas &spriteAtlas, Sprite &sprite, GlyphAtlas & glyphAtlas, GlyphStore &glyphStore) { auto &layout = *styleLayout; diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp index 0f9e8faa3..9d2d002a6 100644 --- a/src/mbgl/renderer/symbol_bucket.hpp +++ b/src/mbgl/renderer/symbol_bucket.hpp @@ -65,7 +65,7 @@ public: bool hasTextData() const; bool hasIconData() const; - void addFeatures(const GeometryTileLayer& layer, const FilterExpression &filter, + void addFeatures(const util::ptr layer, const FilterExpression &filter, const Tile::ID &id, SpriteAtlas &spriteAtlas, Sprite &sprite, GlyphAtlas &glyphAtlas, GlyphStore &glyphStore); @@ -78,7 +78,7 @@ public: private: - std::vector processFeatures(const GeometryTileLayer& layer, const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite); + std::vector processFeatures(const util::ptr layer, const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite); void addFeature(const std::vector &line, const Shaping &shaping, const GlyphPositions &face, const Rect &image);