From cfc17398a7e6ada1efdb4429227f75577d2c112c Mon Sep 17 00:00:00 2001 From: Adrian Heine <mail@adrianheine.de> Date: Tue, 31 Jan 2017 13:24:21 +0100 Subject: [PATCH] Greatly improve base-case performance in coordsChar --- src/measurement/position_measurement.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/measurement/position_measurement.js b/src/measurement/position_measurement.js index 531ab1d73..aa5633636 100644 --- a/src/measurement/position_measurement.js +++ b/src/measurement/position_measurement.js @@ -433,14 +433,14 @@ function coordsCharInner(cm, lineObj, lineNo, x, y) { y -= heightAtLine(lineObj) let begin = 0, end = lineObj.text.length - 1 let preparedMeasure = prepareMeasureForLine(cm, lineObj) - if (cm.options.lineWrapping) { - let measure = ch => intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line") - begin = findFirst(ch => measure(ch).bottom < y, end, begin - 1) + 1 - end = findFirst(ch => measure(ch).top > y, begin, end + 1) - 1 - } let pos let order = getOrder(lineObj) if (order) { + if (cm.options.lineWrapping) { + let measure = ch => intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, ch), "line") + begin = findFirst(ch => measure(ch).bottom < y, end, begin - 1) + 1 + end = findFirst(ch => measure(ch).top > y, begin, end + 1) - 1 + } if (end == lineObj.text.length - 1) ++end pos = new Pos(lineNo, begin) let beginLeft = cursorCoords(cm, pos, "line", lineObj, preparedMeasure).left @@ -461,7 +461,15 @@ function coordsCharInner(cm, lineObj, lineNo, x, y) { } else { let ch = findFirst(ch => { let box = measureCharPrepared(cm, preparedMeasure, ch) - return x - box.right < box.left - x + if (box.top > y) { + // For the cursor stickiness + end = Math.min(ch - 1, end) + return true + } + else if (box.bottom < y) return false + else if (box.left > x) return true + else if (box.right < x) return false + else return (x - box.left < box.right - x) }, begin, end + 1) while (isExtendingChar(lineObj.text.charAt(ch))) ++ch pos = new Pos(lineNo, ch, (ch == end + 1) ? "before" : "after") -- GitLab