From 1fe5c95329d4c04d92da8471a219df05ff7df220 Mon Sep 17 00:00:00 2001 From: Nicki Dlugash Date: Tue, 1 Aug 2017 16:38:48 -0400 Subject: [PATCH] Implement DDS for `text-letter-spacing` property (#5071) --- src/data/bucket/symbol_bucket.js | 2 +- src/style-spec/reference/v8.json | 5 +- .../property-function/expected.png | Bin 0 -> 10765 bytes .../property-function/style.json | 63 ++++++++++++++++ .../zoom-and-property-function/expected.png | Bin 0 -> 17104 bytes .../zoom-and-property-function/style.json | 69 ++++++++++++++++++ 6 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 test/integration/render-tests/text-letter-spacing/property-function/expected.png create mode 100644 test/integration/render-tests/text-letter-spacing/property-function/style.json create mode 100644 test/integration/render-tests/text-letter-spacing/zoom-and-property-function/expected.png create mode 100644 test/integration/render-tests/text-letter-spacing/zoom-and-property-function/style.json diff --git a/src/data/bucket/symbol_bucket.js b/src/data/bucket/symbol_bucket.js index 4c345264ba3..72b45522712 100644 --- a/src/data/bucket/symbol_bucket.js +++ b/src/data/bucket/symbol_bucket.js @@ -404,7 +404,6 @@ class SymbolBucket { const oneEm = 24; const lineHeight = layout['text-line-height'] * oneEm; - const spacing = layout['text-letter-spacing'] * oneEm; const fontstack = this.fontstack = layout['text-font'].join(','); const textAlongLine = layout['text-rotation-alignment'] === 'map' && layout['symbol-placement'] === 'line'; @@ -414,6 +413,7 @@ class SymbolBucket { if (feature.text) { const allowsVerticalWritingMode = scriptDetection.allowsVerticalWritingMode(feature.text); const textOffset = this.layers[0].getLayoutValue('text-offset', {zoom: this.zoom}, feature.properties).map((t)=> t * oneEm); + const spacing = this.layers[0].getLayoutValue('text-letter-spacing', {zoom: this.zoom}, feature.properties) * oneEm; const spacingIfAllowed = scriptDetection.allowsLetterSpacing(feature.text) ? spacing : 0; const textAnchor = this.layers[0].getLayoutValue('text-anchor', {zoom: this.zoom}, feature.properties); const textJustify = this.layers[0].getLayoutValue('text-justify', {zoom: this.zoom}, feature.properties); diff --git a/src/style-spec/reference/v8.json b/src/style-spec/reference/v8.json index 593c71b6d7f..0dc14a42d02 100644 --- a/src/style-spec/reference/v8.json +++ b/src/style-spec/reference/v8.json @@ -1253,6 +1253,7 @@ "units": "ems", "function": "interpolated", "zoom-function": true, + "property-function": true, "doc": "Text tracking amount.", "requires": [ "text-field" @@ -1264,7 +1265,9 @@ "ios": "2.0.0", "macos": "0.1.0" }, - "data-driven styling": {} + "data-driven styling": { + "js": "0.40.0" + } } }, "text-justify": { diff --git a/test/integration/render-tests/text-letter-spacing/property-function/expected.png b/test/integration/render-tests/text-letter-spacing/property-function/expected.png new file mode 100644 index 0000000000000000000000000000000000000000..4e9056898bccf2ef769e16bc5590ad4481242583 GIT binary patch literal 10765 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