move to shared pointers for queried layers passed to buckets
This commit is contained in:
committed by
John Firebaugh
parent
a45ae199cf
commit
7361f8566b
@@ -5,6 +5,7 @@
|
||||
#include <mbgl/style/value.hpp>
|
||||
#include <mbgl/text/glyph.hpp>
|
||||
#include <mbgl/util/optional.hpp>
|
||||
#include <mbgl/util/ptr.hpp>
|
||||
#include <mbgl/util/variant.hpp>
|
||||
#include <mbgl/util/vec.hpp>
|
||||
|
||||
@@ -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<std::string, Value> 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<std::string> getKeys() const = 0;
|
||||
@@ -108,19 +92,11 @@ public:
|
||||
virtual const std::vector<Value> getValues() const = 0;
|
||||
virtual const std::map<std::string, std::map<Value, Shaping>> getShaping() const = 0;
|
||||
virtual std::unique_ptr<GeometryFilteredTileLayer> createFilteredTileLayer(const FilterExpression&) const = 0;
|
||||
|
||||
protected:
|
||||
GeometryTileLayer();
|
||||
};
|
||||
|
||||
class GeometryTile {
|
||||
public:
|
||||
virtual ~GeometryTile();
|
||||
|
||||
virtual std::map<std::string, const GeometryTileLayer> getLayers() const = 0;
|
||||
|
||||
protected:
|
||||
GeometryTile();
|
||||
virtual const util::ptr<const GeometryTileLayer> getLayer(const std::string&) const = 0;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -187,9 +187,8 @@ std::unique_ptr<Bucket> 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<const GeometryTileLayer> 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<Bucket> TileParser::createBucket(const StyleBucket &bucketDesc)
|
||||
}
|
||||
|
||||
template <class Bucket>
|
||||
void TileParser::addBucketGeometries(Bucket& bucket, const GeometryTileLayer& layer, const FilterExpression &filter) {
|
||||
void TileParser::addBucketGeometries(Bucket& bucket, const util::ptr<const GeometryTileLayer> layer, const FilterExpression &filter) {
|
||||
|
||||
std::unique_ptr<GeometryFilteredTileLayer> filtered_layer = layer.createFilteredTileLayer(filter);
|
||||
std::unique_ptr<GeometryFilteredTileLayer> 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<Bucket> TileParser::createFillBucket(const GeometryTileLayer& layer,
|
||||
std::unique_ptr<Bucket> TileParser::createFillBucket(const util::ptr<const GeometryTileLayer> layer,
|
||||
const StyleBucket &bucket_desc) {
|
||||
auto fill = parseStyleLayoutFill(bucket_desc, tile.id.z);
|
||||
auto bucket = util::make_unique<FillBucket>(std::move(fill),
|
||||
@@ -241,7 +240,7 @@ std::unique_ptr<Bucket> TileParser::createFillBucket(const GeometryTileLayer& la
|
||||
return obsolete() ? nullptr : std::move(bucket);
|
||||
}
|
||||
|
||||
std::unique_ptr<Bucket> TileParser::createLineBucket(const GeometryTileLayer& layer,
|
||||
std::unique_ptr<Bucket> TileParser::createLineBucket(const util::ptr<const GeometryTileLayer> layer,
|
||||
const StyleBucket &bucket_desc) {
|
||||
auto line = parseStyleLayoutLine(bucket_desc, tile.id.z);
|
||||
auto bucket = util::make_unique<LineBucket>(std::move(line),
|
||||
@@ -252,7 +251,7 @@ std::unique_ptr<Bucket> TileParser::createLineBucket(const GeometryTileLayer& la
|
||||
return obsolete() ? nullptr : std::move(bucket);
|
||||
}
|
||||
|
||||
std::unique_ptr<Bucket> TileParser::createSymbolBucket(const GeometryTileLayer& layer,
|
||||
std::unique_ptr<Bucket> TileParser::createSymbolBucket(const util::ptr<const GeometryTileLayer> layer,
|
||||
const StyleBucket &bucket_desc) {
|
||||
auto symbol = parseStyleLayoutSymbol(bucket_desc, tile.id.z);
|
||||
auto bucket = util::make_unique<SymbolBucket>(std::move(symbol), *collision);
|
||||
|
||||
@@ -53,11 +53,11 @@ private:
|
||||
void parseStyleLayers(util::ptr<const StyleLayerGroup> group);
|
||||
|
||||
std::unique_ptr<Bucket> createBucket(const StyleBucket& bucketDesc);
|
||||
std::unique_ptr<Bucket> createFillBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc);
|
||||
std::unique_ptr<Bucket> createLineBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc);
|
||||
std::unique_ptr<Bucket> createSymbolBucket(const GeometryTileLayer& layer, const StyleBucket& bucketDesc);
|
||||
std::unique_ptr<Bucket> createFillBucket(const util::ptr<const GeometryTileLayer> layer, const StyleBucket& bucketDesc);
|
||||
std::unique_ptr<Bucket> createLineBucket(const util::ptr<const GeometryTileLayer> layer, const StyleBucket& bucketDesc);
|
||||
std::unique_ptr<Bucket> createSymbolBucket(const util::ptr<const GeometryTileLayer> layer, const StyleBucket& bucketDesc);
|
||||
|
||||
template <class Bucket> void addBucketGeometries(Bucket& bucket, const GeometryTileLayer& layer, const FilterExpression& filter);
|
||||
template <class Bucket> void addBucketGeometries(Bucket& bucket, const util::ptr<const GeometryTileLayer> layer, const FilterExpression& filter);
|
||||
|
||||
private:
|
||||
const VectorTile vectorTile;
|
||||
|
||||
@@ -119,6 +119,14 @@ VectorTile& VectorTile::operator=(VectorTile&& other) {
|
||||
return *this;
|
||||
}
|
||||
|
||||
const util::ptr<const GeometryTileLayer> VectorTile::getLayer(const std::string& name) const {
|
||||
auto layer_it = layers.find(name);
|
||||
if (layer_it != layers.end()) {
|
||||
return std::make_shared<const VectorTileLayer>(layer_it->second);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
VectorTileLayer::VectorTileLayer(pbf layer_pbf)
|
||||
: feature_pbf(layer_pbf) {
|
||||
while (layer_pbf.next()) {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <mbgl/map/geometry_tile.hpp>
|
||||
#include <mbgl/style/filter_expression.hpp>
|
||||
#include <mbgl/util/ptr.hpp>
|
||||
|
||||
namespace mbgl {
|
||||
|
||||
@@ -82,7 +83,7 @@ public:
|
||||
VectorTile(pbf);
|
||||
|
||||
VectorTile& operator=(VectorTile&&);
|
||||
virtual std::map<std::string, const GeometryTileLayer> getLayers() const;
|
||||
virtual const util::ptr<const GeometryTileLayer> getLayer(const std::string&) const;
|
||||
|
||||
private:
|
||||
std::map<std::string, const VectorTileLayer> layers;
|
||||
|
||||
@@ -49,7 +49,7 @@ void SymbolBucket::addGlyphsToAtlas(uint64_t tileid, const std::string stackname
|
||||
glyphAtlas.addGlyphs(tileid, text, stackname, fontStack,face);
|
||||
}
|
||||
|
||||
std::vector<SymbolFeature> SymbolBucket::processFeatures(const GeometryTileLayer& layer,
|
||||
std::vector<SymbolFeature> SymbolBucket::processFeatures(const util::ptr<const GeometryTileLayer> layer,
|
||||
const FilterExpression &filter,
|
||||
GlyphStore &glyphStore,
|
||||
const Sprite &sprite) {
|
||||
@@ -66,7 +66,7 @@ std::vector<SymbolFeature> SymbolBucket::processFeatures(const GeometryTileLayer
|
||||
// Determine and load glyph ranges
|
||||
std::set<GlyphRange> ranges;
|
||||
|
||||
std::unique_ptr<GeometryFilteredTileLayer> filtered_layer = layer.createFilteredTileLayer(filter);
|
||||
std::unique_ptr<GeometryFilteredTileLayer> 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<SymbolFeature> SymbolBucket::processFeatures(const GeometryTileLayer
|
||||
return features;
|
||||
}
|
||||
|
||||
void SymbolBucket::addFeatures(const GeometryTileLayer& layer, const FilterExpression &filter,
|
||||
void SymbolBucket::addFeatures(const util::ptr<const GeometryTileLayer> layer, const FilterExpression &filter,
|
||||
const Tile::ID &id, SpriteAtlas &spriteAtlas, Sprite &sprite,
|
||||
GlyphAtlas & glyphAtlas, GlyphStore &glyphStore) {
|
||||
auto &layout = *styleLayout;
|
||||
|
||||
@@ -65,7 +65,7 @@ public:
|
||||
bool hasTextData() const;
|
||||
bool hasIconData() const;
|
||||
|
||||
void addFeatures(const GeometryTileLayer& layer, const FilterExpression &filter,
|
||||
void addFeatures(const util::ptr<const GeometryTileLayer> layer, const FilterExpression &filter,
|
||||
const Tile::ID &id, SpriteAtlas &spriteAtlas, Sprite &sprite,
|
||||
GlyphAtlas &glyphAtlas, GlyphStore &glyphStore);
|
||||
|
||||
@@ -78,7 +78,7 @@ public:
|
||||
|
||||
private:
|
||||
|
||||
std::vector<SymbolFeature> processFeatures(const GeometryTileLayer& layer, const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite);
|
||||
std::vector<SymbolFeature> processFeatures(const util::ptr<const GeometryTileLayer> layer, const FilterExpression &filter, GlyphStore &glyphStore, const Sprite &sprite);
|
||||
|
||||
void addFeature(const std::vector<Coordinate> &line, const Shaping &shaping, const GlyphPositions &face, const Rect<uint16_t> &image);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user