diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-04-08 13:55:08 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2020-04-08 13:55:08 +0300 |
commit | f2a2e6ece4314a7399d0b768faf1b1a3716a4b39 (patch) | |
tree | c43fe68049259090885a398595e6f20b2dc7cb47 | |
parent | 7f53cec17b047a1804952a8da543dc10321e1dae (diff) | |
download | qtlocation-mapboxgl-upstream/mikhail_tile_mode_variable_labels_with_icon_text_fit.tar.gz |
[core][tile mode] Support variable placement + icon-text-fitupstream/mikhail_tile_mode_variable_labels_with_icon_text_fit
-rw-r--r-- | src/mbgl/text/placement.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index f33c6885d9..87c505f2d8 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -1406,6 +1406,7 @@ void TilePlacement::placeSymbolBucket(const BucketPlacementData& params, std::se variableAnchor, pitchTextWithMap = ctx.pitchTextWithMap, rotateTextWithMap = ctx.rotateTextWithMap, + variableIconPlacement = ctx.hasIconTextFit && !ctx.iconAllowOverlap, bearing = ctx.getTransformState().getBearing() ](const SymbolInstance& symbol) noexcept->IntersectStatus { IntersectStatus result; @@ -1430,7 +1431,20 @@ void TilePlacement::placeSymbolBucket(const BucketPlacementData& params, std::se if (!symbol.iconCollisionFeature.boxes.empty()) { const auto& iconCollisionBox = symbol.iconCollisionFeature.boxes.front(); - auto iconIntersects = collisionBoxIntersectsTileEdges(iconCollisionBox, {}); + Point<float> offset{}; + if (variableAnchor && variableIconPlacement) { + float width = iconCollisionBox.x2 - iconCollisionBox.x1; + float height = iconCollisionBox.y2 - iconCollisionBox.y1; + offset = calculateVariableLayoutOffset(*variableAnchor, + width, + height, + symbol.variableTextOffset, + symbol.textBoxScale, + rotateTextWithMap, + pitchTextWithMap, + bearing); + } + auto iconIntersects = collisionBoxIntersectsTileEdges(iconCollisionBox, offset); result.flags |= iconIntersects.flags; result.minSectionLength = std::max(result.minSectionLength, iconIntersects.minSectionLength); } |