summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnsis Brammanis <ansis@mapbox.com>2019-10-22 20:30:55 -0400
committerDane Springmeyer <dane@mapbox.com>2019-10-24 13:32:03 -0700
commitb60c57e571f9dc7b01c2620251e3fd992ca6aaac (patch)
treee9cd19514aaae6e9235efdcfce71620e189b5d2e
parent213ba8a13c42b0e7adab919fe0ca26e59cadef49 (diff)
downloadqtlocation-mapboxgl-upstream/v5.0.0-line-atlas-overflow-fix.tar.gz
merge in https://github.com/mapbox/mapbox-gl-native/pull/15828upstream/v5.0.0-line-atlas-overflow-fix
-rw-r--r--src/mbgl/text/placement.cpp59
1 files changed, 49 insertions, 10 deletions
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp
index 7343f19aea..ecc8f93032 100644
--- a/src/mbgl/text/placement.cpp
+++ b/src/mbgl/text/placement.cpp
@@ -220,7 +220,6 @@ void Placement::placeBucket(
if (horizontalTextIndex) {
const PlacedSymbol& placedSymbol = bucket.text.placedSymbols.at(*horizontalTextIndex);
const float fontSize = evaluateSizeForFeature(partiallyEvaluatedTextSize, placedSymbol);
- const CollisionFeature& textCollisionFeature = symbolInstance.textCollisionFeature;
const auto updatePreviousOrientationIfNotPlaced = [&](bool isPlaced) {
if (bucket.allowVerticalPlacement && !isPlaced && getPrevPlacement()) {
@@ -282,7 +281,8 @@ void Placement::placeBucket(
placeText = placed.first;
offscreen &= placed.second;
- } else if (!textCollisionFeature.alongLine && !textCollisionFeature.boxes.empty()) {
+ } else if (!symbolInstance.textCollisionFeature.alongLine &&
+ !symbolInstance.textCollisionFeature.boxes.empty()) {
// If this symbol was in the last placement, shift the previously used
// anchor to the front of the anchor list, only if the previous anchor
// is still in the anchor list.
@@ -305,8 +305,13 @@ void Placement::placeBucket(
}
}
- const auto placeFeatureForVariableAnchors = [&] (const CollisionFeature& collisionFeature, style::TextWritingModeType orientation) {
- const CollisionBox& textBox = collisionFeature.boxes[0];
+ const bool doVariableIconPlacement =
+ hasIconTextFit && !iconAllowOverlap && symbolInstance.placedIconIndex;
+
+ const auto placeFeatureForVariableAnchors = [&](const CollisionFeature& textCollisionFeature,
+ style::TextWritingModeType orientation,
+ const CollisionFeature& iconCollisionFeature) {
+ const CollisionBox& textBox = textCollisionFeature.boxes[0];
const float width = textBox.x2 - textBox.x1;
const float height = textBox.y2 - textBox.y1;
const float textBoxScale = symbolInstance.textBoxScale;
@@ -323,12 +328,40 @@ void Placement::placeBucket(
}
textBoxes.clear();
- placedFeature = collisionIndex.placeFeature(collisionFeature, shift,
- posMatrix, mat4(), pixelRatio,
- placedSymbol, scale, fontSize,
+ placedFeature = collisionIndex.placeFeature(textCollisionFeature,
+ shift,
+ posMatrix,
+ mat4(),
+ pixelRatio,
+ placedSymbol,
+ scale,
+ fontSize,
allowOverlap,
pitchWithMap,
- params.showCollisionBoxes, avoidEdges, collisionGroup.second, textBoxes);
+ params.showCollisionBoxes,
+ avoidEdges,
+ collisionGroup.second,
+ textBoxes);
+
+ if (doVariableIconPlacement) {
+ auto placedIconFeature = collisionIndex.placeFeature(iconCollisionFeature,
+ shift,
+ posMatrix,
+ iconLabelPlaneMatrix,
+ pixelRatio,
+ placedSymbol,
+ scale,
+ fontSize,
+ iconAllowOverlap,
+ pitchWithMap,
+ params.showCollisionBoxes,
+ avoidEdges,
+ collisionGroup.second,
+ iconBoxes);
+ iconBoxes.clear();
+ if (!placedIconFeature.first) continue;
+ }
+
if (placedFeature.first) {
assert(symbolInstance.crossTileID != 0u);
optional<style::TextVariableAnchorType> prevAnchor;
@@ -366,12 +399,18 @@ void Placement::placeBucket(
};
const auto placeHorizontal = [&] {
- return placeFeatureForVariableAnchors(symbolInstance.textCollisionFeature, style::TextWritingModeType::Horizontal);
+ return placeFeatureForVariableAnchors(symbolInstance.textCollisionFeature,
+ style::TextWritingModeType::Horizontal,
+ symbolInstance.iconCollisionFeature);
};
const auto placeVertical = [&] {
if (bucket.allowVerticalPlacement && !placed.first && symbolInstance.verticalTextCollisionFeature) {
- return placeFeatureForVariableAnchors(*symbolInstance.verticalTextCollisionFeature, style::TextWritingModeType::Vertical);
+ return placeFeatureForVariableAnchors(*symbolInstance.verticalTextCollisionFeature,
+ style::TextWritingModeType::Vertical,
+ symbolInstance.verticalIconCollisionFeature
+ ? *symbolInstance.verticalIconCollisionFeature
+ : symbolInstance.iconCollisionFeature);
}
return std::pair<bool, bool>{false, false};
};