diff options
Diffstat (limited to 'core/java/android/text/StaticLayout.java')
| -rwxr-xr-x[-rw-r--r--] | core/java/android/text/StaticLayout.java | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index f02ad2a401ff..d0d2482ae753 100644..100755 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -313,7 +313,9 @@ extends Layout class); if (spanned == null) { - paint.getTextWidths(sub, i, next, widths); + final int actualNum = paint.getTextWidths(sub, i, next, widths); + if (next - i > actualNum) + adjustTextWidths(widths, sub, i, next, actualNum); System.arraycopy(widths, 0, widths, end - start + (i - start), next - i); @@ -321,9 +323,11 @@ extends Layout } else { mWorkPaint.baselineShift = 0; - Styled.getTextWidths(paint, mWorkPaint, - spanned, i, next, - widths, fm); + final int actualNum = Styled.getTextWidths(paint, mWorkPaint, + spanned, i, next, + widths, fm); + if (next - i > actualNum) + adjustTextWidths(widths, spanned, i, next, actualNum); System.arraycopy(widths, 0, widths, end - start + (i - start), next - i); @@ -966,6 +970,22 @@ extends Layout return low; } + private static void adjustTextWidths(float[] widths, CharSequence text, + int curPos, int nextPos, int actualNum) { + try { + int dstIndex = nextPos - curPos - 1; + for (int srcIndex = actualNum - 1; srcIndex >= 0; srcIndex--) { + final char c = text.charAt(dstIndex + curPos); + if (c >= 0xD800 && c <= 0xDFFF) { + widths[dstIndex--] = 0.0f; + } + widths[dstIndex--] = widths[srcIndex]; + } + } catch (IndexOutOfBoundsException e) { + Log.e("text", "adjust text widths failed"); + } + } + private int out(CharSequence text, int start, int end, int above, int below, int top, int bottom, int v, float spacingmult, float spacingadd, |
