示例#1
0
		/// <summary>Analyzes text for bidirectional runs.</summary>
		/// <remarks>Analyzes text for bidirectional runs.  Allocates working buffers.</remarks>
		internal virtual void setPara(java.lang.CharSequence text, int start, int end, android.text.TextDirectionHeuristic
			 textDir)
		{
			mText = text;
			mTextStart = start;
			int len = end - start;
			mLen = len;
			mPos = 0;
			if (mWidths == null || mWidths.Length < len)
			{
				mWidths = new float[[email protected](len)];
			}
			if (mChars == null || mChars.Length < len)
			{
				mChars = new char[[email protected](len)];
			}
			android.text.TextUtils.getChars(text, start, end, mChars, 0);
			if (text is android.text.Spanned)
			{
				android.text.Spanned spanned = (android.text.Spanned)text;
				android.text.style.ReplacementSpan[] spans = spanned.getSpans<android.text.style.ReplacementSpan
					>(start, end);
				{
					for (int i = 0; i < spans.Length; i++)
					{
						int startInPara = spanned.getSpanStart(spans[i]) - start;
						int endInPara = spanned.getSpanEnd(spans[i]) - start;
						{
							for (int j = startInPara; j < endInPara; j++)
							{
								mChars[j] = '\uFFFC';
							}
						}
					}
				}
			}
			if ((textDir == android.text.TextDirectionHeuristics.LTR || textDir == android.text.TextDirectionHeuristics
				.FIRSTSTRONG_LTR || textDir == android.text.TextDirectionHeuristics.ANYRTL_LTR) 
				&& android.text.TextUtils.doesNotNeedBidi(mChars, 0, len))
			{
				mDir = android.text.Layout.DIR_LEFT_TO_RIGHT;
				mEasy = true;
			}
			else
			{
				if (mLevels == null || mLevels.Length < len)
				{
					mLevels = new byte[[email protected](len)];
				}
				int bidiRequest;
				if (textDir == android.text.TextDirectionHeuristics.LTR)
				{
					bidiRequest = android.text.Layout.DIR_REQUEST_LTR;
				}
				else
				{
					if (textDir == android.text.TextDirectionHeuristics.RTL)
					{
						bidiRequest = android.text.Layout.DIR_REQUEST_RTL;
					}
					else
					{
						if (textDir == android.text.TextDirectionHeuristics.FIRSTSTRONG_LTR)
						{
							bidiRequest = android.text.Layout.DIR_REQUEST_DEFAULT_LTR;
						}
						else
						{
							if (textDir == android.text.TextDirectionHeuristics.FIRSTSTRONG_RTL)
							{
								bidiRequest = android.text.Layout.DIR_REQUEST_DEFAULT_RTL;
							}
							else
							{
								bool isRtl = textDir.isRtl(mChars, 0, len);
								bidiRequest = isRtl ? android.text.Layout.DIR_REQUEST_RTL : android.text.Layout.DIR_REQUEST_LTR;
							}
						}
					}
				}
				mDir = android.text.AndroidBidi.bidi(bidiRequest, mChars, mLevels, len, false);
				mEasy = false;
			}
		}
示例#2
0
		/// <summary>
		/// Returns null if not boring; the width, ascent, and descent in the
		/// provided Metrics object (or a new one if the provided one was null)
		/// if boring.
		/// </summary>
		/// <remarks>
		/// Returns null if not boring; the width, ascent, and descent in the
		/// provided Metrics object (or a new one if the provided one was null)
		/// if boring.
		/// </remarks>
		/// <hide></hide>
		public static android.text.BoringLayout.Metrics isBoring(java.lang.CharSequence text
			, android.text.TextPaint paint, android.text.TextDirectionHeuristic textDir, android.text.BoringLayout
			.Metrics metrics)
		{
			char[] temp = android.text.TextUtils.obtain(500);
			int length = text.Length;
			bool boring = true;
			{
				for (int i = 0; i < length; i += 500)
				{
					int j = i + 500;
					if (j > length)
					{
						j = length;
					}
					android.text.TextUtils.getChars(text, i, j, temp, 0);
					int n = j - i;
					{
						for (int a = 0; a < n; a++)
						{
							char c = temp[a];
							if (c == '\n' || c == '\t' || c >= FIRST_RIGHT_TO_LEFT)
							{
								boring = false;
								goto outer_break;
							}
						}
					}
					if (textDir != null && textDir.isRtl(temp, 0, n))
					{
						boring = false;
						goto outer_break;
					}
				}
outer_continue: ;
			}
outer_break: ;
			android.text.TextUtils.recycle(temp);
			if (boring && text is android.text.Spanned)
			{
				android.text.Spanned sp = (android.text.Spanned)text;
				object[] styles = sp.getSpans<android.text.style.ParagraphStyle>(0, length);
				if (styles.Length > 0)
				{
					boring = false;
				}
			}
			if (boring)
			{
				android.text.BoringLayout.Metrics fm = metrics;
				if (fm == null)
				{
					fm = new android.text.BoringLayout.Metrics();
				}
				android.text.TextLine line = android.text.TextLine.obtain();
				line.set(paint, text, 0, length, android.text.Layout.DIR_LEFT_TO_RIGHT, android.text.Layout
					.DIRS_ALL_LEFT_TO_RIGHT, false, null);
				fm.width = (int)android.util.FloatMath.ceil(line.metrics(fm));
				android.text.TextLine.recycle(line);
				return fm;
			}
			else
			{
				return null;
			}
		}