/// <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; } }
/// <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); } }