package com.termux.terminal; /** * <p> * Encodes effects, foreground and background colors into a 64 bit long, which are stored for each cell in a terminal * row in {@link TerminalRow#mStyle}. * </p> * <p> * The bit layout is: * </p> * - 16 flags (11 currently used). * - 24 for foreground color (only 9 first bits if a color index). * - 24 for background color (only 9 first bits if a color index). */ public final class TextStyle { public final static int CHARACTER_ATTRIBUTE_BOLD = 1; public final static int CHARACTER_ATTRIBUTE_ITALIC = 1 << 1; public final static int CHARACTER_ATTRIBUTE_UNDERLINE = 1 << 2; public final static int CHARACTER_ATTRIBUTE_BLINK = 1 << 3; public final static int CHARACTER_ATTRIBUTE_INVERSE = 1 << 4; public final static int CHARACTER_ATTRIBUTE_INVISIBLE = 1 << 5; public final static int CHARACTER_ATTRIBUTE_STRIKETHROUGH = 1 << 6; /** * The selective erase control functions (DECSED and DECSEL) can only erase characters defined as erasable. * <p> * This bit is set if DECSCA (Select Character Protection Attribute) has been used to define the characters that * come after it as erasable from the screen. * </p> */ public final static int CHARACTER_ATTRIBUTE_PROTECTED = 1 << 7; /** Dim colors. Also known as faint or half intensity. */ public final static int CHARACTER_ATTRIBUTE_DIM = 1 << 8; /** If true (24-bit) color is used for the cell for foreground. */ private final static int CHARACTER_ATTRIBUTE_TRUECOLOR_FOREGROUND = 1 << 9; /** If true (24-bit) color is used for the cell for foreground. */ private final static int CHARACTER_ATTRIBUTE_TRUECOLOR_BACKGROUND= 1 << 10; public final static int COLOR_INDEX_FOREGROUND = 256; public final static int COLOR_INDEX_BACKGROUND = 257; public final static int COLOR_INDEX_CURSOR = 258; /** The 256 standard color entries and the three special (foreground, background and cursor) ones. */ public final static int NUM_INDEXED_COLORS = 259; /** Normal foreground and background colors and no effects. */ final static long NORMAL = encode(COLOR_INDEX_FOREGROUND, COLOR_INDEX_BACKGROUND, 0); static long encode(int foreColor, int backColor, int effect) { long result = effect & 0b111111111; if ((0xff000000 & foreColor) == 0xff000000) { // 24-bit color. result |= CHARACTER_ATTRIBUTE_TRUECOLOR_FOREGROUND | ((foreColor & 0x00ffffffL) << 40L); } else { // Indexed color. result |= (foreColor & 0b111111111L) << 40; } if ((0xff000000 & backColor) == 0xff000000) { // 24-bit color. result |= CHARACTER_ATTRIBUTE_TRUECOLOR_BACKGROUND | ((backColor & 0x00ffffffL) << 16L); } else { // Indexed color. result |= (backColor & 0b111111111L) << 16L; } return result; } public static int decodeForeColor(long style) { if ((style & CHARACTER_ATTRIBUTE_TRUECOLOR_FOREGROUND) == 0) { return (int) ((style >>> 40) & 0b111111111L); } else { return 0xff000000 | (int) ((style >>> 40) & 0x00ffffffL); } } public static int decodeBackColor(long style) { if ((style & CHARACTER_ATTRIBUTE_TRUECOLOR_BACKGROUND) == 0) { return (int) ((style >>> 16) & 0b111111111L); } else { return 0xff000000 | (int) ((style >>> 16) & 0x00ffffffL); } } public static int decodeEffect(long style) { return (int) (style & 0b11111111111); } }