|
|
@@ -1863,57 +1863,83 @@ char* caca_get_html(void) |
|
|
|
* This function generates and returns the HTML3 representation of |
|
|
|
* the current image. It is way bigger than caca_get_html(), but |
|
|
|
* permits viewing in old browsers (or limited ones such as links) |
|
|
|
* |
|
|
|
* Won't work under gecko (mozilla rendering engine) unless you set |
|
|
|
* a correct header. |
|
|
|
*/ |
|
|
|
char* caca_get_html3(void) |
|
|
|
{ |
|
|
|
char *buffer, *cur; |
|
|
|
unsigned int x, y, len; |
|
|
|
char *buffer, *cur; |
|
|
|
unsigned int x,y; |
|
|
|
|
|
|
|
/* 13000 -> css palette |
|
|
|
* 40 -> max size used for a pixel (plus 10, never know)*/ |
|
|
|
/* FIXME: Check this value */ |
|
|
|
buffer = malloc((13000 + ((_caca_width*_caca_height) * 40)) * sizeof(char)); |
|
|
|
cur = buffer; |
|
|
|
/* 13000 -> css palette |
|
|
|
40 -> max size used for a pixel (plus 10, never know)*/ |
|
|
|
|
|
|
|
cur += sprintf(cur, "<div cellpadding='0' cellspacing='0' style='%s'>\n", |
|
|
|
"font-family: monospace, fixed; font-weight: bold;"); |
|
|
|
buffer = malloc((13000 + ((_caca_width*_caca_height)*40))*sizeof(char)); |
|
|
|
cur = buffer; |
|
|
|
|
|
|
|
for(y = 0; y < _caca_height; y++) |
|
|
|
{ |
|
|
|
for(x = 0; x < _caca_width; x += len) |
|
|
|
{ |
|
|
|
uint8_t *cur_attr = cache_attr + y * _caca_width; |
|
|
|
uint8_t *cur_char = cache_char + y * _caca_width; |
|
|
|
/* Table */ |
|
|
|
cur += sprintf(cur, "<table cols='%d' cellpadding='0' cellspacing='0'>\n", caca_get_height()); |
|
|
|
|
|
|
|
cur += sprintf(cur, |
|
|
|
"<span style=\"color: #%03X; background-color: #%03X\">", |
|
|
|
html_palette[cur_attr[x] & 0x0f], |
|
|
|
html_palette[cur_attr[x] >> 4]); |
|
|
|
|
|
|
|
for(len = 0; |
|
|
|
x + len < _caca_width && cur_attr[x + len] == cur_attr[x]; |
|
|
|
len++) |
|
|
|
{ |
|
|
|
if(cur_char[x + len] == ' ') |
|
|
|
cur += sprintf(cur, " "); |
|
|
|
else |
|
|
|
cur += sprintf(cur, "%c", cur_char[x + len]); |
|
|
|
} |
|
|
|
cur += sprintf(cur, "</span>"); |
|
|
|
} |
|
|
|
/* New line */ |
|
|
|
cur += sprintf(cur, "<br />\n"); |
|
|
|
for(y=0;y<_caca_height;y++) |
|
|
|
{ |
|
|
|
cur += sprintf(cur, "<tr>"); |
|
|
|
|
|
|
|
for(x=0;x<_caca_width;x++) |
|
|
|
{ |
|
|
|
int len; |
|
|
|
int i; |
|
|
|
uint8_t *attr = cache_attr + x + y * _caca_width; |
|
|
|
|
|
|
|
/* Use colspan option to factorize cells with same attributes |
|
|
|
(see below) */ |
|
|
|
len=1; |
|
|
|
while(x + len < _caca_width |
|
|
|
&& (attr[len]>>4) == (attr[0]>>4) && |
|
|
|
(attr[len]&0x0f) == (attr[0]&0x0f)) |
|
|
|
len++; |
|
|
|
|
|
|
|
if(len==1) |
|
|
|
{ |
|
|
|
cur += sprintf(cur, |
|
|
|
"<td bgcolor=#%03X ><font color=#%03X>%c</font></td>", |
|
|
|
html_palette[cache_attr[x+y*caca_get_width()]>>4], |
|
|
|
html_palette[cache_attr[x+y*caca_get_width()]&0x0f], |
|
|
|
cache_char[x+y*caca_get_width()]); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
cur += sprintf(cur, |
|
|
|
"<td bgcolor=#%03X colspan=%d><font color=#%03X>", |
|
|
|
html_palette[cache_attr[x+y*caca_get_width()]>> 4], |
|
|
|
len+1, |
|
|
|
html_palette[cache_attr[x+y*caca_get_width()]&0x0f]); |
|
|
|
|
|
|
|
for(i=0;i<len;i++) |
|
|
|
{ |
|
|
|
if(cache_char[x+y*caca_get_width()]!=' ') |
|
|
|
cur += sprintf(cur, "%c", cache_char[x+y*caca_get_width()]); |
|
|
|
else |
|
|
|
cur += sprintf(cur, " "); |
|
|
|
x++; |
|
|
|
} |
|
|
|
cur += sprintf(cur, "</font></td>"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
cur += sprintf(cur, "</tr>\n"); |
|
|
|
} |
|
|
|
|
|
|
|
cur += sprintf(cur, "</div>\n"); |
|
|
|
/* Footer */ |
|
|
|
cur += sprintf(cur, "</table>\n"); |
|
|
|
|
|
|
|
/* Crop to really used size */ |
|
|
|
buffer = realloc(buffer, (strlen(buffer) + 1) * sizeof(char)); |
|
|
|
/* Crop to really used size */ |
|
|
|
buffer = realloc(buffer, (strlen(buffer)+1) * sizeof(char)); |
|
|
|
|
|
|
|
return buffer; |
|
|
|
return buffer; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static int const irc_palette[] = |
|
|
|
{ |
|
|
|
/* Dark */ |
|
|
@@ -1937,6 +1963,7 @@ char* caca_get_irc(void) |
|
|
|
unsigned int x, y; |
|
|
|
/* 15 bytes assumed for max length per pixel */ |
|
|
|
buffer = malloc(((_caca_width*_caca_height*15)+1)*sizeof(char)); |
|
|
|
|
|
|
|
sprintf(buffer, "%%O"); |
|
|
|
|
|
|
|
for(y = 0; y < _caca_height; y++) |
|
|
@@ -1945,18 +1972,18 @@ char* caca_get_irc(void) |
|
|
|
{ |
|
|
|
if(cache_char[x+y*caca_get_width()] == ' ') |
|
|
|
{ |
|
|
|
sprintf(buffer, |
|
|
|
"%s%%C%d,%d%c", buffer, |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>>4], |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>>4], |
|
|
|
'#'); |
|
|
|
sprintf(buffer, |
|
|
|
"%s%%C%d,%d%c", buffer, |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>>4], |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>>4], |
|
|
|
'#'); |
|
|
|
} |
|
|
|
else if(cache_char[x+y*caca_get_width()] == '%') |
|
|
|
{ |
|
|
|
sprintf(buffer, |
|
|
|
"%s%%C%d,%d%%%%", buffer, |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]&0x0f], |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>> 4]); |
|
|
|
sprintf(buffer, |
|
|
|
"%s%%C%d,%d%%%%", buffer, |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]&0x0f], |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>> 4]); |
|
|
|
} |
|
|
|
else if(cache_char[x+y*caca_get_width()]>='0' && cache_char[x+y*caca_get_width()]<='9') |
|
|
|
{ |
|
|
@@ -1966,21 +1993,21 @@ char* caca_get_irc(void) |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>> 4], |
|
|
|
cache_char[x+y*caca_get_width()]); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
sprintf(buffer, |
|
|
|
"%s%%C%d,%d%c", buffer, |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]&0x0f], |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>> 4], |
|
|
|
cache_char[x+y*caca_get_width()]); |
|
|
|
else |
|
|
|
{ |
|
|
|
sprintf(buffer, |
|
|
|
"%s%%C%d,%d%c", buffer, |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]&0x0f], |
|
|
|
irc_palette[cache_attr[x+y*caca_get_width()]>> 4], |
|
|
|
cache_char[x+y*caca_get_width()]); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
sprintf(buffer, "%s\n", buffer); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
/* Crop to really used size */ |
|
|
|
buffer = realloc(buffer, (strlen(buffer)+1) * sizeof(char)); |
|
|
|
|
|
|
|
|
|
|
|
return buffer; |
|
|
|
} |