Loading core/java/android/text/BoringLayout.java +131 −75 Original line number Diff line number Diff line Loading @@ -35,46 +35,80 @@ import android.text.style.ParagraphStyle; * Canvas.drawText()} directly.</p> */ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback { public static BoringLayout make(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad) { return new BoringLayout(source, paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad); } public static BoringLayout make(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { return new BoringLayout(source, paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, ellipsize, ellipsizedWidth); /** * Utility function to construct a BoringLayout instance. * * @param source the text to render * @param paint the default paint for the layout * @param outerWidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts */ public static BoringLayout make(CharSequence source, TextPaint paint, int outerWidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad) { return new BoringLayout(source, paint, outerWidth, align, spacingMult, spacingAdd, metrics, includePad); } /** * Utility function to construct a BoringLayout instance. * * @param source the text to render * @param paint the default paint for the layout * @param outerWidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingmult this value is no longer used by BoringLayout * @param spacingadd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts * @param ellipsize whether to ellipsize the text if width of the text is longer than the * requested width * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is * not used, {@code outerWidth} is used instead */ public static BoringLayout make(CharSequence source, TextPaint paint, int outerWidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { return new BoringLayout(source, paint, outerWidth, align, spacingmult, spacingadd, metrics, includePad, ellipsize, ellipsizedWidth); } /** * Returns a BoringLayout for the specified text, potentially reusing * this one if it is already suitable. The caller must make sure that * no one is still using this Layout. * * @param source the text to render * @param paint the default paint for the layout * @param outerwidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts */ public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad) { replaceWith(source, paint, outerwidth, align, spacingmult, spacingadd); public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad) { replaceWith(source, paint, outerwidth, align, spacingMult, spacingAdd); mEllipsizedWidth = outerwidth; mEllipsizedStart = 0; mEllipsizedCount = 0; init(source, paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, true); init(source, paint, align, metrics, includePad, true); return this; } Loading @@ -82,95 +116,118 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback * Returns a BoringLayout for the specified text, potentially reusing * this one if it is already suitable. The caller must make sure that * no one is still using this Layout. * * @param source the text to render * @param paint the default paint for the layout * @param outerWidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts * @param ellipsize whether to ellipsize the text if width of the text is longer than the * requested width * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is * not used, {@code outerwidth} is used instead */ public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerWidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { boolean trust; if (ellipsize == null || ellipsize == TextUtils.TruncateAt.MARQUEE) { replaceWith(source, paint, outerwidth, align, spacingmult, spacingadd); replaceWith(source, paint, outerWidth, align, spacingMult, spacingAdd); mEllipsizedWidth = outerwidth; mEllipsizedWidth = outerWidth; mEllipsizedStart = 0; mEllipsizedCount = 0; trust = true; } else { replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this), paint, outerwidth, align, spacingmult, spacingadd); replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this), paint, outerWidth, align, spacingMult, spacingAdd); mEllipsizedWidth = ellipsizedWidth; trust = false; } init(getText(), paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, trust); init(getText(), paint, align, metrics, includePad, trust); return this; } public BoringLayout(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad) { super(source, paint, outerwidth, align, spacingmult, spacingadd); /** * @param source the text to render * @param paint the default paint for the layout * @param outerwidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts */ public BoringLayout(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad) { super(source, paint, outerwidth, align, spacingMult, spacingAdd); mEllipsizedWidth = outerwidth; mEllipsizedStart = 0; mEllipsizedCount = 0; init(source, paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, true); init(source, paint, align, metrics, includePad, true); } public BoringLayout(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad, /** * * @param source the text to render * @param paint the default paint for the layout * @param outerWidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts * @param ellipsize whether to ellipsize the text if width of the text is longer than the * requested {@code outerwidth} * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is * not used, {@code outerwidth} is used instead */ public BoringLayout(CharSequence source, TextPaint paint, int outerWidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { /* * It is silly to have to call super() and then replaceWith(), * but we can't use "this" for the callback until the call to * super() finishes. */ super(source, paint, outerwidth, align, spacingmult, spacingadd); super(source, paint, outerWidth, align, spacingMult, spacingAdd); boolean trust; if (ellipsize == null || ellipsize == TextUtils.TruncateAt.MARQUEE) { mEllipsizedWidth = outerwidth; mEllipsizedWidth = outerWidth; mEllipsizedStart = 0; mEllipsizedCount = 0; trust = true; } else { replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this), paint, outerwidth, align, spacingmult, spacingadd); replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this), paint, outerWidth, align, spacingMult, spacingAdd); mEllipsizedWidth = ellipsizedWidth; trust = false; } init(getText(), paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, trust); init(getText(), paint, align, metrics, includePad, trust); } /* package */ void init(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad, boolean trustWidth) { /* package */ void init(CharSequence source, TextPaint paint, Alignment align, BoringLayout.Metrics metrics, boolean includePad, boolean trustWidth) { int spacing; if (source instanceof String && align == Layout.Alignment.ALIGN_NORMAL) { Loading @@ -181,7 +238,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback mPaint = paint; if (includepad) { if (includePad) { spacing = metrics.bottom - metrics.top; mDesc = metrics.bottom; } else { Loading @@ -206,7 +263,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback TextLine.recycle(line); } if (includepad) { if (includePad) { mTopPadding = metrics.top - metrics.ascent; mBottomPadding = metrics.bottom - metrics.descent; } Loading @@ -215,8 +272,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback /** * Returns null if not boring; the width, ascent, and descent if boring. */ public static Metrics isBoring(CharSequence text, TextPaint paint) { public static Metrics isBoring(CharSequence text, TextPaint paint) { return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, null); } Loading Loading
core/java/android/text/BoringLayout.java +131 −75 Original line number Diff line number Diff line Loading @@ -35,46 +35,80 @@ import android.text.style.ParagraphStyle; * Canvas.drawText()} directly.</p> */ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback { public static BoringLayout make(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad) { return new BoringLayout(source, paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad); } public static BoringLayout make(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { return new BoringLayout(source, paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, ellipsize, ellipsizedWidth); /** * Utility function to construct a BoringLayout instance. * * @param source the text to render * @param paint the default paint for the layout * @param outerWidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts */ public static BoringLayout make(CharSequence source, TextPaint paint, int outerWidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad) { return new BoringLayout(source, paint, outerWidth, align, spacingMult, spacingAdd, metrics, includePad); } /** * Utility function to construct a BoringLayout instance. * * @param source the text to render * @param paint the default paint for the layout * @param outerWidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingmult this value is no longer used by BoringLayout * @param spacingadd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts * @param ellipsize whether to ellipsize the text if width of the text is longer than the * requested width * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is * not used, {@code outerWidth} is used instead */ public static BoringLayout make(CharSequence source, TextPaint paint, int outerWidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { return new BoringLayout(source, paint, outerWidth, align, spacingmult, spacingadd, metrics, includePad, ellipsize, ellipsizedWidth); } /** * Returns a BoringLayout for the specified text, potentially reusing * this one if it is already suitable. The caller must make sure that * no one is still using this Layout. * * @param source the text to render * @param paint the default paint for the layout * @param outerwidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts */ public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad) { replaceWith(source, paint, outerwidth, align, spacingmult, spacingadd); public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad) { replaceWith(source, paint, outerwidth, align, spacingMult, spacingAdd); mEllipsizedWidth = outerwidth; mEllipsizedStart = 0; mEllipsizedCount = 0; init(source, paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, true); init(source, paint, align, metrics, includePad, true); return this; } Loading @@ -82,95 +116,118 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback * Returns a BoringLayout for the specified text, potentially reusing * this one if it is already suitable. The caller must make sure that * no one is still using this Layout. * * @param source the text to render * @param paint the default paint for the layout * @param outerWidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts * @param ellipsize whether to ellipsize the text if width of the text is longer than the * requested width * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is * not used, {@code outerwidth} is used instead */ public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { public BoringLayout replaceOrMake(CharSequence source, TextPaint paint, int outerWidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { boolean trust; if (ellipsize == null || ellipsize == TextUtils.TruncateAt.MARQUEE) { replaceWith(source, paint, outerwidth, align, spacingmult, spacingadd); replaceWith(source, paint, outerWidth, align, spacingMult, spacingAdd); mEllipsizedWidth = outerwidth; mEllipsizedWidth = outerWidth; mEllipsizedStart = 0; mEllipsizedCount = 0; trust = true; } else { replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this), paint, outerwidth, align, spacingmult, spacingadd); replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this), paint, outerWidth, align, spacingMult, spacingAdd); mEllipsizedWidth = ellipsizedWidth; trust = false; } init(getText(), paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, trust); init(getText(), paint, align, metrics, includePad, trust); return this; } public BoringLayout(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad) { super(source, paint, outerwidth, align, spacingmult, spacingadd); /** * @param source the text to render * @param paint the default paint for the layout * @param outerwidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts */ public BoringLayout(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad) { super(source, paint, outerwidth, align, spacingMult, spacingAdd); mEllipsizedWidth = outerwidth; mEllipsizedStart = 0; mEllipsizedCount = 0; init(source, paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, true); init(source, paint, align, metrics, includePad, true); } public BoringLayout(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad, /** * * @param source the text to render * @param paint the default paint for the layout * @param outerWidth the wrapping width for the text * @param align whether to left, right, or center the text * @param spacingMult this value is no longer used by BoringLayout * @param spacingAdd this value is no longer used by BoringLayout * @param metrics {@code #Metrics} instance that contains information about FontMetrics and * line width * @param includePad set whether to include extra space beyond font ascent and descent which is * needed to avoid clipping in some scripts * @param ellipsize whether to ellipsize the text if width of the text is longer than the * requested {@code outerwidth} * @param ellipsizedWidth the width to which this Layout is ellipsizing. If {@code ellipsize} is * {@code null}, or is {@link TextUtils.TruncateAt#MARQUEE} this value is * not used, {@code outerwidth} is used instead */ public BoringLayout(CharSequence source, TextPaint paint, int outerWidth, Alignment align, float spacingMult, float spacingAdd, BoringLayout.Metrics metrics, boolean includePad, TextUtils.TruncateAt ellipsize, int ellipsizedWidth) { /* * It is silly to have to call super() and then replaceWith(), * but we can't use "this" for the callback until the call to * super() finishes. */ super(source, paint, outerwidth, align, spacingmult, spacingadd); super(source, paint, outerWidth, align, spacingMult, spacingAdd); boolean trust; if (ellipsize == null || ellipsize == TextUtils.TruncateAt.MARQUEE) { mEllipsizedWidth = outerwidth; mEllipsizedWidth = outerWidth; mEllipsizedStart = 0; mEllipsizedCount = 0; trust = true; } else { replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this), paint, outerwidth, align, spacingmult, spacingadd); replaceWith(TextUtils.ellipsize(source, paint, ellipsizedWidth, ellipsize, true, this), paint, outerWidth, align, spacingMult, spacingAdd); mEllipsizedWidth = ellipsizedWidth; trust = false; } init(getText(), paint, outerwidth, align, spacingmult, spacingadd, metrics, includepad, trust); init(getText(), paint, align, metrics, includePad, trust); } /* package */ void init(CharSequence source, TextPaint paint, int outerwidth, Alignment align, float spacingmult, float spacingadd, BoringLayout.Metrics metrics, boolean includepad, boolean trustWidth) { /* package */ void init(CharSequence source, TextPaint paint, Alignment align, BoringLayout.Metrics metrics, boolean includePad, boolean trustWidth) { int spacing; if (source instanceof String && align == Layout.Alignment.ALIGN_NORMAL) { Loading @@ -181,7 +238,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback mPaint = paint; if (includepad) { if (includePad) { spacing = metrics.bottom - metrics.top; mDesc = metrics.bottom; } else { Loading @@ -206,7 +263,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback TextLine.recycle(line); } if (includepad) { if (includePad) { mTopPadding = metrics.top - metrics.ascent; mBottomPadding = metrics.bottom - metrics.descent; } Loading @@ -215,8 +272,7 @@ public class BoringLayout extends Layout implements TextUtils.EllipsizeCallback /** * Returns null if not boring; the width, ascent, and descent if boring. */ public static Metrics isBoring(CharSequence text, TextPaint paint) { public static Metrics isBoring(CharSequence text, TextPaint paint) { return isBoring(text, paint, TextDirectionHeuristics.FIRSTSTRONG_LTR, null); } Loading