From 6ec49d5ee0aa2599d03d89f639baac1b3a379052 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Sat, 11 Jul 2020 16:51:56 +0200 Subject: [PATCH] Fix upright labels on vector tiles --- .../layer-vectortile-rotate-text/expected.png | Bin 0 -> 15698 bytes .../layer-vectortile-rotate-text/main.js | 44 ++++++++++++++++++ src/ol/geom/flat/textpath.js | 22 ++++++++- src/ol/render/canvas/Executor.js | 3 +- 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 rendering/cases/layer-vectortile-rotate-text/expected.png create mode 100644 rendering/cases/layer-vectortile-rotate-text/main.js diff --git a/rendering/cases/layer-vectortile-rotate-text/expected.png b/rendering/cases/layer-vectortile-rotate-text/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..c035e9ec7e8887784df8677f87f4c5eeb482743e GIT binary patch literal 15698 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 flatCoordinates Path to put text on. @@ -15,6 +16,7 @@ import {lerp} from '../../math.js'; * @param {function(string, string, Object):number} measureAndCacheTextWidth Measure and cache text width. * @param {string} font The font. * @param {Object} cache A cache of measured widths. + * @param {number} rotation Rotation to apply to the flatCoordinates to determine whether text needs to be reversed. * @return {Array>} The result array (or null if `maxAngle` was * exceeded). Entries of the array are x, y, anchorX, angle, chunk. */ @@ -29,12 +31,28 @@ export function drawTextOnPath( scale, measureAndCacheTextWidth, font, - cache + cache, + rotation ) { const result = []; // Keep text upright - const reverse = flatCoordinates[offset] > flatCoordinates[end - stride]; + let reverse; + if (rotation) { + const rotatedCoordinates = rotate( + flatCoordinates, + offset, + end, + stride, + rotation, + [flatCoordinates[offset], flatCoordinates[offset + 1]] + ); + reverse = + rotatedCoordinates[0] > + rotatedCoordinates[rotatedCoordinates.length - stride]; + } else { + reverse = flatCoordinates[offset] > flatCoordinates[end - stride]; + } const numChars = text.length; diff --git a/src/ol/render/canvas/Executor.js b/src/ol/render/canvas/Executor.js index 1df7430306..5fdd1e6c54 100644 --- a/src/ol/render/canvas/Executor.js +++ b/src/ol/render/canvas/Executor.js @@ -957,7 +957,8 @@ class Executor { Math.abs(textScale[0]), measureAndCacheTextWidth, font, - cachedWidths + cachedWidths, + viewRotationFromTransform ? 0 : this.viewRotation_ ); if (parts) { let rendered = false;