Beispiel #1
0
		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;
		}