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 17:00:21 +0300 |
commit | 5a9fa44d5566884a07994c7c03744239fd83b7fd (patch) | |
tree | eeced164d0629d9627b3634a1fa7aa40a5d40adb /src | |
parent | fe9ba477a8e0af29b0c44d0c50a2946bba5a6f5a (diff) | |
download | qtlocation-mapboxgl-5a9fa44d5566884a07994c7c03744239fd83b7fd.tar.gz |
[core][tile mode] Support variable placement + icon-text-fit
Diffstat (limited to 'src')
-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); } |