summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-04-08 13:55:08 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2020-04-08 13:55:08 +0300
commitf2a2e6ece4314a7399d0b768faf1b1a3716a4b39 (patch)
treec43fe68049259090885a398595e6f20b2dc7cb47
parent7f53cec17b047a1804952a8da543dc10321e1dae (diff)
downloadqtlocation-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.cpp16
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);
}