summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/syscons/scterm-teken.c8
-rw-r--r--sys/teken/teken.c51
-rw-r--r--sys/teken/teken.h3
-rw-r--r--sys/teken/teken_demo.c3
-rw-r--r--sys/teken/teken_subr.h32
-rw-r--r--sys/teken/teken_subr_compat.h4
6 files changed, 94 insertions, 7 deletions
diff --git a/sys/dev/syscons/scterm-teken.c b/sys/dev/syscons/scterm-teken.c
index 3c8a57a..4782beb 100644
--- a/sys/dev/syscons/scterm-teken.c
+++ b/sys/dev/syscons/scterm-teken.c
@@ -313,11 +313,11 @@ scteken_attr(const teken_attr_t *a)
teken_color_t fg, bg;
if (a->ta_format & TF_REVERSE) {
- fg = a->ta_bgcolor;
- bg = a->ta_fgcolor;
+ fg = teken_256to8(a->ta_bgcolor);
+ bg = teken_256to8(a->ta_fgcolor);
} else {
- fg = a->ta_fgcolor;
- bg = a->ta_bgcolor;
+ fg = teken_256to8(a->ta_fgcolor);
+ bg = teken_256to8(a->ta_bgcolor);
}
if (a->ta_format & TF_BOLD)
attr |= fgcolors_bold[fg];
diff --git a/sys/teken/teken.c b/sys/teken/teken.c
index f44969d..c8d6b09 100644
--- a/sys/teken/teken.c
+++ b/sys/teken/teken.c
@@ -409,4 +409,55 @@ teken_state_numbers(teken_t *t, teken_char_t c)
return (0);
}
+teken_color_t
+teken_256to8(teken_color_t c)
+{
+ unsigned int r, g, b;
+
+ if (c < 16) {
+ /* Traditional color indices. */
+ return (c % 8);
+ } else if (c >= 244) {
+ /* Upper grayscale colors. */
+ return (TC_WHITE);
+ } else if (c >= 232) {
+ /* Lower grayscale colors. */
+ return (TC_BLACK);
+ }
+
+ /* Convert to RGB. */
+ c -= 16;
+ b = c % 6;
+ g = (c / 6) % 6;
+ r = c / 36;
+
+ if (r < g) {
+ /* Possibly green. */
+ if (g < b)
+ return (TC_BLUE);
+ else if (g > b)
+ return (TC_GREEN);
+ else
+ return (TC_CYAN);
+ } else if (r > g) {
+ /* Possibly red. */
+ if (r < b)
+ return (TC_BLUE);
+ else if (r > b)
+ return (TC_RED);
+ else
+ return (TC_MAGENTA);
+ } else {
+ /* Possibly brown. */
+ if (g < b)
+ return (TC_BLUE);
+ else if (g > b)
+ return (TC_BROWN);
+ else if (r < 3)
+ return (TC_BLACK);
+ else
+ return (TC_WHITE);
+ }
+}
+
#include "teken_state.h"
diff --git a/sys/teken/teken.h b/sys/teken/teken.h
index 4e73f7b..aab037f 100644
--- a/sys/teken/teken.h
+++ b/sys/teken/teken.h
@@ -171,4 +171,7 @@ void teken_set_winsize(teken_t *, const teken_pos_t *);
void teken_set_8bit(teken_t *);
void teken_set_cons25(teken_t *);
+/* Color conversion. */
+teken_color_t teken_256to8(teken_color_t);
+
#endif /* !_TEKEN_H_ */
diff --git a/sys/teken/teken_demo.c b/sys/teken/teken_demo.c
index 4f8a0d5..49397a6 100644
--- a/sys/teken/teken_demo.c
+++ b/sys/teken/teken_demo.c
@@ -116,7 +116,8 @@ printchar(const teken_pos_t *p)
if (px->a.ta_format & TF_REVERSE)
attr |= A_REVERSE;
- bkgdset(attr | COLOR_PAIR(px->a.ta_fgcolor + 8 * px->a.ta_bgcolor));
+ bkgdset(attr | COLOR_PAIR(teken_256to8(px->a.ta_fgcolor) +
+ 8 * teken_256to8(px->a.ta_bgcolor)));
mvaddstr(p->tp_row, p->tp_col, str);
move(y, x);
diff --git a/sys/teken/teken_subr.h b/sys/teken/teken_subr.h
index 4c31065..32cae4d 100644
--- a/sys/teken/teken_subr.h
+++ b/sys/teken/teken_subr.h
@@ -1150,6 +1150,12 @@ teken_subr_set_graphic_rendition(teken_t *t, unsigned int ncmds,
case 37: /* Set foreground color: white */
t->t_curattr.ta_fgcolor = n - 30;
break;
+ case 38: /* Set foreground color: 256 color mode */
+ if (i + 2 >= ncmds || cmds[i + 1] != 5)
+ continue;
+ t->t_curattr.ta_fgcolor = cmds[i + 2];
+ i += 2;
+ break;
case 39: /* Set default foreground color. */
t->t_curattr.ta_fgcolor = t->t_defattr.ta_fgcolor;
break;
@@ -1163,9 +1169,35 @@ teken_subr_set_graphic_rendition(teken_t *t, unsigned int ncmds,
case 47: /* Set background color: white */
t->t_curattr.ta_bgcolor = n - 40;
break;
+ case 48: /* Set background color: 256 color mode */
+ if (i + 2 >= ncmds || cmds[i + 1] != 5)
+ continue;
+ t->t_curattr.ta_bgcolor = cmds[i + 2];
+ i += 2;
+ break;
case 49: /* Set default background color. */
t->t_curattr.ta_bgcolor = t->t_defattr.ta_bgcolor;
break;
+ case 90: /* Set bright foreground color: black */
+ case 91: /* Set bright foreground color: red */
+ case 92: /* Set bright foreground color: green */
+ case 93: /* Set bright foreground color: brown */
+ case 94: /* Set bright foreground color: blue */
+ case 95: /* Set bright foreground color: magenta */
+ case 96: /* Set bright foreground color: cyan */
+ case 97: /* Set bright foreground color: white */
+ t->t_curattr.ta_fgcolor = n - 90 + 8;
+ break;
+ case 100: /* Set bright background color: black */
+ case 101: /* Set bright background color: red */
+ case 102: /* Set bright background color: green */
+ case 103: /* Set bright background color: brown */
+ case 104: /* Set bright background color: blue */
+ case 105: /* Set bright background color: magenta */
+ case 106: /* Set bright background color: cyan */
+ case 107: /* Set bright background color: white */
+ t->t_curattr.ta_bgcolor = n - 100 + 8;
+ break;
default:
teken_printf("unsupported attribute %u\n", n);
}
diff --git a/sys/teken/teken_subr_compat.h b/sys/teken/teken_subr_compat.h
index 088f378..e937298 100644
--- a/sys/teken/teken_subr_compat.h
+++ b/sys/teken/teken_subr_compat.h
@@ -65,10 +65,10 @@ void
teken_get_defattr_cons25(teken_t *t, int *fg, int *bg)
{
- *fg = cons25_revcolors[t->t_defattr.ta_fgcolor];
+ *fg = cons25_revcolors[teken_256to8(t->t_defattr.ta_fgcolor)];
if (t->t_defattr.ta_format & TF_BOLD)
*fg += 8;
- *bg = cons25_revcolors[t->t_defattr.ta_bgcolor];
+ *bg = cons25_revcolors[teken_256to8(t->t_defattr.ta_bgcolor)];
}
static void
OpenPOWER on IntegriCloud