summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mbgl/text/placement.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp
index 32def0b611..62ac70a0d6 100644
--- a/src/mbgl/text/placement.cpp
+++ b/src/mbgl/text/placement.cpp
@@ -562,9 +562,15 @@ void Placement::placeBucket(const SymbolBucket& bucket,
symbolInstances.end());
optional<style::TextVariableAnchorType> variableAnchor;
if (!variableTextAnchors.empty()) variableAnchor = variableTextAnchors.front();
+ std::unordered_map<uint32_t, bool> sortedCache;
+ sortedCache.reserve(sorted.size());
auto intersectsTileBorder = [&](const SymbolInstance& symbol) -> bool {
- if (symbol.textCollisionFeature.boxes.empty()) return false;
+ if (symbol.textCollisionFeature.alongLine || symbol.textCollisionFeature.boxes.empty()) return false;
+
+ auto it = sortedCache.find(symbol.crossTileID);
+ if (it != sortedCache.end()) return it->second;
+
Point<float> offset{};
if (variableAnchor) {
const CollisionBox& textBox = symbol.textCollisionFeature.boxes.front();
@@ -579,8 +585,10 @@ void Placement::placeBucket(const SymbolBucket& bucket,
pitchWithMap,
state.getBearing());
}
- return collisionIndex.featureIntersectsTileBorders(
+ bool result = collisionIndex.featureIntersectsTileBorders(
symbol.textCollisionFeature, offset, posMatrix, pixelRatio, *tileBorders);
+ sortedCache.insert(std::make_pair(symbol.crossTileID, result));
+ return result;
};
std::stable_sort(sorted.begin(), sorted.end(), [&](const SymbolInstance& a, const SymbolInstance& b) {