@Override public void measure(char[] charArray, int start, int end, byte[] wideAttribute, Paint paint, int charWidth) { paint.getTextWidths(charArray, start, end, mWidths); final int N = end - start; for (int i = 0; i < N; i++) wideAttribute[i] = (byte) (((int) mWidths[i] != charWidth) ? AndroidCharacter.EAST_ASIAN_WIDTH_WIDE : AndroidCharacter.EAST_ASIAN_WIDTH_NARROW); }
@Override public void measure(char[] charArray, int start, int end, byte[] wideAttribute, Paint paint, int charWidth) { paint.getTextWidths(charArray, start, end, mWidths); final int N = end - start; for (int i = 0; i < N; i++) wideAttribute[i] = (byte) (((int)mWidths[i] != charWidth) ? AndroidCharacter.EAST_ASIAN_WIDTH_WIDE : AndroidCharacter.EAST_ASIAN_WIDTH_NARROW); }
public void getChars(int start, int end, char[] dest, int destoff) { TextUtils.getChars(mSource, start + mStart, end + mStart, dest, destoff); AndroidCharacter.mirror(dest, 0, end - start); int len = end - start; int n = (end - start) / 2; for (int i = 0; i < n; i++) { char tmp = dest[destoff + i]; dest[destoff + i] = dest[destoff + len - i - 1]; dest[destoff + len - i - 1] = tmp; } }
/** * Put string at current cursor position. Moves cursor * according to the String. Does NOT wrap. * @param s character array * @param start place to start in array * @param len number of characters to process */ public void putString(char[] s, byte[] fullwidths, int start, int len) { if (len > 0) { //markLine(R, 1); int lastChar = -1; char c; boolean isWide = false; for (int i = 0; i < len; i++) { c = s[start + i]; // Shortcut for my favorite ASCII if (c <= 0x7F) { if (lastChar != -1) putChar((char) lastChar, isWide, false); lastChar = c; isWide = false; } else if (!Character.isLowSurrogate(c) && !Character.isHighSurrogate(c)) { if (Character.getType(c) == Character.NON_SPACING_MARK) { if (lastChar != -1) { char nc = Precomposer.precompose((char) lastChar, c); putChar(nc, isWide, false); lastChar = -1; } } else { if (lastChar != -1) putChar((char) lastChar, isWide, false); lastChar = c; if (fullwidths != null) { final byte width = fullwidths[i]; isWide = (width == AndroidCharacter.EAST_ASIAN_WIDTH_WIDE) || (width == AndroidCharacter.EAST_ASIAN_WIDTH_FULL_WIDTH); } } } } if (lastChar != -1) putChar((char) lastChar, isWide, false); setCursorPosition(C, R); redraw(); } }
@Override public void measure(char[] charArray, int start, int end, byte[] wideAttribute, Paint paint, int charWidth) { AndroidCharacter.getEastAsianWidths(charArray, start, end - start, wideAttribute); }
public static int getEastAsianWidth(char c) { return AndroidCharacter.getEastAsianWidth(c); }
public char charAt(int off) { return AndroidCharacter.getMirror(mSource.charAt(mEnd - 1 - off)); }