| @@ -1801,94 +1801,61 @@ static int const html_palette[] = | |||||
| */ | */ | ||||
| char* caca_get_html(void) | char* caca_get_html(void) | ||||
| { | { | ||||
| char *buffer; | |||||
| unsigned int x,y; | |||||
| int f,b; | |||||
| /* 13000 -> css palette | |||||
| 40 -> max size used for a pixel (plus 10, never know)*/ | |||||
| buffer = malloc((13000 + ((_caca_width*_caca_height)*40))*sizeof(char)); | |||||
| /* HTML header */ | |||||
| sprintf(buffer, "<html>\n<head>\n<title>Generated by libcaca "VERSION"</title>\n"); | |||||
| /* CSS */ | |||||
| sprintf(buffer, "%s<style>\n", buffer); | |||||
| sprintf(buffer, "%s.caca { font-family: monospace, fixed; font-weight: bold; }\n", buffer); | |||||
| for(f=0;f<0x0f+1;f++) | |||||
| char *buffer, *cur; | |||||
| unsigned int x, y, len; | |||||
| /* 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; | |||||
| /* HTML header */ | |||||
| cur += sprintf(cur, "<html>\n<head>\n<title>Generated by libcaca %s</title>\n", VERSION); | |||||
| /* CSS */ | |||||
| cur += sprintf(cur, "<style>\n"); | |||||
| cur += sprintf(cur, ".caca { font-family: monospace, fixed; font-weight: bold; }"); | |||||
| for(x = 0; x < 0x100; x++) | |||||
| { | { | ||||
| for(b=0;b<0x0f+1;b++) | |||||
| { | |||||
| sprintf(buffer, | |||||
| "%s.b%x%x { color:#%03x; background-color:#%03x;}\n",buffer, | |||||
| b, f, html_palette[f], html_palette[b]); | |||||
| } | |||||
| cur += sprintf(cur, ".b%02x { color:#%03x; background-color:#%03x; }\n", | |||||
| x, html_palette[x & 0xf ], html_palette[x >> 4]); | |||||
| } | } | ||||
| sprintf(buffer, "%s</style>\n</head>\n<body>\n",buffer); | |||||
| cur += sprintf(cur, "</style>\n</head>\n<body>\n"); | |||||
| /* Table */ | |||||
| sprintf(buffer, "%s<table class='caca' cols='%d' cellpadding='0' cellspacing='0'>\n", buffer,caca_get_height()); | |||||
| cur += sprintf(cur, "<div cellpadding='0' cellspacing='0' style='%s'>\n", | |||||
| "font-family: monospace, fixed; font-weight: bold;"); | |||||
| for(y=0;y<_caca_height;y++) | |||||
| for(y = 0; y < _caca_height; y++) | |||||
| { | { | ||||
| sprintf(buffer, | |||||
| "%s<tr>",buffer); | |||||
| for(x=0;x<_caca_width;x++) | |||||
| for(x = 0; x < _caca_width; x += len) | |||||
| { | { | ||||
| 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) | |||||
| { | |||||
| sprintf(buffer, | |||||
| "%s<td class=b%x%x>%c</td>",buffer, | |||||
| cache_attr[x+y*caca_get_width()]>>4, | |||||
| cache_attr[x+y*caca_get_width()]&0x0f, | |||||
| cache_char[x+y*caca_get_width()]); | |||||
| } | |||||
| else | |||||
| uint8_t *cur_attr = cache_attr + y * _caca_width; | |||||
| uint8_t *cur_char = cache_char + y * _caca_width; | |||||
| cur += sprintf(cur, "<span class='b%02x'>", cur_attr[x]); | |||||
| for(len = 0; | |||||
| x + len < _caca_width && cur_attr[x + len] == cur_attr[x]; | |||||
| len++) | |||||
| { | { | ||||
| sprintf(buffer, | |||||
| "%s<td class=b%x%x colspan=%d>",buffer, | |||||
| cache_attr[x+y*caca_get_width()]>> 4, | |||||
| cache_attr[x+y*caca_get_width()]&0x0f, | |||||
| len+1); | |||||
| for(i=0;i<len;i++) | |||||
| { | |||||
| if(cache_char[x+y*caca_get_width()]!=' ') | |||||
| sprintf(buffer, "%s%c", buffer,cache_char[x+y*caca_get_width()]); | |||||
| else | |||||
| sprintf(buffer, "%s ",buffer); | |||||
| x++; | |||||
| } | |||||
| sprintf(buffer, "%s</td>",buffer); | |||||
| if(cur_char[x + len] == ' ') | |||||
| cur += sprintf(cur, " "); | |||||
| else | |||||
| cur += sprintf(cur, "%c", cur_char[x + len]); | |||||
| } | } | ||||
| cur += sprintf(cur, "</span>"); | |||||
| } | } | ||||
| sprintf(buffer, "%s</tr>\n",buffer); | |||||
| /* New line */ | |||||
| cur += sprintf(cur, "<br />\n"); | |||||
| } | } | ||||
| /* Footer */ | |||||
| sprintf(buffer, "%s</table>\n</body>\n</html>\n",buffer); | |||||
| cur += sprintf(cur, "</div></body></html>\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; | |||||
| } | } | ||||
| /** \brief Generate HTML3 representation of current image. | /** \brief Generate HTML3 representation of current image. | ||||
| @@ -1900,52 +1867,51 @@ char* caca_get_html(void) | |||||
| */ | */ | ||||
| char* caca_get_html3(void) | char* caca_get_html3(void) | ||||
| { | { | ||||
| char *buffer, *cur; | |||||
| unsigned int x, y, len; | |||||
| char *buffer, *cur; | |||||
| unsigned int x, y, len; | |||||
| /* 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)*/ | |||||
| /* FIXME: Check this value */ | |||||
| buffer = malloc((13000 + ((_caca_width*_caca_height) * 40)) * sizeof(char)); | |||||
| cur = buffer; | |||||
| /* Table */ | |||||
| cur += sprintf(cur, "<div cellpadding='0' cellspacing='0' style='%s'>\n", | |||||
| "font-family: monospace, fixed; font-weight: bold;"); | |||||
| cur += sprintf(cur, "<div cellpadding='0' cellspacing='0' style='%s'>\n", | |||||
| "font-family: monospace, fixed; font-weight: bold;"); | |||||
| 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; | |||||
| 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>"); | |||||
| } | |||||
| cur += sprintf(cur, "<br />\n"); | |||||
| } | |||||
| /* Footer */ | |||||
| cur += sprintf(cur, "</div>\n"); | |||||
| 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; | |||||
| /* Crop to really used size */ | |||||
| buffer = realloc(buffer, (strlen(buffer) + 1) * sizeof(char)); | |||||
| cur += sprintf(cur, | |||||
| "<span style=\"color: #%03X; background-color: #%03X\">", | |||||
| html_palette[cur_attr[x] & 0x0f], | |||||
| html_palette[cur_attr[x] >> 4]); | |||||
| return buffer; | |||||
| 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"); | |||||
| } | |||||
| cur += sprintf(cur, "</div>\n"); | |||||
| /* Crop to really used size */ | |||||
| buffer = realloc(buffer, (strlen(buffer) + 1) * sizeof(char)); | |||||
| return buffer; | |||||
| } | } | ||||
| static int const irc_palette[] = | static int const irc_palette[] = | ||||