| @@ -29,24 +29,64 @@ static const uint16_t ansitab[16] = | |||||
| 0xf444, 0xf44f, 0xf4f4, 0xf4ff, 0xff44, 0xff4f, 0xfff4, 0xffff, | 0xf444, 0xf44f, 0xf4f4, 0xf4ff, 0xff44, 0xff4f, 0xfff4, 0xffff, | ||||
| }; | }; | ||||
| /* FIXME: could this be inlined? */ | |||||
| static uint8_t nearest_ansi(uint16_t argb16, uint8_t def) | |||||
| { | |||||
| unsigned int i, best, dist; | |||||
| if(argb16 < CUCUL_COLOR_DEFAULT) | |||||
| return argb16; | |||||
| if(argb16 == CUCUL_COLOR_DEFAULT || argb16 == CUCUL_COLOR_TRANSPARENT) | |||||
| return def; | |||||
| if(argb16 < 0x5fff) /* too transparent, return default colour */ | |||||
| return def; | |||||
| dist = 0xffff; | |||||
| for(i = 0; i < 16; i++) | |||||
| { | |||||
| unsigned int d = 0; | |||||
| int a, b; | |||||
| a = (ansitab[i] >> 8) & 0xf; | |||||
| b = (argb16 >> 8) & 0xf; | |||||
| d += (a - b) * (a - b); | |||||
| a = (ansitab[i] >> 4) & 0xf; | |||||
| b = (argb16 >> 4) & 0xf; | |||||
| d += (a - b) * (a - b); | |||||
| a = ansitab[i] & 0xf; | |||||
| b = argb16 & 0xf; | |||||
| d += (a - b) * (a - b); | |||||
| if(d < dist) | |||||
| { | |||||
| dist = d; | |||||
| best = i; | |||||
| } | |||||
| } | |||||
| return best; | |||||
| } | |||||
| uint8_t _cucul_argb32_to_ansi8(uint32_t c) | uint8_t _cucul_argb32_to_ansi8(uint32_t c) | ||||
| { | { | ||||
| /* FIXME: we need nearest colour handling for non-ANSI */ | |||||
| return (c & 0x0000000f) | ((c & 0x000f0000) >> 12); | |||||
| uint16_t fg = c & 0xffff; | |||||
| uint16_t bg = c >> 16; | |||||
| return nearest_ansi(fg, CUCUL_COLOR_LIGHTGRAY) | |||||
| | (nearest_ansi(bg, CUCUL_COLOR_BLACK) << 4); | |||||
| } | } | ||||
| uint8_t _cucul_argb32_to_ansi4fg(uint32_t c) | uint8_t _cucul_argb32_to_ansi4fg(uint32_t c) | ||||
| { | { | ||||
| /* FIXME: we need nearest colour handling for non-ANSI */ | |||||
| return c & 0x0000000f; | |||||
| return nearest_ansi(c & 0xffff, CUCUL_COLOR_LIGHTGRAY); | |||||
| } | } | ||||
| uint8_t _cucul_argb32_to_ansi4bg(uint32_t c) | uint8_t _cucul_argb32_to_ansi4bg(uint32_t c) | ||||
| { | { | ||||
| /* FIXME: we need nearest colour handling for non-ANSI */ | |||||
| return (c & 0x000f0000) >> 16; | |||||
| return nearest_ansi(c >> 16, CUCUL_COLOR_BLACK); | |||||
| } | } | ||||
| void _cucul_argb32_to_argb4(uint32_t c, uint8_t argb[8]) | void _cucul_argb32_to_argb4(uint32_t c, uint8_t argb[8]) | ||||
| @@ -54,11 +94,19 @@ void _cucul_argb32_to_argb4(uint32_t c, uint8_t argb[8]) | |||||
| uint16_t fg = c & 0xffff; | uint16_t fg = c & 0xffff; | ||||
| uint16_t bg = c >> 16; | uint16_t bg = c >> 16; | ||||
| if(fg < 0x0016) | |||||
| if(fg < CUCUL_COLOR_DEFAULT) | |||||
| fg = ansitab[fg]; | fg = ansitab[fg]; | ||||
| else if(fg == CUCUL_COLOR_DEFAULT) | |||||
| fg = ansitab[CUCUL_COLOR_LIGHTGRAY]; | |||||
| else if(fg == CUCUL_COLOR_TRANSPARENT) | |||||
| fg = 0x0fff; | |||||
| if(bg < 0x0016) | |||||
| if(bg < CUCUL_COLOR_DEFAULT) | |||||
| bg = ansitab[bg]; | bg = ansitab[bg]; | ||||
| else if(bg == CUCUL_COLOR_DEFAULT) | |||||
| bg = ansitab[CUCUL_COLOR_BLACK]; | |||||
| else if(bg == CUCUL_COLOR_TRANSPARENT) | |||||
| bg = 0x0fff; | |||||
| argb[0] = bg >> 12; | argb[0] = bg >> 12; | ||||
| argb[1] = (bg >> 8) & 0xf; | argb[1] = (bg >> 8) & 0xf; | ||||