2020-12-25 11:42:28 (UTC-03:00)
Marcel Rodrigues <marcelgmr@gmail.com>
Merge pull request #7 from rdebath/patch-upgrade2 Patch upgrade2 -- Colours
diff --git a/main.c b/main.c index d6c4bc5..0ba53de 100644 --- a/main.c +++ b/main.c @@ -40,7 +40,6 @@ get_pair(Term *term, int row, int col) uint8_t fore, back; int inverse; - /* TODO: add support for A_INVISIBLE */ inverse = term->mode & M_REVERSE; if (term->mode & M_CURSORVIS) inverse = term->row == row && term->col == col ? !inverse : inverse; @@ -59,8 +58,9 @@ get_pair(Term *term, int row, int col) fore = 0x2; if (cell.attr & A_BOLD) fore |= 0x8; - if (cell.attr & A_BLINK) + if (cell.attr & A_BRIGHTBG) back |= 0x8; + if ((cell.attr & A_INVISIBLE) != 0) fore = back; return (fore << 4) | (back & 0xF); } diff --git a/term.c b/term.c index 8c3a5a5..a42dcca 100644 --- a/term.c +++ b/term.c @@ -452,77 +452,134 @@ modeswitch(Term *term, int private, int number, int value) } static void -sgr(Term *term, int number) +sgr(Term *term, int n, int *params) { - switch (number) { - case 0: - term->attr = def_attr; - term->pair = def_pair; - break; - case 1: - term->attr |= A_BOLD; - break; - case 2: - term->attr |= A_DIM; - break; - case 4: - term->attr |= A_UNDERLINE; - break; - case 5: - term->attr |= A_BLINK; - break; - case 7: - term->attr |= A_INVERSE; - break; - case 10: - /* TODO: reset toggle meta flag */ - term->cs_array[term->cs_index = 0] = CS_BMP; - term->mode &= ~M_DISPCTRL; - break; - case 11: - /* TODO: reset toggle meta flag */ - term->cs_array[term->cs_index] = CS_437; - term->mode |= M_DISPCTRL; - break; - case 12: - /* TODO: set toggle meta flag */ - term->cs_array[term->cs_index] = CS_437; - term->mode |= M_DISPCTRL; - break; - case 21: - term->attr &= ~A_BOLD; - break; - case 22: - term->attr &= ~A_DIM; - break; - case 24: - term->attr &= ~A_UNDERLINE; - break; - case 25: - term->attr &= ~A_BLINK; - break; - case 27: - term->attr &= ~A_INVERSE; - break; - case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: - term->pair = ((number - 30) << 4) | (term->pair & 0x0F); - break; - case 38: - term->attr |= A_UNDERLINE; - term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); - break; - case 39: - term->attr &= ~A_UNDERLINE; - term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); - break; - case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: - term->pair = (term->pair & 0xF0) | (number - 40); - break; - case 49: - term->pair = (term->pair & 0xF0) | DEF_BACK; - break; - default: - logfmt("UNS: SGR %d\n", number); + int i, number; + for(i=0; i<n; i++) { + number = params[i]; + + switch (number) { + case 0: + term->attr = def_attr; + term->pair = def_pair; + break; + case 1: + term->attr |= A_BOLD; + break; + case 2: + term->attr |= A_DIM; + break; + case 4: + term->attr |= A_UNDERLINE; + break; + case 5: + term->attr |= A_BLINK; + break; + case 7: + term->attr |= A_INVERSE; + break; + case 8: + term->attr |= A_INVISIBLE; + break; + case 10: + /* TODO: reset toggle meta flag */ + term->cs_array[term->cs_index = 0] = CS_BMP; + term->mode &= ~M_DISPCTRL; + break; + case 11: + /* TODO: reset toggle meta flag */ + term->cs_array[term->cs_index] = CS_437; + term->mode |= M_DISPCTRL; + break; + case 12: + /* TODO: set toggle meta flag */ + term->cs_array[term->cs_index] = CS_437; + term->mode |= M_DISPCTRL; + break; + case 21: + term->attr &= ~A_BOLD; + break; + case 22: + term->attr &= ~A_DIM; + break; + case 24: + term->attr &= ~A_UNDERLINE; + break; + case 25: + term->attr &= ~A_BLINK; + break; + case 27: + term->attr &= ~A_INVERSE; + break; + case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: + term->pair = ((number - 30) << 4) | (term->pair & 0x0F); + break; +#ifdef OLDLINUX + case 38: + term->attr |= A_UNDERLINE; + term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); + break; + case 39: + term->attr &= ~A_UNDERLINE; + term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); + break; +#endif +#ifndef OLDLINUX + case 38: + i++ ; + if (i>n) break; + if (params[i] == 5) { + i++; /* 256 colours */ + term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); + break; + } else if (params[i] == 2) { + i+=3; + /* 16M colours, note I'm using common form not strict ITU T.416 */ + term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); + break; + } + /* Could be CMYK; probably broken */ + i = n; + break; + case 39: + term->pair = (DEF_FORE << 4) | (term->pair & 0x0F); + break; +#endif + case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: + term->pair = (term->pair & 0xF0) | (number - 40); + break; +#ifndef OLDLINUX + case 48: + i++ ; + if (i>n) break; + if (params[i] == 5) { + i++; /* 256 colours */ + term->pair = (term->pair & 0xF0) | DEF_BACK; + break; + } else if (params[i] == 2) { + i+=3; + /* 16M colours, note I'm using common form not strict ITU T.416 */ + term->pair = (term->pair & 0xF0) | DEF_BACK; + break; + } + /* Could be CMYK; probably broken */ + i = n; + break; +#endif + case 49: + term->pair = (term->pair & 0xF0) | DEF_BACK; + break; + case 90: case 91: case 92: case 93: case 94: case 95: case 96: case 97: + term->pair = ((number - 90) << 4) | (term->pair & 0x0F); + term->attr |= A_BOLD; + break; + case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107: + term->pair = (term->pair & 0xF0) | (number - 100); + term->attr |= A_BRIGHTBG; + break; + default: + logfmt("UNS: SGR %d\n", number); + } } } @@ -705,8 +762,7 @@ ctrlseq(Term *term, uint8_t byte) modeswitch(term, private, params[i], 0); break; case 'm': - for (i = 0; i < n; i++) - sgr(term, params[i]); + sgr(term, n, params); break; case 'n': /* Device Status Report (DSR) */ diff --git a/term.h b/term.h index 1a9125a..35ba164 100644 --- a/term.h +++ b/term.h @@ -7,6 +7,7 @@ #define A_INVERSE 0x20 #define A_INVISIBLE 0x40 #define A_CROSSED 0x80 +#define A_BRIGHTBG A_BLINK #define M_DISPCTRL 0x0001 #define M_INSERT 0x0002