Merge "Fix measurement to respect grapheme and span boundaries" into mnc-dr1.5-dev am: 36c5ab3542
am: 50c22adc25
* commit '50c22adc2564fa1c31b9d0aea88707da4299d6ed':
Fix measurement to respect grapheme and span boundaries
This commit is contained in:
@@ -718,13 +718,14 @@ class TextLine {
|
||||
* @param bottom the bottom of the line
|
||||
* @param fmi receives metrics information, can be null
|
||||
* @param needWidth true if the width of the run is needed
|
||||
* @param offset the offset for the purpose of measuring
|
||||
* @return the signed width of the run based on the run direction; only
|
||||
* valid if needWidth is true
|
||||
*/
|
||||
private float handleText(TextPaint wp, int start, int end,
|
||||
int contextStart, int contextEnd, boolean runIsRtl,
|
||||
Canvas c, float x, int top, int y, int bottom,
|
||||
FontMetricsInt fmi, boolean needWidth) {
|
||||
FontMetricsInt fmi, boolean needWidth, int offset) {
|
||||
|
||||
// Get metrics first (even for empty strings or "0" width runs)
|
||||
if (fmi != null) {
|
||||
@@ -742,11 +743,11 @@ class TextLine {
|
||||
if (needWidth || (c != null && (wp.bgColor != 0 || wp.underlineColor != 0 || runIsRtl))) {
|
||||
if (mCharsValid) {
|
||||
ret = wp.getRunAdvance(mChars, start, end, contextStart, contextEnd,
|
||||
runIsRtl, end);
|
||||
runIsRtl, offset);
|
||||
} else {
|
||||
int delta = mStart;
|
||||
ret = wp.getRunAdvance(mText, delta + start, delta + end,
|
||||
delta + contextStart, delta + contextEnd, runIsRtl, delta + end);
|
||||
delta + contextStart, delta + contextEnd, runIsRtl, delta + offset);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -895,8 +896,8 @@ class TextLine {
|
||||
TextPaint wp = mWorkPaint;
|
||||
wp.set(mPaint);
|
||||
final int mlimit = measureLimit;
|
||||
return handleText(wp, start, mlimit, start, limit, runIsRtl, c, x, top,
|
||||
y, bottom, fmi, needWidth || mlimit < measureLimit);
|
||||
return handleText(wp, start, limit, start, limit, runIsRtl, c, x, top,
|
||||
y, bottom, fmi, needWidth || mlimit < measureLimit, mlimit);
|
||||
}
|
||||
|
||||
mMetricAffectingSpanSpanSet.init(mSpanned, mStart + start, mStart + limit);
|
||||
@@ -940,13 +941,14 @@ class TextLine {
|
||||
}
|
||||
|
||||
for (int j = i, jnext; j < mlimit; j = jnext) {
|
||||
jnext = mCharacterStyleSpanSet.getNextTransition(mStart + j, mStart + mlimit) -
|
||||
jnext = mCharacterStyleSpanSet.getNextTransition(mStart + j, mStart + inext) -
|
||||
mStart;
|
||||
int offset = Math.min(jnext, mlimit);
|
||||
|
||||
wp.set(mPaint);
|
||||
for (int k = 0; k < mCharacterStyleSpanSet.numberOfSpans; k++) {
|
||||
// Intentionally using >= and <= as explained above
|
||||
if ((mCharacterStyleSpanSet.spanStarts[k] >= mStart + jnext) ||
|
||||
if ((mCharacterStyleSpanSet.spanStarts[k] >= mStart + offset) ||
|
||||
(mCharacterStyleSpanSet.spanEnds[k] <= mStart + j)) continue;
|
||||
|
||||
CharacterStyle span = mCharacterStyleSpanSet.spans[k];
|
||||
@@ -958,7 +960,7 @@ class TextLine {
|
||||
wp.setHyphenEdit(0);
|
||||
}
|
||||
x += handleText(wp, j, jnext, i, inext, runIsRtl, c, x,
|
||||
top, y, bottom, fmi, needWidth || jnext < measureLimit);
|
||||
top, y, bottom, fmi, needWidth || jnext < measureLimit, offset);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user