| @@ -981,34 +981,12 @@ static void *export_tga(caca_canvas_t const *cv, size_t *bytes) | |||||
| return data; | return data; | ||||
| } | } | ||||
| /* Get troff color index from RGB | |||||
| * | |||||
| * We want for each component to know if it is >= 80 | |||||
| * Then we use the 3 bits to index colors list: | |||||
| * 000 -> black | |||||
| * 001 -> blue | |||||
| * ... | |||||
| * 111 -> white | |||||
| */ | |||||
| static uint8_t _rgb_to_troff_index(uint32_t color) | |||||
| { | |||||
| int i; | |||||
| uint8_t r = 0; | |||||
| for(i = 0; i < 3; i++) | |||||
| r += ((color >> (8 * i + 7)) & 1) << i; | |||||
| return r; | |||||
| } | |||||
| /* Generate troff representation of current canvas. */ | /* Generate troff representation of current canvas. */ | ||||
| static void *export_troff(caca_canvas_t const *cv, size_t *bytes) | static void *export_troff(caca_canvas_t const *cv, size_t *bytes) | ||||
| { | { | ||||
| char *data, *cur; | char *data, *cur; | ||||
| int x, y; | int x, y; | ||||
| const char * colors[8] = { "black", "blue", "green", "cyan", | |||||
| "red", "magenta", "yellow", "white" }; | |||||
| uint32_t prevfg = 0; | uint32_t prevfg = 0; | ||||
| uint32_t prevbg = 0; | uint32_t prevbg = 0; | ||||
| int started = 0; | int started = 0; | ||||
| @@ -1036,14 +1014,23 @@ static void *export_troff(caca_canvas_t const *cv, size_t *bytes) | |||||
| for(x = 0; x < cv->width; x++) | for(x = 0; x < cv->width; x++) | ||||
| { | { | ||||
| uint32_t fg = _rgb_to_troff_index(_caca_attr_to_rgb24fg(lineattr[x])); | |||||
| uint32_t bg = _rgb_to_troff_index(_caca_attr_to_rgb24bg(lineattr[x])); | |||||
| static char const * ansi2troff[16] = | |||||
| { | |||||
| /* Dark */ | |||||
| "black", "blue", "green", "cyan", | |||||
| "red", "magenta", "yellow", "white", | |||||
| /* Bright */ | |||||
| "black", "blue", "green", "cyan", | |||||
| "red", "magenta", "yellow", "white", | |||||
| }; | |||||
| uint8_t fg = caca_attr_to_ansi_fg(lineattr[x]); | |||||
| uint8_t bg = caca_attr_to_ansi_bg(lineattr[x]); | |||||
| uint32_t ch = linechar[x]; | uint32_t ch = linechar[x]; | ||||
| if(fg != prevfg || !started) | if(fg != prevfg || !started) | ||||
| cur += sprintf(cur, "\\m[%s]", colors[fg]); | |||||
| cur += sprintf(cur, "\\m[%s]", ansi2troff[fg]); | |||||
| if(bg != prevbg || !started) | if(bg != prevbg || !started) | ||||
| cur += sprintf(cur, "\\M[%s]", colors[bg]); | |||||
| cur += sprintf(cur, "\\M[%s]", ansi2troff[bg]); | |||||
| if(lineattr[x] & CACA_BOLD) | if(lineattr[x] & CACA_BOLD) | ||||
| cur += sprintf(cur, "\\fB"); | cur += sprintf(cur, "\\fB"); | ||||
| if(lineattr[x] & CACA_ITALICS) | if(lineattr[x] & CACA_ITALICS) | ||||