summaryrefslogtreecommitdiff
path: root/src/mbgl/layout/symbol_layout.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/layout/symbol_layout.cpp')
-rw-r--r--src/mbgl/layout/symbol_layout.cpp57
1 files changed, 31 insertions, 26 deletions
diff --git a/src/mbgl/layout/symbol_layout.cpp b/src/mbgl/layout/symbol_layout.cpp
index e954a26a50..63ce223574 100644
--- a/src/mbgl/layout/symbol_layout.cpp
+++ b/src/mbgl/layout/symbol_layout.cpp
@@ -86,6 +86,7 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters,
sourceLayer(std::move(sourceLayer_)),
overscaling(parameters.tileID.overscaleFactor()),
zoom(parameters.tileID.overscaledZ),
+ canonicalID(parameters.tileID.canonical),
mode(parameters.mode),
pixelRatio(parameters.pixelRatio),
tileSize(util::tileSize * overscaling),
@@ -141,9 +142,9 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters,
ft.index = i;
if (hasText) {
- auto formatted = layout->evaluate<TextField>(zoom, ft, layoutParameters.availableImages);
- auto textTransform = layout->evaluate<TextTransform>(zoom, ft);
- FontStack baseFontStack = layout->evaluate<TextFont>(zoom, ft);
+ auto formatted = layout->evaluate<TextField>(zoom, ft, layoutParameters.availableImages, canonicalID);
+ auto textTransform = layout->evaluate<TextTransform>(zoom, ft, canonicalID);
+ FontStack baseFontStack = layout->evaluate<TextFont>(zoom, ft, canonicalID);
ft.formattedText = TaggedString();
for (const auto & section : formatted.sections) {
@@ -188,13 +189,13 @@ SymbolLayout::SymbolLayout(const BucketParameters& parameters,
}
if (hasIcon) {
- ft.icon = layout->evaluate<IconImage>(zoom, ft, layoutParameters.availableImages);
+ ft.icon = layout->evaluate<IconImage>(zoom, ft, layoutParameters.availableImages, canonicalID);
layoutParameters.imageDependencies.emplace(ft.icon->id(), ImageType::Icon);
}
if (ft.formattedText || ft.icon) {
if (sortFeaturesByKey) {
- ft.sortKey = layout->evaluate<SymbolSortKey>(zoom, ft);
+ ft.sortKey = layout->evaluate<SymbolSortKey>(zoom, ft, canonicalID);
const auto lowerBound = std::lower_bound(features.begin(), features.end(), ft);
features.insert(lowerBound, std::move(ft));
} else {
@@ -355,14 +356,16 @@ void SymbolLayout::prepareSymbols(const GlyphMap& glyphMap,
ShapedTextOrientations shapedTextOrientations;
optional<PositionedIcon> shapedIcon;
std::array<float, 2> textOffset{{0.0f, 0.0f}};
- const float layoutTextSize = layout->evaluate<TextSize>(zoom + 1, feature);
- const float layoutTextSizeAtBucketZoomLevel = layout->evaluate<TextSize>(zoom, feature);
- const float layoutIconSize = layout->evaluate<IconSize>(zoom + 1, feature);
+ const float layoutTextSize = layout->evaluate<TextSize>(zoom + 1, feature, canonicalID);
+ const float layoutTextSizeAtBucketZoomLevel = layout->evaluate<TextSize>(zoom, feature, canonicalID);
+ const float layoutIconSize = layout->evaluate<IconSize>(zoom + 1, feature, canonicalID);
// if feature has text, shape the text
if (feature.formattedText && layoutTextSize > 0.0f) {
const float lineHeight = layout->get<TextLineHeight>() * util::ONE_EM;
- const float spacing = util::i18n::allowsLetterSpacing(feature.formattedText->rawText()) ? layout->evaluate<TextLetterSpacing>(zoom, feature) * util::ONE_EM : 0.0f;
+ const float spacing = util::i18n::allowsLetterSpacing(feature.formattedText->rawText())
+ ? layout->evaluate<TextLetterSpacing>(zoom, feature, canonicalID) * util::ONE_EM
+ : 0.0f;
auto applyShaping = [&](const TaggedString& formattedText,
WritingModeType writingMode,
@@ -371,7 +374,7 @@ void SymbolLayout::prepareSymbols(const GlyphMap& glyphMap,
const Shaping result = getShaping(
/* string */ formattedText,
/* maxWidth: ems */
- isPointPlacement ? layout->evaluate<TextMaxWidth>(zoom, feature) * util::ONE_EM : 0.0f,
+ isPointPlacement ? layout->evaluate<TextMaxWidth>(zoom, feature, canonicalID) * util::ONE_EM : 0.0f,
/* ems */ lineHeight,
textAnchor,
textJustify,
@@ -389,22 +392,24 @@ void SymbolLayout::prepareSymbols(const GlyphMap& glyphMap,
return result;
};
- const std::vector<style::TextVariableAnchorType> variableTextAnchor = layout->evaluate<TextVariableAnchor>(zoom, feature);
- const SymbolAnchorType textAnchor = layout->evaluate<TextAnchor>(zoom, feature);
+ const std::vector<style::TextVariableAnchorType> variableTextAnchor =
+ layout->evaluate<TextVariableAnchor>(zoom, feature, canonicalID);
+ const SymbolAnchorType textAnchor = layout->evaluate<TextAnchor>(zoom, feature, canonicalID);
if (variableTextAnchor.empty()) {
// Layers with variable anchors use the `text-radial-offset` property and the [x, y] offset vector
// is calculated at placement time instead of layout time
- const float radialOffset = layout->evaluate<TextRadialOffset>(zoom, feature);
+ const float radialOffset = layout->evaluate<TextRadialOffset>(zoom, feature, canonicalID);
if (radialOffset > 0.0f) {
// The style spec says don't use `text-offset` and `text-radial-offset` together
// but doesn't actually specify what happens if you use both. We go with the radial offset.
textOffset = evaluateRadialOffset(textAnchor, radialOffset * util::ONE_EM);
} else {
- textOffset = {{layout->evaluate<TextOffset>(zoom, feature)[0] * util::ONE_EM,
- layout->evaluate<TextOffset>(zoom, feature)[1] * util::ONE_EM}};
+ textOffset = {{layout->evaluate<TextOffset>(zoom, feature, canonicalID)[0] * util::ONE_EM,
+ layout->evaluate<TextOffset>(zoom, feature, canonicalID)[1] * util::ONE_EM}};
}
}
- TextJustifyType textJustify = textAlongLine ? TextJustifyType::Center : layout->evaluate<TextJustify>(zoom, feature);
+ TextJustifyType textJustify =
+ textAlongLine ? TextJustifyType::Center : layout->evaluate<TextJustify>(zoom, feature, canonicalID);
const auto addVerticalShapingForPointLabelIfNeeded = [&] {
if (allowVerticalPlacement && feature.formattedText->allowsVerticalWritingMode()) {
@@ -474,8 +479,8 @@ void SymbolLayout::prepareSymbols(const GlyphMap& glyphMap,
if (image != imageMap.end()) {
iconType = SymbolContent::IconRGBA;
shapedIcon = PositionedIcon::shapeIcon(imagePositions.at(feature.icon->id()),
- layout->evaluate<IconOffset>(zoom, feature),
- layout->evaluate<IconAnchor>(zoom, feature));
+ layout->evaluate<IconOffset>(zoom, feature, canonicalID),
+ layout->evaluate<IconAnchor>(zoom, feature, canonicalID));
if (image->second->sdf) {
iconType = SymbolContent::IconSDF;
}
@@ -520,13 +525,13 @@ void SymbolLayout::addFeature(const std::size_t layoutFeatureIndex,
const float minScale = 0.5f;
const float glyphSize = 24.0f;
- const std::array<float, 2> iconOffset = layout->evaluate<IconOffset>(zoom, feature);
+ const std::array<float, 2> iconOffset = layout->evaluate<IconOffset>(zoom, feature, canonicalID);
// To reduce the number of labels that jump around when zooming we need
// to use a text-size value that is the same for all zoom levels.
// This calculates text-size at a high zoom level so that all tiles can
// use the same value when calculating anchor positions.
- const float textMaxSize = layout->evaluate<TextSize>(18, feature);
+ const float textMaxSize = layout->evaluate<TextSize>(18, feature, canonicalID);
const float fontScale = layoutTextSize / glyphSize;
const float textBoxScale = tilePixelRatio * fontScale;
@@ -536,15 +541,15 @@ void SymbolLayout::addFeature(const std::size_t layoutFeatureIndex,
const float textPadding = layout->get<TextPadding>() * tilePixelRatio;
const float iconPadding = layout->get<IconPadding>() * tilePixelRatio;
const float textMaxAngle = layout->get<TextMaxAngle>() * util::DEG2RAD;
- const float iconRotation = layout->evaluate<IconRotate>(zoom, feature);
- const float textRotation = layout->evaluate<TextRotate>(zoom, feature);
+ const float iconRotation = layout->evaluate<IconRotate>(zoom, feature, canonicalID);
+ const float textRotation = layout->evaluate<TextRotate>(zoom, feature, canonicalID);
std::array<float, 2> variableTextOffset;
if (!textRadialOffset.isUndefined()) {
- variableTextOffset = {{layout->evaluate<TextRadialOffset>(zoom, feature) * util::ONE_EM,
- INVALID_OFFSET_VALUE}};
+ variableTextOffset = {
+ {layout->evaluate<TextRadialOffset>(zoom, feature, canonicalID) * util::ONE_EM, INVALID_OFFSET_VALUE}};
} else {
- variableTextOffset = {{layout->evaluate<TextOffset>(zoom, feature)[0] * util::ONE_EM,
- layout->evaluate<TextOffset>(zoom, feature)[1] * util::ONE_EM}};
+ variableTextOffset = {{layout->evaluate<TextOffset>(zoom, feature, canonicalID)[0] * util::ONE_EM,
+ layout->evaluate<TextOffset>(zoom, feature, canonicalID)[1] * util::ONE_EM}};
}
const SymbolPlacementType textPlacement = layout->get<TextRotationAlignment>() != AlignmentType::Map