internal virtual float addStyleRun(android.text.TextPaint paint, int len, android.graphics.Paint .FontMetricsInt fm) { if (fm != null) { paint.getFontMetricsInt(fm); } int p = mPos; mPos = p + len; if (mEasy) { int flags = mDir == android.text.Layout.DIR_LEFT_TO_RIGHT ? android.graphics.Canvas .DIRECTION_LTR : android.graphics.Canvas.DIRECTION_RTL; return paint.getTextRunAdvances(mChars, p, len, p, len, flags, mWidths, p); } float totalAdvance = 0; int level = mLevels[p]; { int q = p; int i = p + 1; int e = p + len; for (; ; ++i) { if (i == e || mLevels[i] != level) { int flags = (level & unchecked((int)(0x1))) == 0 ? android.graphics.Canvas.DIRECTION_LTR : android.graphics.Canvas.DIRECTION_RTL; totalAdvance += paint.getTextRunAdvances(mChars, q, i - q, q, i - q, flags, mWidths , q); if (i == e) { break; } q = i; level = mLevels[i]; } } } return totalAdvance; }
public virtual float getTextRunAdvances(int start, int end, int contextStart, int contextEnd, int flags, float[] advances, int advancesPos, android.graphics.Paint p, int reserved) { float ret; int contextLen = contextEnd - contextStart; int len = end - start; if (end <= mGapStart) { ret = p.getTextRunAdvances(mText, start, len, contextStart, contextLen, flags, advances , advancesPos, reserved); } else { if (start >= mGapStart) { ret = p.getTextRunAdvances(mText, start + mGapLength, len, contextStart + mGapLength , contextLen, flags, advances, advancesPos, reserved); } else { char[] buf = android.text.TextUtils.obtain(contextLen); getChars(contextStart, contextEnd, buf, 0); ret = p.getTextRunAdvances(buf, start - contextStart, len, 0, contextLen, flags, advances, advancesPos, reserved); android.text.TextUtils.recycle(buf); } } return ret; }