diff options
author | Ansis Brammanis <ansis@mapbox.com> | 2019-10-17 12:31:07 -0400 |
---|---|---|
committer | Ansis Brammanis <ansis@mapbox.com> | 2019-10-22 17:31:18 -0400 |
commit | 020473714300ebf37a3575ba677a5dc2107111a2 (patch) | |
tree | 7883c43457a3f73c6e317c5af6f2fb293564bdb6 | |
parent | b1d048217a08bf38f0c2037d56381e158da7b6bf (diff) | |
download | qtlocation-mapboxgl-020473714300ebf37a3575ba677a5dc2107111a2.tar.gz |
[core] consider icon-text-fit when doing variable text placement
port 61a61a1982cb8c637d467f91da5b0817a61a9de6
-rw-r--r-- | src/mbgl/text/placement.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 8b0a3975fc..90cd5a050b 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -305,7 +305,9 @@ void Placement::placeBucket( } } - const auto placeFeatureForVariableAnchors = [&] (const CollisionFeature& collisionFeature, style::TextWritingModeType orientation) { + const bool doVariableIconPlacement = hasIconTextFit && !iconAllowOverlap && symbolInstance.placedIconIndex; + + const auto placeFeatureForVariableAnchors = [&] (const CollisionFeature& collisionFeature, style::TextWritingModeType orientation, const CollisionFeature& iconCollisionFeature) { const CollisionBox& textBox = collisionFeature.boxes[0]; const float width = textBox.x2 - textBox.x1; const float height = textBox.y2 - textBox.y1; @@ -329,6 +331,15 @@ void Placement::placeBucket( allowOverlap, pitchWithMap, 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 +377,13 @@ 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}; }; |