termptyesc: handle CMY/CMYK in SGR38/SGR48. Ref T746
This commit is contained in:
parent
c7c054bf0d
commit
0a0f3605e4
|
@ -531,23 +531,13 @@ error:
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
_handle_esc_csi_truecolor_rgb(Termpty *ty EINA_UNUSED, Eina_Unicode **ptr)
|
_approximate_truecolor_rgb(Termpty *ty, int r0, int g0, int b0)
|
||||||
{
|
{
|
||||||
int r0, g0, b0;
|
|
||||||
int chosen_color = COL_DEF;
|
int chosen_color = COL_DEF;
|
||||||
int c;
|
int c;
|
||||||
int distance_min = INT_MAX;
|
int distance_min = INT_MAX;
|
||||||
Evas_Object *textgrid;
|
Evas_Object *textgrid;
|
||||||
|
|
||||||
r0 = _csi_truecolor_arg_get(ptr);
|
|
||||||
if (*ptr && *(*ptr-1) == ':') /* skip color space id */
|
|
||||||
r0 = _csi_truecolor_arg_get(ptr);
|
|
||||||
g0 = _csi_truecolor_arg_get(ptr);
|
|
||||||
b0 = _csi_truecolor_arg_get(ptr);
|
|
||||||
|
|
||||||
if ((r0 < 0) || (g0 < 0) || (b0 < 0))
|
|
||||||
return COL_DEF;
|
|
||||||
|
|
||||||
DBG("approximating r:%d g:%d b:%d", r0, g0, b0);
|
DBG("approximating r:%d g:%d b:%d", r0, g0, b0);
|
||||||
|
|
||||||
textgrid = termio_textgrid_get(ty->obj);
|
textgrid = termio_textgrid_get(ty->obj);
|
||||||
|
@ -579,10 +569,76 @@ _handle_esc_csi_truecolor_rgb(Termpty *ty EINA_UNUSED, Eina_Unicode **ptr)
|
||||||
chosen_color = c;
|
chosen_color = c;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return chosen_color;
|
return chosen_color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_handle_esc_csi_truecolor_rgb(Termpty *ty, Eina_Unicode **ptr)
|
||||||
|
{
|
||||||
|
int r0, g0, b0, other;
|
||||||
|
|
||||||
|
r0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
g0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
b0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
other = _csi_truecolor_arg_get(ptr);
|
||||||
|
if (other >= 0)
|
||||||
|
{
|
||||||
|
r0 = g0;
|
||||||
|
g0 = b0;
|
||||||
|
b0 = other;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((r0 < 0) || (g0 < 0) || (b0 < 0))
|
||||||
|
return COL_DEF;
|
||||||
|
|
||||||
|
return _approximate_truecolor_rgb(ty, r0, g0, b0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_handle_esc_csi_truecolor_cmy(Termpty *ty, Eina_Unicode **ptr)
|
||||||
|
{
|
||||||
|
int r0, g0, b0, c0, m0, y0;
|
||||||
|
|
||||||
|
/* Considering CMY stored as percents */
|
||||||
|
c0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
m0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
y0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
|
||||||
|
if ((c0 < 0) || (m0 < 0) || (y0 < 0))
|
||||||
|
return COL_DEF;
|
||||||
|
|
||||||
|
r0 = 255 - ((c0 * 255) / 100);
|
||||||
|
g0 = 255 - ((m0 * 255) / 100);
|
||||||
|
b0 = 255 - ((y0 * 255) / 100);
|
||||||
|
|
||||||
|
return _approximate_truecolor_rgb(ty, r0, g0, b0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
_handle_esc_csi_truecolor_cmyk(Termpty *ty, Eina_Unicode **ptr)
|
||||||
|
{
|
||||||
|
int r0, g0, b0, c0, m0, y0, k0;
|
||||||
|
|
||||||
|
/* Considering CMYK stored as percents */
|
||||||
|
c0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
m0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
y0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
k0 = _csi_truecolor_arg_get(ptr);
|
||||||
|
|
||||||
|
if ((c0 < 0) || (m0 < 0) || (y0 < 0) || (k0 < 0))
|
||||||
|
return COL_DEF;
|
||||||
|
|
||||||
|
c0 = c0 * (100 - k0) + k0;
|
||||||
|
m0 = m0 * (100 - k0) + k0;
|
||||||
|
y0 = y0 * (100 - k0) + k0;
|
||||||
|
|
||||||
|
r0 = 255 - ((c0 * 255) / 100);
|
||||||
|
g0 = 255 - ((m0 * 255) / 100);
|
||||||
|
b0 = 255 - ((y0 * 255) / 100);
|
||||||
|
|
||||||
|
return _approximate_truecolor_rgb(ty, r0, g0, b0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_handle_esc_csi_color_set(Termpty *ty, Eina_Unicode **ptr)
|
_handle_esc_csi_color_set(Termpty *ty, Eina_Unicode **ptr)
|
||||||
{
|
{
|
||||||
|
@ -689,14 +745,22 @@ _handle_esc_csi_color_set(Termpty *ty, Eina_Unicode **ptr)
|
||||||
ty->termstate.att.fg256 = 1;
|
ty->termstate.att.fg256 = 1;
|
||||||
ty->termstate.att.fg =
|
ty->termstate.att.fg =
|
||||||
_handle_esc_csi_truecolor_rgb(ty, &b);
|
_handle_esc_csi_truecolor_rgb(ty, &b);
|
||||||
DBG("truecolor fg: approximation got color %d",
|
DBG("truecolor RGB fg: approximation got color %d",
|
||||||
ty->termstate.att.fg);
|
ty->termstate.att.fg);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
WRN("TODO: support colors in the Cyan-Magenta-Yellow colorspace");
|
ty->termstate.att.fg256 = 1;
|
||||||
|
ty->termstate.att.fg =
|
||||||
|
_handle_esc_csi_truecolor_cmy(ty, &b);
|
||||||
|
DBG("truecolor CMY fg: approximation got color %d",
|
||||||
|
ty->termstate.att.fg);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
WRN("TODO: support colors in the Cyan-Magenta-Yellow-Black colorspace");
|
ty->termstate.att.fg256 = 1;
|
||||||
|
ty->termstate.att.fg =
|
||||||
|
_handle_esc_csi_truecolor_cmyk(ty, &b);
|
||||||
|
DBG("truecolor CMYK fg: approximation got color %d",
|
||||||
|
ty->termstate.att.fg);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
// then get next arg - should be color index 0-255
|
// then get next arg - should be color index 0-255
|
||||||
|
@ -744,14 +808,22 @@ _handle_esc_csi_color_set(Termpty *ty, Eina_Unicode **ptr)
|
||||||
ty->termstate.att.bg256 = 1;
|
ty->termstate.att.bg256 = 1;
|
||||||
ty->termstate.att.bg =
|
ty->termstate.att.bg =
|
||||||
_handle_esc_csi_truecolor_rgb(ty, &b);
|
_handle_esc_csi_truecolor_rgb(ty, &b);
|
||||||
DBG("truecolor bg: approximation got color %d",
|
DBG("truecolor RGB bg: approximation got color %d",
|
||||||
ty->termstate.att.bg);
|
ty->termstate.att.bg);
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
WRN("TODO: support colors in the Cyan-Magenta-Yellow colorspace");
|
ty->termstate.att.bg256 = 1;
|
||||||
|
ty->termstate.att.bg =
|
||||||
|
_handle_esc_csi_truecolor_cmy(ty, &b);
|
||||||
|
DBG("truecolor CMY bg: approximation got color %d",
|
||||||
|
ty->termstate.att.bg);
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
WRN("TODO: support colors in the Cyan-Magenta-Yellow-Black colorspace");
|
ty->termstate.att.bg256 = 1;
|
||||||
|
ty->termstate.att.bg =
|
||||||
|
_handle_esc_csi_truecolor_cmyk(ty, &b);
|
||||||
|
DBG("truecolor CMYK bg: approximation got color %d",
|
||||||
|
ty->termstate.att.bg);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
// then get next arg - should be color index 0-255
|
// then get next arg - should be color index 0-255
|
||||||
|
|
Loading…
Reference in New Issue