[core][tile mode] Support variable placement + icon-text-fit

This commit is contained in:
Mikhail Pozdnyakov
2020-04-08 13:55:08 +03:00
parent fe9ba477a8
commit 5a9fa44d55

View File

@@ -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);
}