tty: vt, separate T.416 high colors handler
The code with T.416 high colors handling is flushed to the right and hard to read. Move the code to a separate function and remove code duplication for foreground & background colors. Signed-off-by: Jiri Slaby <jslaby@suse.cz> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
d711ea8f76
commit
e05ab238e3
|
@ -1284,6 +1284,40 @@ static void rgb_background(struct vc_data *vc, struct rgb c)
|
||||||
| (c.r&0x80) >> 1 | (c.g&0x80) >> 2 | (c.b&0x80) >> 3;
|
| (c.r&0x80) >> 1 | (c.g&0x80) >> 2 | (c.b&0x80) >> 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ITU T.416 Higher colour modes. They break the usual properties of SGR codes
|
||||||
|
* and thus need to be detected and ignored by hand. Strictly speaking, that
|
||||||
|
* standard also wants : rather than ; as separators, contrary to ECMA-48, but
|
||||||
|
* no one produces such codes and almost no one accepts them.
|
||||||
|
*
|
||||||
|
* Subcommands 3 (CMY) and 4 (CMYK) are so insane there's no point in
|
||||||
|
* supporting them.
|
||||||
|
*/
|
||||||
|
static int vc_t416_color(struct vc_data *vc, int i,
|
||||||
|
void(*set_color)(struct vc_data *vc, struct rgb c))
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
if (i > vc->vc_npar)
|
||||||
|
return i;
|
||||||
|
|
||||||
|
if (vc->vc_par[i] == 5 && i < vc->vc_npar) {
|
||||||
|
/* 256 colours -- ubiquitous */
|
||||||
|
i++;
|
||||||
|
set_color(vc, rgb_from_256(vc->vc_par[i]));
|
||||||
|
} else if (vc->vc_par[i] == 2 && i <= vc->vc_npar + 3) {
|
||||||
|
/* 24 bit -- extremely rare */
|
||||||
|
struct rgb c = {
|
||||||
|
.r = vc->vc_par[i + 1],
|
||||||
|
.g = vc->vc_par[i + 2],
|
||||||
|
.b = vc->vc_par[i + 3],
|
||||||
|
};
|
||||||
|
set_color(vc, c);
|
||||||
|
i += 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
/* console_lock is held */
|
/* console_lock is held */
|
||||||
static void csi_m(struct vc_data *vc)
|
static void csi_m(struct vc_data *vc)
|
||||||
{
|
{
|
||||||
|
@ -1355,56 +1389,11 @@ static void csi_m(struct vc_data *vc)
|
||||||
case 27:
|
case 27:
|
||||||
vc->vc_reverse = 0;
|
vc->vc_reverse = 0;
|
||||||
break;
|
break;
|
||||||
case 38: /* ITU T.416
|
case 38:
|
||||||
* Higher colour modes.
|
i = vc_t416_color(vc, i, rgb_foreground);
|
||||||
* They break the usual properties of SGR codes
|
|
||||||
* and thus need to be detected and ignored by
|
|
||||||
* hand. Strictly speaking, that standard also
|
|
||||||
* wants : rather than ; as separators, contrary
|
|
||||||
* to ECMA-48, but no one produces such codes
|
|
||||||
* and almost no one accepts them.
|
|
||||||
*/
|
|
||||||
i++;
|
|
||||||
if (i > vc->vc_npar)
|
|
||||||
break;
|
|
||||||
if (vc->vc_par[i] == 5 && /* 256 colours */
|
|
||||||
i < vc->vc_npar) { /* ubiquitous */
|
|
||||||
i++;
|
|
||||||
rgb_foreground(vc,
|
|
||||||
rgb_from_256(vc->vc_par[i]));
|
|
||||||
} else if (vc->vc_par[i] == 2 && /* 24 bit */
|
|
||||||
i <= vc->vc_npar + 3) {/* extremely rare */
|
|
||||||
struct rgb c = {
|
|
||||||
.r = vc->vc_par[i + 1],
|
|
||||||
.g = vc->vc_par[i + 2],
|
|
||||||
.b = vc->vc_par[i + 3],
|
|
||||||
};
|
|
||||||
rgb_foreground(vc, c);
|
|
||||||
i += 3;
|
|
||||||
}
|
|
||||||
/* Subcommands 3 (CMY) and 4 (CMYK) are so insane
|
|
||||||
* there's no point in supporting them.
|
|
||||||
*/
|
|
||||||
break;
|
break;
|
||||||
case 48:
|
case 48:
|
||||||
i++;
|
i = vc_t416_color(vc, i, rgb_background);
|
||||||
if (i > vc->vc_npar)
|
|
||||||
break;
|
|
||||||
if (vc->vc_par[i] == 5 && /* 256 colours */
|
|
||||||
i < vc->vc_npar) {
|
|
||||||
i++;
|
|
||||||
rgb_background(vc,
|
|
||||||
rgb_from_256(vc->vc_par[i]));
|
|
||||||
} else if (vc->vc_par[i] == 2 && /* 24 bit */
|
|
||||||
i <= vc->vc_npar + 3) {
|
|
||||||
struct rgb c = {
|
|
||||||
.r = vc->vc_par[i + 1],
|
|
||||||
.g = vc->vc_par[i + 2],
|
|
||||||
.b = vc->vc_par[i + 3],
|
|
||||||
};
|
|
||||||
rgb_background(vc, c);
|
|
||||||
i += 3;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 39:
|
case 39:
|
||||||
vc->vc_color = (vc->vc_def_color & 0x0f) | (vc->vc_color & 0xf0);
|
vc->vc_color = (vc->vc_def_color & 0x0f) | (vc->vc_color & 0xf0);
|
||||||
|
|
Loading…
Reference in New Issue