From cb5499c85097450c48f66f6c08a35bab2ad5ab12 Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Thu, 28 May 2015 16:16:24 -0700 Subject: [PATCH] Use getRunAdvance to position cursor TextLine used to use getTextRunAdvances on a substring to compute a cursor position, but this had a number of problems, especially when the substring is a wider than the full string (as can happen in certain Tamil ligatures). This patch changes the implementation to use getRunAdvance, which was explicitly designed for this use case. We should also change Layout.getHorizontal to use the dual getOffsetForAdvance, but that's basically a performance optimization, the functionality should be basically equivalent. Bug: 21125816 Change-Id: I669b85eaecfbf6f7aa6c6a9dddbf1a210eb94571 --- core/java/android/text/Layout.java | 1 + core/java/android/text/TextLine.java | 10 ++++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index f176240dbb73..f7027f9e20b8 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -1121,6 +1121,7 @@ public abstract class Layout { * closest to the specified horizontal position. */ public int getOffsetForHorizontal(int line, float horiz) { + // TODO: use Paint.getOffsetForAdvance to avoid binary search int max = getLineEnd(line) - 1; int min = getLineStart(line); Directions dirs = getLineDirections(line); diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index 479242c85695..605b91dee9c0 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -739,16 +739,14 @@ class TextLine { float ret = 0; - int contextLen = contextEnd - contextStart; if (needWidth || (c != null && (wp.bgColor != 0 || wp.underlineColor != 0 || runIsRtl))) { if (mCharsValid) { - ret = wp.getTextRunAdvances(mChars, start, runLen, - contextStart, contextLen, runIsRtl, null, 0); + ret = wp.getRunAdvance(mChars, start, contextEnd, contextStart, contextEnd, + runIsRtl, end); } else { int delta = mStart; - ret = wp.getTextRunAdvances(mText, delta + start, - delta + end, delta + contextStart, delta + contextEnd, - runIsRtl, null, 0); + ret = wp.getRunAdvance(mText, delta + start, delta + contextEnd, + delta + contextStart, delta + contextEnd, runIsRtl, delta + end); } } -- 2.11.0