Browse Source

Generate colour fonts with caca2tlf.

pull/1/head
Sam Hocevar sam 15 years ago
parent
commit
a97ae774e9
1 changed files with 57 additions and 10 deletions
  1. +57
    -10
      tools/caca2tlf.c

+ 57
- 10
tools/caca2tlf.c View File

@@ -27,7 +27,7 @@
#include <caca.h> #include <caca.h>


enum mode { GRAY, HALFBLOCKS, QUARTERBLOCKS } mode; enum mode { GRAY, HALFBLOCKS, QUARTERBLOCKS } mode;
enum charset { ASCII, UTF8 } charset;
enum charset { SPACES, ASCII, UTF8 } charset;


static void list_fonts(void); static void list_fonts(void);
static void add_char(unsigned long int); static void add_char(unsigned long int);
@@ -46,7 +46,7 @@ int main(int argc, char *argv[])
if(argc < 2) if(argc < 2)
{ {
fprintf(stderr, fprintf(stderr,
"Usage: %s [--half|--quarter] [--ascii|--utf8] <font>\n",
"Usage: %s [--half|--quarter] [--spaces|--ascii|--utf8] <font>\n",
argv[0]); argv[0]);
list_fonts(); list_fonts();
return -1; return -1;
@@ -70,7 +70,13 @@ int main(int argc, char *argv[])
mode = GRAY; 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 "; flag2 = "--ascii ";
charset = ASCII; charset = ASCII;
@@ -190,6 +196,10 @@ static void add_char(unsigned long int ch)
{ {
static char const * chars[][16] = static char const * chars[][16] =
{ {
{ "_", "_", "_", "_", " " },
{ " ", "_", "_", "_" },
{ " ", "_", "_", "_", "_", "_", "_", "_",
"_", "_", "_", "_", "_", "_", "_", "_" },
{ "#", "$", ":", ".", " " }, { "#", "$", ":", ".", " " },
{ " ", "\"", "m", "#" }, { " ", "\"", "m", "#" },
{ " ", "`", "'", "\"", ",", "[", "/", "P", { " ", "`", "'", "\"", ",", "[", "/", "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; char const **str;
void *buf; void *buf;
size_t len; size_t len;
unsigned int x, y, myw, mygw; unsigned int x, y, myw, mygw;
int off = 0;
int coff = 0, aoff = 0;
int full = caca_utf32_is_fullwidth(ch); int full = caca_utf32_is_fullwidth(ch);


caca_set_canvas_size(onechar, full ? 2 : 1, 1); caca_set_canvas_size(onechar, full ? 2 : 1, 1);
@@ -219,37 +241,60 @@ static void add_char(unsigned long int ch)


switch(charset) switch(charset)
{ {
case SPACES:
coff = 0; aoff = 0;
break;
case ASCII: case ASCII:
off = 0;
coff = 3; aoff = 1;
break; break;
case UTF8: case UTF8:
off = 3;
coff = 6; aoff = 1;
break; break;
} }


switch(mode) switch(mode)
{ {
case GRAY: case GRAY:
str = chars[off];
str = chars[coff];
for(y = 0; y < h; y++) for(y = 0; y < h; y++)
for(x = 0; x < myw; x++) for(x = 0; x < myw; x++)
{ {
uint8_t c = image[4 * (x + y * iw) + 2]; 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]); caca_put_str(out, x, y, str[0]);
}
else if(c >= 0x80) else if(c >= 0x80)
{
caca_set_color_ansi(out, fgs[aoff][2], bgs[aoff][2]);
caca_put_str(out, x, y, str[1]); caca_put_str(out, x, y, str[1]);
}
else if(c >= 0x40) else if(c >= 0x40)
{
caca_set_color_ansi(out, fgs[aoff][1], bgs[aoff][1]);
caca_put_str(out, x, y, str[2]); caca_put_str(out, x, y, str[2]);
}
else if(c >= 0x20) else if(c >= 0x20)
{
caca_set_color_ansi(out, fgs[aoff][1], bgs[aoff][1]);
caca_put_str(out, x, y, str[3]); caca_put_str(out, x, y, str[3]);
}
else else
{
caca_set_color_ansi(out, fgs[aoff][0], bgs[aoff][0]);
caca_put_str(out, x, y, str[4]); caca_put_str(out, x, y, str[4]);
}
} }
break; break;
case HALFBLOCKS: case HALFBLOCKS:
str = chars[off + 1];
str = chars[coff + 1];
for(y = 0; y < gh; y++) for(y = 0; y < gh; y++)
for(x = 0; x < mygw; x++) for(x = 0; x < mygw; x++)
{ {
@@ -260,7 +305,7 @@ static void add_char(unsigned long int ch)
} }
break; break;
case QUARTERBLOCKS: case QUARTERBLOCKS:
str = chars[off + 2];
str = chars[coff + 2];
for(y = 0; y < gh; y++) for(y = 0; y < gh; y++)
for(x = 0; x < mygw; x++) for(x = 0; x < mygw; x++)
{ {
@@ -275,6 +320,8 @@ static void add_char(unsigned long int ch)
break; break;
} }


caca_set_color_ansi(out, CACA_DEFAULT, CACA_DEFAULT);

if(ch == ' ' || ch == 0xa0) if(ch == ' ' || ch == 0xa0)
{ {
caca_draw_line(out, mygw - 1, 0, mygw - 1, gh - 1, '$'); caca_draw_line(out, mygw - 1, 0, mygw - 1, gh - 1, '$');


Loading…
Cancel
Save