diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-09-02 18:30:40 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-09-03 11:45:17 +0300 |
commit | 3b5a43c722e3dda1c05c37787296eab456614a77 (patch) | |
tree | 14bd39ed532a2087f883b5c16ecea51023ad2cf9 /src/mbgl/text | |
parent | 0fa5944f39854f42c86ce478da8869a8d4e3f1fe (diff) | |
download | qtlocation-mapboxgl-3b5a43c722e3dda1c05c37787296eab456614a77.tar.gz |
[core] Enable `text-offset` with variable label placement
Port of https://github.com/mapbox/mapbox-gl-js/pull/8642
Diffstat (limited to 'src/mbgl/text')
-rw-r--r-- | src/mbgl/text/placement.cpp | 26 | ||||
-rw-r--r-- | src/mbgl/text/placement.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/text/shaping.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/text/shaping.hpp | 2 |
4 files changed, 16 insertions, 18 deletions
diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 4cf69a11b6..a8c0a1bd44 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -86,15 +86,13 @@ void Placement::placeLayer(const RenderLayer& layer, const mat4& projMatrix, boo } namespace { -Point<float> calculateVariableLayoutOffset(style::SymbolAnchorType anchor, float width, float height, float radialOffset, float textBoxScale) { +Point<float> calculateVariableLayoutOffset(style::SymbolAnchorType anchor, float width, float height, std::array<float, 2> offset, float textBoxScale) { AnchorAlignment alignment = AnchorAlignment::getAnchorAlignment(anchor); float shiftX = -(alignment.horizontalAlign - 0.5f) * width; float shiftY = -(alignment.verticalAlign - 0.5f) * height; - Point<float> offset = SymbolLayout::evaluateRadialOffset(anchor, radialOffset); - return Point<float>( - shiftX + offset.x * textBoxScale, - shiftY + offset.y * textBoxScale - ); + auto variableOffset = SymbolLayout::evaluateVariableOffset(anchor, offset); + return { shiftX + variableOffset[0] * textBoxScale, + shiftY + variableOffset[1] * textBoxScale }; } } // namespace @@ -283,7 +281,7 @@ void Placement::placeBucket( for (size_t i = 0u; i < placementAttempts; ++i) { auto anchor = variableTextAnchors[i % anchorsSize]; const bool allowOverlap = (i >= anchorsSize); - shift = calculateVariableLayoutOffset(anchor, width, height, symbolInstance.radialTextOffset, textBoxScale); + shift = calculateVariableLayoutOffset(anchor, width, height, symbolInstance.variableTextOffset, textBoxScale); if (rotateWithMap) { float angle = pitchWithMap ? state.getBearing() : -state.getBearing(); shift = util::rotate(shift, angle); @@ -314,7 +312,7 @@ void Placement::placeBucket( } variableOffsets.insert(std::make_pair(symbolInstance.crossTileID, VariableOffset{ - symbolInstance.radialTextOffset, + symbolInstance.variableTextOffset, width, height, anchor, @@ -524,13 +522,13 @@ void Placement::updateLayerBuckets(const RenderLayer& layer, const TransformStat } namespace { -Point<float> calculateVariableRenderShift(style::SymbolAnchorType anchor, float width, float height, float radialOffset, float textBoxScale, float renderTextSize) { +Point<float> calculateVariableRenderShift(style::SymbolAnchorType anchor, float width, float height, std::array<float, 2> textOffset, float textBoxScale, float renderTextSize) { AnchorAlignment alignment = AnchorAlignment::getAnchorAlignment(anchor); float shiftX = -(alignment.horizontalAlign - 0.5f) * width; float shiftY = -(alignment.verticalAlign - 0.5f) * height; - Point<float> offset = SymbolLayout::evaluateRadialOffset(anchor, radialOffset); - return { (shiftX / textBoxScale + offset.x) * renderTextSize, - (shiftY / textBoxScale + offset.y) * renderTextSize }; + auto variablOffset = SymbolLayout::evaluateVariableOffset(anchor, textOffset); + return { (shiftX / textBoxScale + variablOffset[0]) * renderTextSize, + (shiftY / textBoxScale + variablOffset[1]) * renderTextSize }; } } // namespace @@ -610,7 +608,7 @@ bool Placement::updateBucketDynamicVertices(SymbolBucket& bucket, const Transfor (*variableOffset).anchor, (*variableOffset).width, (*variableOffset).height, - (*variableOffset).radialOffset, + (*variableOffset).offset, (*variableOffset).textBoxScale, renderTextSize); @@ -815,7 +813,7 @@ void Placement::updateBucketOpacities(SymbolBucket& bucket, const TransformState shift = calculateVariableLayoutOffset(variableOffset.anchor, variableOffset.width, variableOffset.height, - variableOffset.radialOffset, + variableOffset.offset, variableOffset.textBoxScale); if (rotateWithMap) { shift = util::rotate(shift, pitchWithMap ? state.getBearing() : -state.getBearing()); diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 2349fd3785..c1fe69b852 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -34,7 +34,7 @@ public: class VariableOffset { public: - float radialOffset; + std::array<float, 2> offset; float width; float height; style::TextVariableAnchorType anchor; diff --git a/src/mbgl/text/shaping.cpp b/src/mbgl/text/shaping.cpp index 0cb9ea73a9..d6d9a3d34e 100644 --- a/src/mbgl/text/shaping.cpp +++ b/src/mbgl/text/shaping.cpp @@ -413,7 +413,7 @@ const Shaping getShaping(const TaggedString& formattedString, const style::SymbolAnchorType textAnchor, const style::TextJustifyType textJustify, const float spacing, - const Point<float>& translate, + const std::array<float, 2>& translate, const WritingModeType writingMode, BiDi& bidi, const GlyphMap& glyphs, @@ -432,7 +432,7 @@ const Shaping getShaping(const TaggedString& formattedString, reorderedLines.emplace_back(line, formattedString.getSections()); } } - Shaping shaping(translate.x, translate.y, writingMode, reorderedLines.size()); + Shaping shaping(translate[0], translate[1], writingMode, reorderedLines.size()); shapeLines(shaping, reorderedLines, spacing, lineHeight, textAnchor, textJustify, writingMode, glyphs, allowVerticalPlacement); diff --git a/src/mbgl/text/shaping.hpp b/src/mbgl/text/shaping.hpp index 60a9c718ff..0e2f5515fe 100644 --- a/src/mbgl/text/shaping.hpp +++ b/src/mbgl/text/shaping.hpp @@ -73,7 +73,7 @@ const Shaping getShaping(const TaggedString& string, style::SymbolAnchorType textAnchor, style::TextJustifyType textJustify, float spacing, - const Point<float>& translate, + const std::array<float, 2>& translate, const WritingModeType, BiDi& bidi, const GlyphMap& glyphs, |