From a97ae774e9c62bc07a75957c16d28a5df19f31c9 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Wed, 27 Jan 2010 00:47:58 +0000 Subject: [PATCH] Generate colour fonts with caca2tlf. --- tools/caca2tlf.c | 67 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 57 insertions(+), 10 deletions(-) diff --git a/tools/caca2tlf.c b/tools/caca2tlf.c index fd8468b..b03e0cc 100644 --- a/tools/caca2tlf.c +++ b/tools/caca2tlf.c @@ -27,7 +27,7 @@ #include enum mode { GRAY, HALFBLOCKS, QUARTERBLOCKS } mode; -enum charset { ASCII, UTF8 } charset; +enum charset { SPACES, ASCII, UTF8 } charset; static void list_fonts(void); static void add_char(unsigned long int); @@ -46,7 +46,7 @@ int main(int argc, char *argv[]) if(argc < 2) { fprintf(stderr, - "Usage: %s [--half|--quarter] [--ascii|--utf8] \n", + "Usage: %s [--half|--quarter] [--spaces|--ascii|--utf8] \n", argv[0]); list_fonts(); return -1; @@ -70,7 +70,13 @@ int main(int argc, char *argv[]) mode = GRAY; } - if((!strcmp(argv[1], "--ascii") || !strcmp(argv[1], "-a")) && argc > 2) + if((!strcmp(argv[1], "--spaces") || !strcmp(argv[1], "-s")) && argc > 2) + { + flag2 = "--spaces "; + charset = SPACES; + argv++; argc--; + } + else if((!strcmp(argv[1], "--ascii") || !strcmp(argv[1], "-a")) && argc > 2) { flag2 = "--ascii "; charset = ASCII; @@ -190,6 +196,10 @@ static void add_char(unsigned long int ch) { static char const * chars[][16] = { + { "_", "_", "_", "_", " " }, + { " ", "_", "_", "_" }, + { " ", "_", "_", "_", "_", "_", "_", "_", + "_", "_", "_", "_", "_", "_", "_", "_" }, { "#", "$", ":", ".", " " }, { " ", "\"", "m", "#" }, { " ", "`", "'", "\"", ",", "[", "/", "P", @@ -200,11 +210,23 @@ static void add_char(unsigned long int ch) "▗", "▚", "▐", "▜", "▄", "▙", "▟", "█" } }; + static uint8_t fgs[][4] = + { + { CACA_DEFAULT, CACA_DARKGRAY, CACA_LIGHTGRAY, CACA_WHITE }, + { CACA_DEFAULT, CACA_DEFAULT, CACA_DEFAULT, CACA_DEFAULT }, + }; + + static uint8_t bgs[][4] = + { + { CACA_DEFAULT, CACA_DARKGRAY, CACA_LIGHTGRAY, CACA_WHITE }, + { CACA_DEFAULT, CACA_DEFAULT, CACA_DEFAULT, CACA_DEFAULT }, + }; + char const **str; void *buf; size_t len; unsigned int x, y, myw, mygw; - int off = 0; + int coff = 0, aoff = 0; int full = caca_utf32_is_fullwidth(ch); caca_set_canvas_size(onechar, full ? 2 : 1, 1); @@ -219,37 +241,60 @@ static void add_char(unsigned long int ch) switch(charset) { + case SPACES: + coff = 0; aoff = 0; + break; case ASCII: - off = 0; + coff = 3; aoff = 1; break; case UTF8: - off = 3; + coff = 6; aoff = 1; break; } switch(mode) { case GRAY: - str = chars[off]; + str = chars[coff]; for(y = 0; y < h; y++) for(x = 0; x < myw; x++) { uint8_t c = image[4 * (x + y * iw) + 2]; - if(c >= 0xa0) + if(c >= 0xc0) + { + caca_set_color_ansi(out, fgs[aoff][3], bgs[aoff][3]); caca_put_str(out, x, y, str[0]); + } + else if(c >= 0x90) + { + caca_set_color_ansi(out, fgs[aoff][2], bgs[aoff][2]); + caca_put_str(out, x, y, str[0]); + } else if(c >= 0x80) + { + caca_set_color_ansi(out, fgs[aoff][2], bgs[aoff][2]); caca_put_str(out, x, y, str[1]); + } else if(c >= 0x40) + { + caca_set_color_ansi(out, fgs[aoff][1], bgs[aoff][1]); caca_put_str(out, x, y, str[2]); + } else if(c >= 0x20) + { + caca_set_color_ansi(out, fgs[aoff][1], bgs[aoff][1]); caca_put_str(out, x, y, str[3]); + } else + { + caca_set_color_ansi(out, fgs[aoff][0], bgs[aoff][0]); caca_put_str(out, x, y, str[4]); + } } break; case HALFBLOCKS: - str = chars[off + 1]; + str = chars[coff + 1]; for(y = 0; y < gh; y++) for(x = 0; x < mygw; x++) { @@ -260,7 +305,7 @@ static void add_char(unsigned long int ch) } break; case QUARTERBLOCKS: - str = chars[off + 2]; + str = chars[coff + 2]; for(y = 0; y < gh; y++) for(x = 0; x < mygw; x++) { @@ -275,6 +320,8 @@ static void add_char(unsigned long int ch) break; } + caca_set_color_ansi(out, CACA_DEFAULT, CACA_DEFAULT); + if(ch == ' ' || ch == 0xa0) { caca_draw_line(out, mygw - 1, 0, mygw - 1, gh - 1, '$');