package jackpal.androidterm.emulatorview; /** * Utility class for dealing with text style lines. * * We pack color and formatting information for a particular character into an * int -- see the TextStyle class for details. The simplest way of storing * that information for a screen row would be to use an array of int -- but * given that we only use the lower three bytes of the int to store information, * that effectively wastes one byte per character -- nearly 8 KB per 100 lines * with an 80-column transcript. * * Instead, we use an array of bytes and store the bytes of each int * consecutively in big-endian order. */ final class StyleRow { private int mStyle; private int mColumns; /** Initially null, will be allocated when needed. */ private byte[] mData; StyleRow(int style, int columns) { mStyle = style; mColumns = columns; } void set(int column, int style) { if (style == mStyle && mData == null) { return; } ensureData(); setStyle(column, style); } int get(int column) { if (mData == null) { return mStyle; } return getStyle(column); } boolean isSolidStyle() { return mData == null; } int getSolidStyle() { if (mData != null) { throw new IllegalArgumentException("Not a solid style"); } return mStyle; } void copy(int start, StyleRow dst, int offset, int len) { // fast case if (mData == null && dst.mData == null && start == 0 && offset == 0 && len == mColumns) { dst.mStyle = mStyle; return; } // There are other potentially fast cases, but let's just treat them // all the same for simplicity. ensureData(); dst.ensureData(); System.arraycopy(mData, 3*start, dst.mData, 3*offset, 3*len); } void ensureData() { if (mData == null) { allocate(); } } private void allocate() { mData = new byte[3*mColumns]; for (int i = 0; i < mColumns; i++) { setStyle(i, mStyle); } } private int getStyle(int column) { int index = 3 * column; byte[] line = mData; return line[index] & 0xff | (line[index+1] & 0xff) << 8 | (line[index+2] & 0xff) << 16; } private void setStyle(int column, int value) { int index = 3 * column; byte[] line = mData; line[index] = (byte) (value & 0xff); line[index+1] = (byte) ((value >> 8) & 0xff); line[index+2] = (byte) ((value >> 16) & 0xff); } }