summaryrefslogtreecommitdiff
path: root/src/mbgl/text/cross_tile_symbol_index.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/text/cross_tile_symbol_index.cpp')
-rw-r--r--src/mbgl/text/cross_tile_symbol_index.cpp66
1 files changed, 27 insertions, 39 deletions
diff --git a/src/mbgl/text/cross_tile_symbol_index.cpp b/src/mbgl/text/cross_tile_symbol_index.cpp
index 177615857f..6efded8e4a 100644
--- a/src/mbgl/text/cross_tile_symbol_index.cpp
+++ b/src/mbgl/text/cross_tile_symbol_index.cpp
@@ -57,50 +57,35 @@ void TileLayerIndex::findMatches(std::vector<SymbolInstance>& symbolInstances, c
CrossTileSymbolLayerIndex::CrossTileSymbolLayerIndex() {
}
-void CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& coord, SymbolBucket& bucket, uint32_t& maxCrossTileID) {
- if (bucket.bucketInstanceId) return;
- bucket.bucketInstanceId = ++maxBucketInstanceId;
-
- uint8_t minZoom = 25;
- uint8_t maxZoom = 0;
- for (auto& it : indexes) {
- auto z = it.first;
- minZoom = std::min(minZoom, z);
- maxZoom = std::max(maxZoom, z);
+bool CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& tileID, SymbolBucket& bucket, uint32_t& maxCrossTileID) {
+ auto thisZoomIndexes = indexes[tileID.overscaledZ];
+ auto previousIndex = thisZoomIndexes.find(tileID);
+ if (previousIndex != thisZoomIndexes.end() && previousIndex->second.bucketInstanceId == bucket.bucketInstanceId) {
+ return false;
}
+ for (auto& symbolInstance: bucket.symbolInstances) {
+ symbolInstance.crossTileID = 0;
+ }
- // make all higher-res child tiles block duplicate labels in this tile
- for (auto z = maxZoom; z > coord.overscaledZ; z--) {
- auto zoomIndexes = indexes.find(z);
- if (zoomIndexes != indexes.end()) {
- for (auto& childIndex : zoomIndexes->second) {
- if (!childIndex.second.coord.isChildOf(coord)) {
- continue;
+ for (auto& it : indexes) {
+ auto zoom = it.first;
+ auto zoomIndexes = it.second;
+ if (zoom > tileID.overscaledZ) {
+ for (auto& childIndex : zoomIndexes) {
+ if (childIndex.second.coord.isChildOf(tileID)) {
+ childIndex.second.findMatches(bucket.symbolInstances, tileID);
}
- childIndex.second.findMatches(bucket.symbolInstances, coord);
}
- }
- if (z == 0) {
- break;
- }
- }
-
- // make this tile block duplicate labels in lower-res parent tiles
- for (auto z = coord.overscaledZ; z >= minZoom; z--) {
- auto parentCoord = coord.scaledTo(z);
- auto zoomIndexes = indexes.find(z);
- if (zoomIndexes != indexes.end()) {
- auto parentIndex = zoomIndexes->second.find(parentCoord);
- if (parentIndex != zoomIndexes->second.end()) {
- parentIndex->second.findMatches(bucket.symbolInstances, coord);
+ } else {
+ auto parentTileID = tileID.scaledTo(zoom);
+ auto parentIndex = zoomIndexes.find(parentTileID);
+ if (parentIndex != zoomIndexes.end()) {
+ parentIndex->second.findMatches(bucket.symbolInstances, tileID);
}
}
- if (z == 0) {
- break;
- }
}
-
+
for (auto& symbolInstance : bucket.symbolInstances) {
if (!symbolInstance.crossTileID) {
// symbol did not match any known symbol, assign a new id
@@ -108,7 +93,8 @@ void CrossTileSymbolLayerIndex::addBucket(const OverscaledTileID& coord, SymbolB
}
}
- indexes[coord.overscaledZ].emplace(coord, TileLayerIndex(coord, bucket.symbolInstances, bucket.bucketInstanceId));
+ indexes[tileID.overscaledZ].emplace(tileID, TileLayerIndex(tileID, bucket.symbolInstances, bucket.bucketInstanceId));
+ return true;
}
bool CrossTileSymbolLayerIndex::removeStaleBuckets(const std::unordered_set<uint32_t>& currentIDs) {
@@ -145,9 +131,11 @@ bool CrossTileSymbolIndex::addLayer(RenderSymbolLayer& symbolLayer) {
SymbolBucket& symbolBucket = *reinterpret_cast<SymbolBucket*>(bucket);
if (!symbolBucket.bucketInstanceId) {
- symbolBucketsChanged = true;
+ symbolBucket.bucketInstanceId = ++maxBucketInstanceId;
}
- layerIndex.addBucket(renderTile.tile.id, symbolBucket, maxCrossTileID);
+
+ const bool bucketAdded = layerIndex.addBucket(renderTile.tile.id, symbolBucket, maxCrossTileID);
+ symbolBucketsChanged = symbolBucketsChanged || bucketAdded;
currentBucketIDs.insert(symbolBucket.bucketInstanceId);
}