Merge "Fixed text rendering issue with spans." into jb-dev

This commit is contained in:
Gilles Debunne
2012-06-18 18:53:30 -07:00
committed by Android (Google) Code Review
2 changed files with 32 additions and 33 deletions

View File

@@ -82,6 +82,10 @@ class MeasuredText {
return null;
}
void setPos(int pos) {
mPos = pos;
}
/**
* Analyzes text for bidirectional runs. Allocates working buffers.
*/
@@ -113,7 +117,7 @@ class MeasuredText {
if (startInPara < 0) startInPara = 0;
if (endInPara > len) endInPara = len;
for (int j = startInPara; j < endInPara; j++) {
mChars[j] = '\uFFFC';
mChars[j] = '\uFFFC'; // object replacement character
}
}
}

View File

@@ -246,12 +246,17 @@ public class StaticLayout extends Layout {
int width = firstWidth;
float w = 0;
// here is the offset of the starting character of the line we are currently measuring
int here = paraStart;
// ok is a character offset located after a word separator (space, tab, number...) where
// we would prefer to cut the current line. Equals to here when no such break was found.
int ok = paraStart;
float okWidth = w;
int okAscent = 0, okDescent = 0, okTop = 0, okBottom = 0;
// fit is a character offset such that the [here, fit[ range fits in the allowed width.
// We will cut the line there if no ok position is found.
int fit = paraStart;
float fitWidth = w;
int fitAscent = 0, fitDescent = 0, fitTop = 0, fitBottom = 0;
@@ -260,30 +265,22 @@ public class StaticLayout extends Layout {
boolean hasTab = false;
TabStops tabStops = null;
for (int spanStart = paraStart, spanEnd = spanStart, nextSpanStart;
spanStart < paraEnd; spanStart = nextSpanStart) {
if (spanStart == spanEnd) {
if (spanned == null)
spanEnd = paraEnd;
else
spanEnd = spanned.nextSpanTransition(spanStart, paraEnd,
MetricAffectingSpan.class);
for (int spanStart = paraStart, spanEnd; spanStart < paraEnd; spanStart = spanEnd) {
if (spanned == null) {
spanEnd = paraEnd;
int spanLen = spanEnd - spanStart;
if (spanned == null) {
measured.addStyleRun(paint, spanLen, fm);
} else {
MetricAffectingSpan[] spans =
measured.addStyleRun(paint, spanLen, fm);
} else {
spanEnd = spanned.nextSpanTransition(spanStart, paraEnd,
MetricAffectingSpan.class);
int spanLen = spanEnd - spanStart;
MetricAffectingSpan[] spans =
spanned.getSpans(spanStart, spanEnd, MetricAffectingSpan.class);
spans = TextUtils.removeEmptySpans(spans, spanned,
MetricAffectingSpan.class);
measured.addStyleRun(paint, spans, spanLen, fm);
}
spans = TextUtils.removeEmptySpans(spans, spanned, MetricAffectingSpan.class);
measured.addStyleRun(paint, spans, spanLen, fm);
}
nextSpanStart = spanEnd;
int fmTop = fm.top;
int fmBottom = fm.bottom;
int fmAscent = fm.ascent;
@@ -343,8 +340,6 @@ public class StaticLayout extends Layout {
w += widths[j - paraStart];
}
// Log.e("text", "was " + before + " now " + w + " after " + c + " within " + width);
if (w <= width) {
fitWidth = w;
fit = j + 1;
@@ -373,7 +368,6 @@ public class StaticLayout extends Layout {
* except for NS (non-starters), which can be broken
* after but not before.
*/
if (c == CHAR_SPACE || c == CHAR_TAB ||
((c == CHAR_DOT || c == CHAR_COMMA ||
c == CHAR_COLON || c == CHAR_SEMICOLON) &&
@@ -437,17 +431,9 @@ public class StaticLayout extends Layout {
needMultiply, chdirs, dir, easy, bufEnd, includepad, trackpad,
chs, widths, paraStart, ellipsize, ellipsizedWidth,
currentTextWidth, paint, moreChars);
here = endPos;
if (here < spanStart) {
// didn't output all the text for this span
// we've measured the raw widths, though, so
// just reset the start point
j = nextSpanStart = here;
} else {
j = here - 1; // continue looping
}
j = here - 1; // restart j-span loop from here, compensating for the j++
ok = fit = here;
w = 0;
fitAscent = fitDescent = fitTop = fitBottom = 0;
@@ -456,7 +442,16 @@ public class StaticLayout extends Layout {
if (--firstWidthLineLimit <= 0) {
width = restWidth;
}
if (here < spanStart) {
// The text was cut before the beginning of the current span range.
// Exit the span loop, and get spanStart to start over from here.
measured.setPos(here);
spanEnd = here;
break;
}
}
// FIXME This should be moved in the above else block which changes mLineCount
if (mLineCount >= mMaximumVisibleLineCount) {
break;
}