Loading core/java/android/text/Layout.java +19 −10 Original line number Diff line number Diff line Loading @@ -385,21 +385,22 @@ public abstract class Layout { int x; if (align == Alignment.ALIGN_NORMAL) { if (dir == DIR_LEFT_TO_RIGHT) { x = left; x = left + getIndentAdjust(lineNum, Alignment.ALIGN_LEFT); } else { x = right; x = right + getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT); } } else { int max = (int)getLineExtent(lineNum, tabStops, false); if (align == Alignment.ALIGN_OPPOSITE) { if (dir == DIR_LEFT_TO_RIGHT) { x = right - max; x = right - max + getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT); } else { x = left - max; x = left - max + getIndentAdjust(lineNum, Alignment.ALIGN_LEFT); } } else { // Alignment.ALIGN_CENTER max = max & ~1; x = (right + left - max) >> 1; x = ((right + left - max) >> 1) + getIndentAdjust(lineNum, Alignment.ALIGN_CENTER); } } Loading Loading @@ -545,9 +546,9 @@ public abstract class Layout { int x; if (align == Alignment.ALIGN_NORMAL) { if (dir == DIR_LEFT_TO_RIGHT) { x = left; x = left + getIndentAdjust(line, Alignment.ALIGN_LEFT); } else { x = right; x = right + getIndentAdjust(line, Alignment.ALIGN_RIGHT); } } else { TabStops tabStops = null; Loading @@ -565,14 +566,14 @@ public abstract class Layout { int max = (int)getLineExtent(line, tabStops, false); if (align == Alignment.ALIGN_OPPOSITE) { if (dir == DIR_LEFT_TO_RIGHT) { x = right - max; x = right - max + getIndentAdjust(line, Alignment.ALIGN_RIGHT); } else { // max is negative here x = left - max; x = left - max + getIndentAdjust(line, Alignment.ALIGN_LEFT); } } else { // Alignment.ALIGN_CENTER max = max & ~1; x = (left + right - max) >> 1; x = (left + right - max) >> 1 + getIndentAdjust(line, Alignment.ALIGN_CENTER); } } return x; Loading Loading @@ -745,6 +746,14 @@ public abstract class Layout { return 0; } /** * Returns the left indent for a line. * * @hide */ public int getIndentAdjust(int line, Alignment alignment) { return 0; } /** * Returns true if the character at offset and the preceding character Loading core/java/android/text/StaticLayout.java +60 −1 Original line number Diff line number Diff line Loading @@ -103,6 +103,8 @@ public class StaticLayout extends Layout { b.mText = null; MeasuredText.recycle(b.mMeasuredText); b.mMeasuredText = null; b.mLeftIndents = null; b.mRightIndents = null; nFinishBuilder(b.mNativePtr); sPool.release(b); } Loading Loading @@ -296,9 +298,10 @@ public class StaticLayout extends Layout { * @param leftIndents array of indent values for left margin, in pixels * @param rightIndents array of indent values for right margin, in pixels * @return this builder, useful for chaining * @see android.widget.TextView#setIndents */ public Builder setIndents(int[] leftIndents, int[] rightIndents) { mLeftIndents = leftIndents; mRightIndents = rightIndents; int leftLen = leftIndents == null ? 0 : leftIndents.length; int rightLen = rightIndents == null ? 0 : rightIndents.length; int[] indents = new int[Math.max(leftLen, rightLen)]; Loading Loading @@ -393,6 +396,8 @@ public class StaticLayout extends Layout { int mMaxLines; int mBreakStrategy; int mHyphenationFrequency; int[] mLeftIndents; int[] mRightIndents; Paint.FontMetricsInt mFontMetricsInt = new Paint.FontMetricsInt(); Loading Loading @@ -544,6 +549,9 @@ public class StaticLayout extends Layout { mLines = new int[mLineDirections.length]; mMaximumVisibleLineCount = b.mMaxLines; mLeftIndents = b.mLeftIndents; mRightIndents = b.mRightIndents; generate(b, b.mIncludePad, b.mIncludePad); } Loading Loading @@ -661,6 +669,23 @@ public class StaticLayout extends Layout { nSetupParagraph(b.mNativePtr, chs, paraEnd - paraStart, firstWidth, firstWidthLineCount, restWidth, variableTabStops, TAB_INCREMENT, b.mBreakStrategy, b.mHyphenationFrequency); if (mLeftIndents != null || mRightIndents != null) { // TODO(raph) performance: it would be better to do this once per layout rather // than once per paragraph, but that would require a change to the native // interface. int leftLen = mLeftIndents == null ? 0 : mLeftIndents.length; int rightLen = mRightIndents == null ? 0 : mRightIndents.length; int indentsLen = Math.max(1, Math.min(leftLen, rightLen) - mLineCount); int[] indents = new int[indentsLen]; for (int i = 0; i < indentsLen; i++) { int leftMargin = mLeftIndents == null ? 0 : mLeftIndents[Math.min(i + mLineCount, leftLen - 1)]; int rightMargin = mRightIndents == null ? 0 : mRightIndents[Math.min(i + mLineCount, rightLen - 1)]; indents[i] = leftMargin + rightMargin; } nSetIndents(b.mNativePtr, indents); } // measurement has to be done before performing line breaking // but we don't want to recompute fontmetrics or span ranges the Loading Loading @@ -1154,6 +1179,38 @@ public class StaticLayout extends Layout { return mLines[mColumns * line + HYPHEN] & 0xff; } /** * @hide */ @Override public int getIndentAdjust(int line, Alignment align) { if (align == Alignment.ALIGN_LEFT) { if (mLeftIndents == null) { return 0; } else { return mLeftIndents[Math.min(line, mLeftIndents.length - 1)]; } } else if (align == Alignment.ALIGN_RIGHT) { if (mRightIndents == null) { return 0; } else { return -mRightIndents[Math.min(line, mRightIndents.length - 1)]; } } else if (align == Alignment.ALIGN_CENTER) { int left = 0; if (mLeftIndents != null) { left = mLeftIndents[Math.min(line, mLeftIndents.length - 1)]; } int right = 0; if (mRightIndents != null) { right = mRightIndents[Math.min(line, mRightIndents.length - 1)]; } return (left - right) >> 1; } else { throw new AssertionError("unhandled alignment " + align); } } @Override public int getEllipsisCount(int line) { if (mColumns < COLUMNS_ELLIPSIZE) { Loading Loading @@ -1250,4 +1307,6 @@ public class StaticLayout extends Layout { // breaks, widths, and flags should all have the same length } private int[] mLeftIndents; private int[] mRightIndents; } Loading
core/java/android/text/Layout.java +19 −10 Original line number Diff line number Diff line Loading @@ -385,21 +385,22 @@ public abstract class Layout { int x; if (align == Alignment.ALIGN_NORMAL) { if (dir == DIR_LEFT_TO_RIGHT) { x = left; x = left + getIndentAdjust(lineNum, Alignment.ALIGN_LEFT); } else { x = right; x = right + getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT); } } else { int max = (int)getLineExtent(lineNum, tabStops, false); if (align == Alignment.ALIGN_OPPOSITE) { if (dir == DIR_LEFT_TO_RIGHT) { x = right - max; x = right - max + getIndentAdjust(lineNum, Alignment.ALIGN_RIGHT); } else { x = left - max; x = left - max + getIndentAdjust(lineNum, Alignment.ALIGN_LEFT); } } else { // Alignment.ALIGN_CENTER max = max & ~1; x = (right + left - max) >> 1; x = ((right + left - max) >> 1) + getIndentAdjust(lineNum, Alignment.ALIGN_CENTER); } } Loading Loading @@ -545,9 +546,9 @@ public abstract class Layout { int x; if (align == Alignment.ALIGN_NORMAL) { if (dir == DIR_LEFT_TO_RIGHT) { x = left; x = left + getIndentAdjust(line, Alignment.ALIGN_LEFT); } else { x = right; x = right + getIndentAdjust(line, Alignment.ALIGN_RIGHT); } } else { TabStops tabStops = null; Loading @@ -565,14 +566,14 @@ public abstract class Layout { int max = (int)getLineExtent(line, tabStops, false); if (align == Alignment.ALIGN_OPPOSITE) { if (dir == DIR_LEFT_TO_RIGHT) { x = right - max; x = right - max + getIndentAdjust(line, Alignment.ALIGN_RIGHT); } else { // max is negative here x = left - max; x = left - max + getIndentAdjust(line, Alignment.ALIGN_LEFT); } } else { // Alignment.ALIGN_CENTER max = max & ~1; x = (left + right - max) >> 1; x = (left + right - max) >> 1 + getIndentAdjust(line, Alignment.ALIGN_CENTER); } } return x; Loading Loading @@ -745,6 +746,14 @@ public abstract class Layout { return 0; } /** * Returns the left indent for a line. * * @hide */ public int getIndentAdjust(int line, Alignment alignment) { return 0; } /** * Returns true if the character at offset and the preceding character Loading
core/java/android/text/StaticLayout.java +60 −1 Original line number Diff line number Diff line Loading @@ -103,6 +103,8 @@ public class StaticLayout extends Layout { b.mText = null; MeasuredText.recycle(b.mMeasuredText); b.mMeasuredText = null; b.mLeftIndents = null; b.mRightIndents = null; nFinishBuilder(b.mNativePtr); sPool.release(b); } Loading Loading @@ -296,9 +298,10 @@ public class StaticLayout extends Layout { * @param leftIndents array of indent values for left margin, in pixels * @param rightIndents array of indent values for right margin, in pixels * @return this builder, useful for chaining * @see android.widget.TextView#setIndents */ public Builder setIndents(int[] leftIndents, int[] rightIndents) { mLeftIndents = leftIndents; mRightIndents = rightIndents; int leftLen = leftIndents == null ? 0 : leftIndents.length; int rightLen = rightIndents == null ? 0 : rightIndents.length; int[] indents = new int[Math.max(leftLen, rightLen)]; Loading Loading @@ -393,6 +396,8 @@ public class StaticLayout extends Layout { int mMaxLines; int mBreakStrategy; int mHyphenationFrequency; int[] mLeftIndents; int[] mRightIndents; Paint.FontMetricsInt mFontMetricsInt = new Paint.FontMetricsInt(); Loading Loading @@ -544,6 +549,9 @@ public class StaticLayout extends Layout { mLines = new int[mLineDirections.length]; mMaximumVisibleLineCount = b.mMaxLines; mLeftIndents = b.mLeftIndents; mRightIndents = b.mRightIndents; generate(b, b.mIncludePad, b.mIncludePad); } Loading Loading @@ -661,6 +669,23 @@ public class StaticLayout extends Layout { nSetupParagraph(b.mNativePtr, chs, paraEnd - paraStart, firstWidth, firstWidthLineCount, restWidth, variableTabStops, TAB_INCREMENT, b.mBreakStrategy, b.mHyphenationFrequency); if (mLeftIndents != null || mRightIndents != null) { // TODO(raph) performance: it would be better to do this once per layout rather // than once per paragraph, but that would require a change to the native // interface. int leftLen = mLeftIndents == null ? 0 : mLeftIndents.length; int rightLen = mRightIndents == null ? 0 : mRightIndents.length; int indentsLen = Math.max(1, Math.min(leftLen, rightLen) - mLineCount); int[] indents = new int[indentsLen]; for (int i = 0; i < indentsLen; i++) { int leftMargin = mLeftIndents == null ? 0 : mLeftIndents[Math.min(i + mLineCount, leftLen - 1)]; int rightMargin = mRightIndents == null ? 0 : mRightIndents[Math.min(i + mLineCount, rightLen - 1)]; indents[i] = leftMargin + rightMargin; } nSetIndents(b.mNativePtr, indents); } // measurement has to be done before performing line breaking // but we don't want to recompute fontmetrics or span ranges the Loading Loading @@ -1154,6 +1179,38 @@ public class StaticLayout extends Layout { return mLines[mColumns * line + HYPHEN] & 0xff; } /** * @hide */ @Override public int getIndentAdjust(int line, Alignment align) { if (align == Alignment.ALIGN_LEFT) { if (mLeftIndents == null) { return 0; } else { return mLeftIndents[Math.min(line, mLeftIndents.length - 1)]; } } else if (align == Alignment.ALIGN_RIGHT) { if (mRightIndents == null) { return 0; } else { return -mRightIndents[Math.min(line, mRightIndents.length - 1)]; } } else if (align == Alignment.ALIGN_CENTER) { int left = 0; if (mLeftIndents != null) { left = mLeftIndents[Math.min(line, mLeftIndents.length - 1)]; } int right = 0; if (mRightIndents != null) { right = mRightIndents[Math.min(line, mRightIndents.length - 1)]; } return (left - right) >> 1; } else { throw new AssertionError("unhandled alignment " + align); } } @Override public int getEllipsisCount(int line) { if (mColumns < COLUMNS_ELLIPSIZE) { Loading Loading @@ -1250,4 +1307,6 @@ public class StaticLayout extends Layout { // breaks, widths, and flags should all have the same length } private int[] mLeftIndents; private int[] mRightIndents; }