From 431d570b91a243599fe19f8dd68b768463ecbcb0 Mon Sep 17 00:00:00 2001 From: Andreas Hocevar Date: Thu, 2 Nov 2017 19:51:47 +0100 Subject: [PATCH] Only split text at line angle changes --- examples/vector-labels.js | 2 +- src/ol/geom/flat/textpath.js | 42 ++++-- src/ol/render/canvas/replay.js | 64 +++++---- src/ol/render/canvas/textreplay.js | 121 +++++++++--------- .../style/expected/text-multilinestring.png | Bin 17543 -> 19575 bytes test/rendering/ol/style/text.test.js | 2 +- test/spec/ol/geom/flat/textpath.test.js | 45 +++---- 7 files changed, 153 insertions(+), 123 deletions(-) diff --git a/examples/vector-labels.js b/examples/vector-labels.js index ef80956195..c11bf40825 100644 --- a/examples/vector-labels.js +++ b/examples/vector-labels.js @@ -77,7 +77,7 @@ var getText = function(feature, resolution, dom) { text = ''; } else if (type == 'shorten') { text = text.trunc(12); - } else if (type == 'wrap') { + } else if (type == 'wrap' && dom.placement.value != 'line') { text = stringDivider(text, 16, '\n'); } diff --git a/src/ol/geom/flat/textpath.js b/src/ol/geom/flat/textpath.js index bd84defe32..87a20d607c 100644 --- a/src/ol/geom/flat/textpath.js +++ b/src/ol/geom/flat/textpath.js @@ -13,16 +13,12 @@ goog.require('ol.math'); * width of the character passed as 1st argument. * @param {number} startM m along the path where the text starts. * @param {number} maxAngle Max angle between adjacent chars in radians. - * @param {Array.>=} opt_result Array that will be populated with the - * result. Each entry consists of an array of x, y and z of the char to draw. - * If provided, this array will not be truncated to the number of characters of - * the `text`. - * @return {Array.>} The result array of null if `maxAngle` was - * exceeded. + * @return {Array.>} The result array of null if `maxAngle` was + * exceeded. Entries of the array are x, y, anchorX, angle, chunk. */ ol.geom.flat.textpath.lineString = function( - flatCoordinates, offset, end, stride, text, measure, startM, maxAngle, opt_result) { - var result = opt_result ? opt_result : []; + flatCoordinates, offset, end, stride, text, measure, startM, maxAngle) { + var result = []; // Keep text upright var reverse = flatCoordinates[offset] > flatCoordinates[end - stride]; @@ -37,11 +33,15 @@ ol.geom.flat.textpath.lineString = function( var segmentM = 0; var segmentLength = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)); - var index, previousAngle; + var chunk = ''; + var chunkLength = 0; + var data, index, previousAngle; for (var i = 0; i < numChars; ++i) { index = reverse ? numChars - i - 1 : i; - var char = text[index]; - var charLength = measure(char); + var char = text.charAt(index); + chunk = reverse ? char + chunk : chunk + char; + var charLength = measure(chunk) - chunkLength; + chunkLength += charLength; var charM = startM + charLength / 2; while (offset < end - stride && segmentM + segmentLength < charM) { x1 = x2; @@ -64,11 +64,27 @@ ol.geom.flat.textpath.lineString = function( return null; } } - previousAngle = angle; var interpolate = segmentPos / segmentLength; var x = ol.math.lerp(x1, x2, interpolate); var y = ol.math.lerp(y1, y2, interpolate); - result[index] = [x, y, angle]; + if (previousAngle == angle) { + if (reverse) { + data[0] = x; + data[1] = y; + data[2] = charLength / 2; + } + data[4] = chunk; + } else { + chunk = char; + chunkLength = charLength; + data = [x, y, charLength / 2, angle, chunk]; + if (reverse) { + result.unshift(data); + } else { + result.push(data); + } + previousAngle = angle; + } startM += charLength; } return result; diff --git a/src/ol/render/canvas/replay.js b/src/ol/render/canvas/replay.js index 4550547397..6d214409b0 100644 --- a/src/ol/render/canvas/replay.js +++ b/src/ol/render/canvas/replay.js @@ -142,9 +142,9 @@ ol.render.canvas.Replay = function(tolerance, maxExtent, resolution, pixelRatio, /** * @private - * @type {Array.>} + * @type {!ol.Transform} */ - this.chars_ = []; + this.resetTransform_ = ol.transform.create(); }; ol.inherits(ol.render.canvas.Replay, ol.render.VectorContext); @@ -569,34 +569,52 @@ ol.render.canvas.Replay.prototype.replay_ = function( case ol.render.canvas.Instruction.DRAW_CHARS: var begin = /** @type {number} */ (instruction[1]); var end = /** @type {number} */ (instruction[2]); - var images = /** @type {Array.} */ (instruction[3]); - // Remaining arguments in DRAW_CHARS are in alphabetical order - var baseline = /** @type {number} */ (instruction[4]); - declutterGroup = /** @type {ol.DeclutterGroup} */ (instruction[5]); - var exceedLength = /** @type {number} */ (instruction[6]); + var baseline = /** @type {number} */ (instruction[3]); + declutterGroup = /** @type {ol.DeclutterGroup} */ (instruction[4]); + var exceedLength = /** @type {number} */ (instruction[5]); + var fill = /** @type {boolean} */ (instruction[6]); var maxAngle = /** @type {number} */ (instruction[7]); var measure = /** @type {function(string):number} */ (instruction[8]); var offsetY = /** @type {number} */ (instruction[9]); - var text = /** @type {string} */ (instruction[10]); - var align = /** @type {number} */ (instruction[11]); - var textScale = /** @type {number} */ (instruction[12]); + var stroke = /** @type {boolean} */ (instruction[10]); + var strokeWidth = /** @type {number} */ (instruction[11]); + var text = /** @type {string} */ (instruction[12]); + var textAlign = /** @type {number} */ (instruction[13]); + var textScale = /** @type {number} */ (instruction[14]); var pathLength = ol.geom.flat.length.lineString(pixelCoordinates, begin, end, 2); var textLength = measure(text); if (exceedLength || textLength <= pathLength) { - var startM = (pathLength - textLength) * align; - var chars = ol.geom.flat.textpath.lineString( - pixelCoordinates, begin, end, 2, text, measure, startM, maxAngle, this.chars_); - var numChars = text.length; - if (chars) { - var fillHeight = images[images.length - 1].height; - for (var c = 0, cc = images.length; c < cc; ++c) { - var char = chars[c % numChars]; // x, y, rotation - var label = images[c]; - anchorX = label.width / 2; - anchorY = baseline * label.height + (0.5 - baseline) * (label.height - fillHeight) - offsetY; - this.replayImage_(context, char[0], char[1], label, - anchorX, anchorY, declutterGroup, label.height, 1, 0, 0, char[2], textScale, false, label.width); + var startM = (pathLength - textLength) * textAlign; + var parts = ol.geom.flat.textpath.lineString( + pixelCoordinates, begin, end, 2, text, measure, startM, maxAngle); + if (parts) { + var c, cc, chars, label, part; + if (stroke) { + for (c = 0, cc = parts.length; c < cc; ++c) { + part = parts[c]; // x, y, anchorX, rotation, chunk + chars = /** @type {string} */ (part[4]); + label = /** @type {ol.render.canvas.TextReplay} */ (this).getImage(chars, false, true); + anchorX = /** @type {number} */ (part[2]) + strokeWidth; + anchorY = baseline * label.height + (0.5 - baseline) * strokeWidth - offsetY; + this.replayImage_(context, + /** @type {number} */ (part[0]), /** @type {number} */ (part[1]), label, + anchorX, anchorY, declutterGroup, label.height, 1, 0, 0, + /** @type {number} */ (part[3]), textScale, false, label.width); + } + } + if (fill) { + for (c = 0, cc = parts.length; c < cc; ++c) { + part = parts[c]; // x, y, anchorX, rotation, chunk + chars = /** @type {string} */ (part[4]); + label = /** @type {ol.render.canvas.TextReplay} */ (this).getImage(chars, true, false); + anchorX = /** @type {number} */ (part[2]); + anchorY = baseline * label.height - offsetY; + this.replayImage_(context, + /** @type {number} */ (part[0]), /** @type {number} */ (part[1]), label, + anchorX, anchorY, declutterGroup, label.height, 1, 0, 0, + /** @type {number} */ (part[3]), textScale, false, label.width); + } } } } diff --git a/src/ol/render/canvas/textreplay.js b/src/ol/render/canvas/textreplay.js index 5220b4a3d5..349e01152c 100644 --- a/src/ol/render/canvas/textreplay.js +++ b/src/ol/render/canvas/textreplay.js @@ -115,6 +115,12 @@ ol.render.canvas.TextReplay = function( */ this.strokeKey_ = ''; + /** + * @private + * @type {Object.} + */ + this.widths_ = {}; + while (ol.render.canvas.TextReplay.labelCache_.canExpireCache()) { ol.render.canvas.TextReplay.labelCache_.pop(); } @@ -158,19 +164,23 @@ ol.render.canvas.TextReplay.measureTextHeight = (function() { /** - * @this {Object} - * @param {CanvasRenderingContext2D} context Context. - * @param {number} pixelRatio Pixel ratio. + * @param {string} font Font. * @param {string} text Text. * @return {number} Width. */ -ol.render.canvas.TextReplay.getTextWidth = function(context, pixelRatio, text) { - var width = this[text]; - if (!width) { - this[text] = width = context.measureText(text).width; - } - return width * pixelRatio; -}; +ol.render.canvas.TextReplay.measureTextWidth = (function() { + var measureContext; + var currentFont; + return function(font, text) { + if (!measureContext) { + measureContext = ol.dom.createCanvasContext2D(1, 1); + } + if (font != currentFont) { + currentFont = measureContext.font = font; + } + return measureContext.measureText(text).width; + }; +})(); /** @@ -180,24 +190,17 @@ ol.render.canvas.TextReplay.getTextWidth = function(context, pixelRatio, text) { * each line. * @return {number} Width of the whole text. */ -ol.render.canvas.TextReplay.measureTextWidths = (function() { - var context; - return function(font, lines, widths) { - if (!context) { - context = ol.dom.createCanvasContext2D(1, 1); - } - context.font = font; - var numLines = lines.length; - var width = 0; - var currentWidth, i; - for (i = 0; i < numLines; ++i) { - currentWidth = context.measureText(lines[i]).width; - width = Math.max(width, currentWidth); - widths.push(currentWidth); - } - return width; - }; -})(); +ol.render.canvas.TextReplay.measureTextWidths = function(font, lines, widths) { + var numLines = lines.length; + var width = 0; + var currentWidth, i; + for (i = 0; i < numLines; ++i) { + currentWidth = ol.render.canvas.TextReplay.measureTextWidth(font, lines[i]); + width = Math.max(width, currentWidth); + widths.push(currentWidth); + } + return width; +}; /** @@ -263,7 +266,7 @@ ol.render.canvas.TextReplay.prototype.drawText = function(geometry, feature) { this.endGeometry(geometry, feature); } else { - var label = this.getImage_(this.text_, !!this.textFillState_, !!this.textStrokeState_); + var label = this.getImage(this.text_, !!this.textFillState_, !!this.textStrokeState_); var width = label.width / this.pixelRatio; switch (geometryType) { case ol.geom.GeometryType.POINT: @@ -312,13 +315,12 @@ ol.render.canvas.TextReplay.prototype.drawText = function(geometry, feature) { /** - * @private * @param {string} text Text. * @param {boolean} fill Fill. * @param {boolean} stroke Stroke. * @return {HTMLCanvasElement} Image. */ -ol.render.canvas.TextReplay.prototype.getImage_ = function(text, fill, stroke) { +ol.render.canvas.TextReplay.prototype.getImage = function(text, fill, stroke) { var label; var key = (stroke ? this.strokeKey_ : '') + this.textKey_ + text + (fill ? this.fillKey_ : ''); @@ -343,7 +345,9 @@ ol.render.canvas.TextReplay.prototype.getImage_ = function(text, fill, stroke) { Math.ceil((height + strokeWidth) * scale)); label = context.canvas; ol.render.canvas.TextReplay.labelCache_.set(key, label); - context.scale(scale, scale); + if (scale != 1) { + context.scale(scale, scale); + } context.font = textState.font; if (stroke) { context.strokeStyle = strokeState.strokeStyle; @@ -422,37 +426,36 @@ ol.render.canvas.TextReplay.prototype.drawChars_ = function(begin, end, declutte var textState = this.textState_; var baseline = ol.render.replay.TEXT_ALIGN[textState.textBaseline]; - var labels = []; - var text = this.text_; - var numChars = this.text_.length; - var i; - - if (stroke) { - for (i = 0; i < numChars; ++i) { - labels.push(this.getImage_(text.charAt(i), false, stroke)); - } - } - if (fill) { - for (i = 0; i < numChars; ++i) { - labels.push(this.getImage_(text.charAt(i), fill, false)); - } - } - - var context = labels[0].getContext('2d'); var offsetY = this.textOffsetY_ * pixelRatio; - var align = ol.render.replay.TEXT_ALIGN[textState.textAlign || ol.render.canvas.defaultTextAlign]; - var widths = {}; + var textAlign = ol.render.replay.TEXT_ALIGN[textState.textAlign || ol.render.canvas.defaultTextAlign]; + var text = this.text_; + var font = textState.font; + var textScale = this.textScale_; + var strokeWidth = strokeState ? strokeState.lineWidth * textScale / 2 : 0; + var widths = this.widths_; this.instructions.push([ol.render.canvas.Instruction.DRAW_CHARS, - begin, end, labels, baseline, declutterGroup, - textState.exceedLength, textState.maxAngle, - ol.render.canvas.TextReplay.getTextWidth.bind(widths, context, pixelRatio * this.textScale_), - offsetY, this.text_, align, 1 + begin, end, baseline, declutterGroup, + textState.exceedLength, fill, textState.maxAngle, + function(text) { + var width = widths[text]; + if (!width) { + width = widths[text] = ol.render.canvas.TextReplay.measureTextWidth(font, text); + } + return width * textScale * pixelRatio; + }, + offsetY, stroke, strokeWidth * pixelRatio, text, textAlign, 1 ]); this.hitDetectionInstructions.push([ol.render.canvas.Instruction.DRAW_CHARS, - begin, end, labels, baseline, declutterGroup, - textState.exceedLength, textState.maxAngle, - ol.render.canvas.TextReplay.getTextWidth.bind(widths, context, this.textScale_), - offsetY, this.text_, align, 1 / pixelRatio + begin, end, baseline, declutterGroup, + textState.exceedLength, fill, textState.maxAngle, + function(text) { + var width = widths[text]; + if (!width) { + width = widths[text] = ol.render.canvas.TextReplay.measureTextWidth(font, text); + } + return width * textScale; + }, + offsetY, stroke, strokeWidth, text, textAlign, 1 / pixelRatio ]); }; diff --git a/test/rendering/ol/style/expected/text-multilinestring.png b/test/rendering/ol/style/expected/text-multilinestring.png index 7d4a567ca992af6183da4c7590567bd0c6057f9b..117aec74f85c102cf49474dd27288343fdf25b67 100644 GIT binary patch literal 19575 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 V1K*s&s|A5#Qf?@$Qw{Po^&cAH6e|D# literal 17543 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

QKLdk*K-0jsqtd z%-G77j(54bTH3XIi3rD=R86Svnu%RSS#KmSdOt*?{abxn1n@2N=e6J3M_wQA0$901)sD)p*ugv0a`%| zh(1jqR*1cT6pP?s*z%dIj7(L<_JKYLW^6jO8rHk0GVBIPo6`%)Bc{$mh2-TJ#-%ibrcFa`PT1yNKB@)bx5CCdfH#!n0D% z6sDj=ieVoqlW%LUHtAy)pWK$3mL_EE;zC9g>ZjuDeC6dUj#4zmY;5@rZ-5HsGy>cW zA3S(!eY`%2MlauQ{R?^o9dRg?1dH?|wz7yd*)=_g3{MR~J8Hty9l^cXpGIc9H#Eog zEVA7cjGQn#5B`Qxq(C?R=g$vKI*7QO9xN&zQHV?j7y)+Mw->#ZzX8jn;D5tAd0c_# zoBTnkXg5zYdbqt{)?}vSY?QcE=vJy%d)CwaO`|+=-%3GY=s%t1=BvOLPakB89K)eU z?fL zpavoR*%y$Wh)|LqHeujsoDTIIT8am@Pu&5dHOnbumJejd-c(&=i?n8(3CIMyR$$iS zh!x<2;d-<9?g;@C8``6da=43%AG#7xqFkb&=F%P*<_~iY;Z{AB*>x(uU z=7~%H3l8l~&!@|S#oioxEp`j)yjcsJ0CnZEjMBG<^3x~pbe@Ej8 zM^Y7o0+;|Qu3d5afd@w2Cx}h(T8No2j&Vg5{8hbK#(!U>qc1#lI_9@Yfxl5%OTW%fsKDFOu&U_3=Ru&-Z;5#)V3<(aia41JAQ_q zAalNleqlEk?XJ=1Tmx+Do=Q^~H5g^h5`q1Ilt0q&ce$d)Zy@V1n!9h@eLvSmL8|jj zc*7#X)^CyAxPSfA3@#FHyaEq;tFP9>A^2P;bndFzs5a3gL;Oj++zRSP?QKYFKe0bec)+<4pg#EXgAM)avG=YM<0IhABj! zHiV+^66Y!nxUnHxb1aO3@ZaDyhmiVXez{T+(-hG@UeJY&eV8Nc$cj_%)} zt7ku-PViH5s@LlMV5!iFx)syUeGE(vA3&aMSFh@I4jS=qzszQeA3RDP%q^BP_bDk+ zCAX8z;av3p{tq~S+0Zf4O}9)hQSu{*G3HpV08V%#xo%zwC>lq!GÐFHx^0WM%t( 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