Loading core/java/android/text/BoringLayout.java +27 −1 Original line number Diff line number Diff line Loading @@ -226,7 +226,17 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback */ public static Metrics isBoring(CharSequence text, TextPaint paint) { return isBoring(text, paint, null); return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, null); } /** * Returns null if not boring; the width, ascent, and descent if boring. * @hide */ public static Metrics isBoring(CharSequence text, TextPaint paint, TextDirectionHeuristic textDir) { return isBoring(text, paint, textDir, null); } /** Loading @@ -235,6 +245,17 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback * if boring. */ public static Metrics isBoring(CharSequence text, TextPaint paint, Metrics metrics) { return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, metrics); } /** * 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. * @hide */ public static Metrics isBoring(CharSequence text, TextPaint paint, TextDirectionHeuristic textDir, Metrics metrics) { char[] temp = TextUtils.obtain(500); int length = text.length(); boolean boring = true; Loading @@ -258,6 +279,11 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback break outer; } } if (textDir.isRtl(temp, 0, n)) { boring = false; break outer; } } TextUtils.recycle(temp); Loading core/java/android/text/DynamicLayout.java +25 −6 Original line number Diff line number Diff line Loading @@ -75,12 +75,31 @@ extends Layout float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { this(base, display, paint, width, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth); } /** * Make a layout for the transformed text (password transformation * being the primary example of a transformation) * that will be updated as the base text is changed. * If ellipsize is non-null, the Layout will ellipsize the text * down to ellipsizedWidth. * * * *@hide */ public DynamicLayout(CharSequence base, CharSequence display, TextPaint paint, int width, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { super((ellipsize == null) ? display : (display instanceof Spanned) ? new SpannedEllipsizer(display) : new Ellipsizer(display), paint, width, align, spacingmult, spacingadd); paint, width, align, textDir, spacingmult, spacingadd); mBase = base; mDisplay = display; Loading Loading @@ -259,7 +278,7 @@ extends Layout reflowed = new StaticLayout(true); reflowed.generate(text, where, where + after, getPaint(), getWidth(), getAlignment(), getPaint(), getWidth(), getAlignment(), getTextDirectionHeuristic(), getSpacingMultiplier(), getSpacingAdd(), false, true, mEllipsizedWidth, mEllipsizeAt); int n = reflowed.getLineCount(); Loading core/java/android/text/Layout.java +36 −3 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package android.text; import com.android.internal.util.ArrayUtils; import android.emoji.EmojiFactory; import android.graphics.Canvas; import android.graphics.Paint; Loading @@ -32,6 +30,8 @@ import android.text.style.ParagraphStyle; import android.text.style.ReplacementSpan; import android.text.style.TabStopSpan; import com.android.internal.util.ArrayUtils; import java.util.Arrays; /** Loading Loading @@ -113,6 +113,29 @@ public abstract class Layout { protected Layout(CharSequence text, TextPaint paint, int width, Alignment align, float spacingMult, float spacingAdd) { this(text, paint, width, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingMult, spacingAdd); } /** * Subclasses of Layout use this constructor to set the display text, * width, and other standard properties. * @param text the text to render * @param paint the default paint for the layout. Styles can override * various attributes of the paint. * @param width the wrapping width for the text. * @param align whether to left, right, or center the text. Styles can * override the alignment. * @param spacingMult factor by which to scale the font size to get the * default line spacing * @param spacingAdd amount to add to the default line spacing * * @hide */ protected Layout(CharSequence text, TextPaint paint, int width, Alignment align, TextDirectionHeuristic textDir, float spacingMult, float spacingAdd) { if (width < 0) throw new IllegalArgumentException("Layout: " + width + " < 0"); Loading @@ -133,6 +156,7 @@ public abstract class Layout { mSpacingMult = spacingMult; mSpacingAdd = spacingAdd; mSpannedText = text instanceof Spanned; mTextDir = textDir; } /** Loading Loading @@ -530,6 +554,14 @@ public abstract class Layout { return mSpacingAdd; } /** * Return the heuristic used to determine paragraph text direction. * @hide */ public final TextDirectionHeuristic getTextDirectionHeuristic() { return mTextDir; } /** * Return the number of lines of text in this layout. */ Loading Loading @@ -1419,7 +1451,7 @@ public abstract class Layout { MeasuredText mt = MeasuredText.obtain(); TextLine tl = TextLine.obtain(); try { mt.setPara(text, start, end, DIR_REQUEST_LTR); mt.setPara(text, start, end, TextDirectionHeuristics.LTR); Directions directions; int dir; if (mt.mEasy) { Loading Loading @@ -1769,6 +1801,7 @@ public abstract class Layout { private float mSpacingAdd; private static final Rect sTempRect = new Rect(); private boolean mSpannedText; private TextDirectionHeuristic mTextDir; public static final int DIR_LEFT_TO_RIGHT = 1; public static final int DIR_RIGHT_TO_LEFT = -1; Loading core/java/android/text/MeasuredText.java +18 −2 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ class MeasuredText { * Analyzes text for bidirectional runs. Allocates working buffers. */ /* package */ void setPara(CharSequence text, int start, int end, int bidiRequest) { void setPara(CharSequence text, int start, int end, TextDirectionHeuristic textDir) { mText = text; mTextStart = start; Loading Loading @@ -115,13 +115,29 @@ class MeasuredText { } } if (TextUtils.doesNotNeedBidi(mChars, 0, len)) { if ((textDir == TextDirectionHeuristics.LTR || textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR || textDir == TextDirectionHeuristics.ANYRTL_LTR) && TextUtils.doesNotNeedBidi(mChars, 0, len)) { mDir = Layout.DIR_LEFT_TO_RIGHT; mEasy = true; } else { if (mLevels == null || mLevels.length < len) { mLevels = new byte[ArrayUtils.idealByteArraySize(len)]; } int bidiRequest; if (textDir == TextDirectionHeuristics.LTR) { bidiRequest = Layout.DIR_REQUEST_LTR; } else if (textDir == TextDirectionHeuristics.RTL) { bidiRequest = Layout.DIR_REQUEST_RTL; } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR) { bidiRequest = Layout.DIR_REQUEST_DEFAULT_LTR; } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_RTL) { bidiRequest = Layout.DIR_REQUEST_DEFAULT_RTL; } else { boolean isRtl = textDir.isRtl(mChars, 0, len); bidiRequest = isRtl ? Layout.DIR_REQUEST_RTL : Layout.DIR_REQUEST_LTR; } mDir = AndroidBidi.bidi(bidiRequest, mChars, mLevels, len, false); mEasy = false; } Loading core/java/android/text/StaticLayout.java +45 −8 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package android.text; import com.android.internal.util.ArrayUtils; import android.graphics.Bitmap; import android.graphics.Paint; import android.text.style.LeadingMarginSpan; Loading @@ -26,6 +24,8 @@ import android.text.style.LineHeightSpan; import android.text.style.MetricAffectingSpan; import android.text.style.TabStopSpan; import com.android.internal.util.ArrayUtils; /** * StaticLayout is a Layout for text that will not be edited after it * is laid out. Use {@link DynamicLayout} for text that may change. Loading @@ -46,6 +46,17 @@ public class StaticLayout extends Layout { spacingmult, spacingadd, includepad); } /** * @hide */ public StaticLayout(CharSequence source, TextPaint paint, int width, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad) { this(source, 0, source.length(), paint, width, align, textDir, spacingmult, spacingadd, includepad); } public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, Loading @@ -55,18 +66,44 @@ public class StaticLayout extends Layout { spacingmult, spacingadd, includepad, null, 0); } /** * @hide */ public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad) { this(source, bufstart, bufend, paint, outerwidth, align, textDir, spacingmult, spacingadd, includepad, null, 0); } public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { this(source, bufstart, bufend, paint, outerwidth, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth); } /** * @hide */ public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { super((ellipsize == null) ? source : (source instanceof Spanned) ? new SpannedEllipsizer(source) : new Ellipsizer(source), paint, outerwidth, align, spacingmult, spacingadd); paint, outerwidth, align, textDir, spacingmult, spacingadd); /* * This is annoying, but we can't refer to the layout until Loading Loading @@ -96,7 +133,7 @@ public class StaticLayout extends Layout { mMeasured = MeasuredText.obtain(); generate(source, bufstart, bufend, paint, outerwidth, align, generate(source, bufstart, bufend, paint, outerwidth, align, textDir, spacingmult, spacingadd, includepad, includepad, ellipsizedWidth, ellipsize); Loading @@ -116,7 +153,7 @@ public class StaticLayout extends Layout { /* package */ void generate(CharSequence source, int bufStart, int bufEnd, TextPaint paint, int outerWidth, Alignment align, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad, boolean trackpad, float ellipsizedWidth, TextUtils.TruncateAt ellipsize) { Loading Loading @@ -195,7 +232,7 @@ public class StaticLayout extends Layout { } } measured.setPara(source, paraStart, paraEnd, DIR_REQUEST_DEFAULT_LTR); measured.setPara(source, paraStart, paraEnd, textDir); char[] chs = measured.mChars; float[] widths = measured.mWidths; byte[] chdirs = measured.mLevels; Loading Loading
core/java/android/text/BoringLayout.java +27 −1 Original line number Diff line number Diff line Loading @@ -226,7 +226,17 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback */ public static Metrics isBoring(CharSequence text, TextPaint paint) { return isBoring(text, paint, null); return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, null); } /** * Returns null if not boring; the width, ascent, and descent if boring. * @hide */ public static Metrics isBoring(CharSequence text, TextPaint paint, TextDirectionHeuristic textDir) { return isBoring(text, paint, textDir, null); } /** Loading @@ -235,6 +245,17 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback * if boring. */ public static Metrics isBoring(CharSequence text, TextPaint paint, Metrics metrics) { return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, metrics); } /** * 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. * @hide */ public static Metrics isBoring(CharSequence text, TextPaint paint, TextDirectionHeuristic textDir, Metrics metrics) { char[] temp = TextUtils.obtain(500); int length = text.length(); boolean boring = true; Loading @@ -258,6 +279,11 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback break outer; } } if (textDir.isRtl(temp, 0, n)) { boring = false; break outer; } } TextUtils.recycle(temp); Loading
core/java/android/text/DynamicLayout.java +25 −6 Original line number Diff line number Diff line Loading @@ -75,12 +75,31 @@ extends Layout float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { this(base, display, paint, width, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth); } /** * Make a layout for the transformed text (password transformation * being the primary example of a transformation) * that will be updated as the base text is changed. * If ellipsize is non-null, the Layout will ellipsize the text * down to ellipsizedWidth. * * * *@hide */ public DynamicLayout(CharSequence base, CharSequence display, TextPaint paint, int width, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { super((ellipsize == null) ? display : (display instanceof Spanned) ? new SpannedEllipsizer(display) : new Ellipsizer(display), paint, width, align, spacingmult, spacingadd); paint, width, align, textDir, spacingmult, spacingadd); mBase = base; mDisplay = display; Loading Loading @@ -259,7 +278,7 @@ extends Layout reflowed = new StaticLayout(true); reflowed.generate(text, where, where + after, getPaint(), getWidth(), getAlignment(), getPaint(), getWidth(), getAlignment(), getTextDirectionHeuristic(), getSpacingMultiplier(), getSpacingAdd(), false, true, mEllipsizedWidth, mEllipsizeAt); int n = reflowed.getLineCount(); Loading
core/java/android/text/Layout.java +36 −3 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package android.text; import com.android.internal.util.ArrayUtils; import android.emoji.EmojiFactory; import android.graphics.Canvas; import android.graphics.Paint; Loading @@ -32,6 +30,8 @@ import android.text.style.ParagraphStyle; import android.text.style.ReplacementSpan; import android.text.style.TabStopSpan; import com.android.internal.util.ArrayUtils; import java.util.Arrays; /** Loading Loading @@ -113,6 +113,29 @@ public abstract class Layout { protected Layout(CharSequence text, TextPaint paint, int width, Alignment align, float spacingMult, float spacingAdd) { this(text, paint, width, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingMult, spacingAdd); } /** * Subclasses of Layout use this constructor to set the display text, * width, and other standard properties. * @param text the text to render * @param paint the default paint for the layout. Styles can override * various attributes of the paint. * @param width the wrapping width for the text. * @param align whether to left, right, or center the text. Styles can * override the alignment. * @param spacingMult factor by which to scale the font size to get the * default line spacing * @param spacingAdd amount to add to the default line spacing * * @hide */ protected Layout(CharSequence text, TextPaint paint, int width, Alignment align, TextDirectionHeuristic textDir, float spacingMult, float spacingAdd) { if (width < 0) throw new IllegalArgumentException("Layout: " + width + " < 0"); Loading @@ -133,6 +156,7 @@ public abstract class Layout { mSpacingMult = spacingMult; mSpacingAdd = spacingAdd; mSpannedText = text instanceof Spanned; mTextDir = textDir; } /** Loading Loading @@ -530,6 +554,14 @@ public abstract class Layout { return mSpacingAdd; } /** * Return the heuristic used to determine paragraph text direction. * @hide */ public final TextDirectionHeuristic getTextDirectionHeuristic() { return mTextDir; } /** * Return the number of lines of text in this layout. */ Loading Loading @@ -1419,7 +1451,7 @@ public abstract class Layout { MeasuredText mt = MeasuredText.obtain(); TextLine tl = TextLine.obtain(); try { mt.setPara(text, start, end, DIR_REQUEST_LTR); mt.setPara(text, start, end, TextDirectionHeuristics.LTR); Directions directions; int dir; if (mt.mEasy) { Loading Loading @@ -1769,6 +1801,7 @@ public abstract class Layout { private float mSpacingAdd; private static final Rect sTempRect = new Rect(); private boolean mSpannedText; private TextDirectionHeuristic mTextDir; public static final int DIR_LEFT_TO_RIGHT = 1; public static final int DIR_RIGHT_TO_LEFT = -1; Loading
core/java/android/text/MeasuredText.java +18 −2 Original line number Diff line number Diff line Loading @@ -85,7 +85,7 @@ class MeasuredText { * Analyzes text for bidirectional runs. Allocates working buffers. */ /* package */ void setPara(CharSequence text, int start, int end, int bidiRequest) { void setPara(CharSequence text, int start, int end, TextDirectionHeuristic textDir) { mText = text; mTextStart = start; Loading Loading @@ -115,13 +115,29 @@ class MeasuredText { } } if (TextUtils.doesNotNeedBidi(mChars, 0, len)) { if ((textDir == TextDirectionHeuristics.LTR || textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR || textDir == TextDirectionHeuristics.ANYRTL_LTR) && TextUtils.doesNotNeedBidi(mChars, 0, len)) { mDir = Layout.DIR_LEFT_TO_RIGHT; mEasy = true; } else { if (mLevels == null || mLevels.length < len) { mLevels = new byte[ArrayUtils.idealByteArraySize(len)]; } int bidiRequest; if (textDir == TextDirectionHeuristics.LTR) { bidiRequest = Layout.DIR_REQUEST_LTR; } else if (textDir == TextDirectionHeuristics.RTL) { bidiRequest = Layout.DIR_REQUEST_RTL; } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_LTR) { bidiRequest = Layout.DIR_REQUEST_DEFAULT_LTR; } else if (textDir == TextDirectionHeuristics.FIRSTSTRONG_RTL) { bidiRequest = Layout.DIR_REQUEST_DEFAULT_RTL; } else { boolean isRtl = textDir.isRtl(mChars, 0, len); bidiRequest = isRtl ? Layout.DIR_REQUEST_RTL : Layout.DIR_REQUEST_LTR; } mDir = AndroidBidi.bidi(bidiRequest, mChars, mLevels, len, false); mEasy = false; } Loading
core/java/android/text/StaticLayout.java +45 −8 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package android.text; import com.android.internal.util.ArrayUtils; import android.graphics.Bitmap; import android.graphics.Paint; import android.text.style.LeadingMarginSpan; Loading @@ -26,6 +24,8 @@ import android.text.style.LineHeightSpan; import android.text.style.MetricAffectingSpan; import android.text.style.TabStopSpan; import com.android.internal.util.ArrayUtils; /** * StaticLayout is a Layout for text that will not be edited after it * is laid out. Use {@link DynamicLayout} for text that may change. Loading @@ -46,6 +46,17 @@ public class StaticLayout extends Layout { spacingmult, spacingadd, includepad); } /** * @hide */ public StaticLayout(CharSequence source, TextPaint paint, int width, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad) { this(source, 0, source.length(), paint, width, align, textDir, spacingmult, spacingadd, includepad); } public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, Loading @@ -55,18 +66,44 @@ public class StaticLayout extends Layout { spacingmult, spacingadd, includepad, null, 0); } /** * @hide */ public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad) { this(source, bufstart, bufend, paint, outerwidth, align, textDir, spacingmult, spacingadd, includepad, null, 0); } public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { this(source, bufstart, bufend, paint, outerwidth, align, TextDirectionHeuristics.FIRSTSTRONG_LTR, spacingmult, spacingadd, includepad, ellipsize, ellipsizedWidth); } /** * @hide */ public StaticLayout(CharSequence source, int bufstart, int bufend, TextPaint paint, int outerwidth, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { super((ellipsize == null) ? source : (source instanceof Spanned) ? new SpannedEllipsizer(source) : new Ellipsizer(source), paint, outerwidth, align, spacingmult, spacingadd); paint, outerwidth, align, textDir, spacingmult, spacingadd); /* * This is annoying, but we can't refer to the layout until Loading Loading @@ -96,7 +133,7 @@ public class StaticLayout extends Layout { mMeasured = MeasuredText.obtain(); generate(source, bufstart, bufend, paint, outerwidth, align, generate(source, bufstart, bufend, paint, outerwidth, align, textDir, spacingmult, spacingadd, includepad, includepad, ellipsizedWidth, ellipsize); Loading @@ -116,7 +153,7 @@ public class StaticLayout extends Layout { /* package */ void generate(CharSequence source, int bufStart, int bufEnd, TextPaint paint, int outerWidth, Alignment align, Alignment align, TextDirectionHeuristic textDir, float spacingmult, float spacingadd, boolean includepad, boolean trackpad, float ellipsizedWidth, TextUtils.TruncateAt ellipsize) { Loading Loading @@ -195,7 +232,7 @@ public class StaticLayout extends Layout { } } measured.setPara(source, paraStart, paraEnd, DIR_REQUEST_DEFAULT_LTR); measured.setPara(source, paraStart, paraEnd, textDir); char[] chs = measured.mChars; float[] widths = measured.mWidths; byte[] chdirs = measured.mLevels; Loading