|
|
@@ -10,7 +10,7 @@ |
|
|
|
*/ |
|
|
|
|
|
|
|
/** \file export.c |
|
|
|
* \version \$Id: export_irc.c 384 2006-03-13 18:07:35Z sam $ |
|
|
|
* \version \$Id$ |
|
|
|
* \author Sam Hocevar <sam@zoy.org> |
|
|
|
* \author Jean-Yves Lamoureux <jylam@lnxscene.org> |
|
|
|
* \brief Export function |
|
|
@@ -29,16 +29,16 @@ |
|
|
|
#include "cucul.h" |
|
|
|
#include "cucul_internals.h" |
|
|
|
|
|
|
|
static char const *svg_header = |
|
|
|
static char const svg_header[] = |
|
|
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" |
|
|
|
"<svg width=\"%d\" height=\"%d\" viewBox=\"0 0 %d %d\"" |
|
|
|
" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" " |
|
|
|
"xml:space=\"preserve\" version=\"1.1\" baseProfile=\"full\">\n" |
|
|
|
" xmlns=\"http://www.w3.org/2000/svg\"" |
|
|
|
" xmlns:xlink=\"http://www.w3.org/1999/xlink\"" |
|
|
|
" xml:space=\"preserve\" version=\"1.1\" baseProfile=\"full\">\n" |
|
|
|
" <defs>\n" |
|
|
|
" <style type=\"text/css\">\n" |
|
|
|
" <![CDATA[\n"; |
|
|
|
|
|
|
|
|
|
|
|
/** \brief Generate SVG representation of current image. |
|
|
|
* |
|
|
|
* This function generates and returns a SVG representation of |
|
|
@@ -46,10 +46,6 @@ static char const *svg_header = |
|
|
|
*/ |
|
|
|
void _cucul_get_svg(cucul_t *qq, struct cucul_buffer *ex) |
|
|
|
{ |
|
|
|
char *cur; |
|
|
|
int x, y; |
|
|
|
|
|
|
|
|
|
|
|
static int const palette[] = |
|
|
|
{ |
|
|
|
0x000000, 0x000088, 0x008800, 0x008888, |
|
|
@@ -58,6 +54,9 @@ void _cucul_get_svg(cucul_t *qq, struct cucul_buffer *ex) |
|
|
|
0xff4444, 0xff44ff, 0xffff44, 0xffffff, |
|
|
|
}; |
|
|
|
|
|
|
|
char *cur; |
|
|
|
unsigned int x, y; |
|
|
|
|
|
|
|
/* 200 is arbitrary but should be ok */ |
|
|
|
ex->size = strlen(svg_header) + (qq->width * qq->height * 200); |
|
|
|
ex->buffer = malloc(ex->size); |
|
|
@@ -65,52 +64,57 @@ void _cucul_get_svg(cucul_t *qq, struct cucul_buffer *ex) |
|
|
|
cur = ex->buffer; |
|
|
|
|
|
|
|
/* Header */ |
|
|
|
cur += sprintf(cur, svg_header, qq->width*6, qq->height*10, qq->width*6, qq->height*10); |
|
|
|
cur += sprintf(cur, svg_header, qq->width * 6, qq->height * 10, |
|
|
|
qq->width * 6, qq->height * 10); |
|
|
|
|
|
|
|
/* Precalc of colors in CSS style */ |
|
|
|
for(x = 0; x < 0x100; x++) |
|
|
|
{ |
|
|
|
cur += sprintf(cur, ".b%02x {fill:#%06X}\n", |
|
|
|
x, |
|
|
|
palette[x >> 4 ]); |
|
|
|
|
|
|
|
cur += sprintf(cur, ".f%02x {fill:#%06X}\n", |
|
|
|
x, |
|
|
|
palette[x & 0xf ]); |
|
|
|
cur += sprintf(cur, ".b%02x {fill:#%06X}\n", x, palette[x >> 4]); |
|
|
|
cur += sprintf(cur, ".f%02x {fill:#%06X}\n", x, palette[x & 0xf]); |
|
|
|
} |
|
|
|
|
|
|
|
cur += sprintf(cur, "]]>\n"); |
|
|
|
cur += sprintf(cur, "</style>\n"); |
|
|
|
cur += sprintf(cur, "</defs>\n"); |
|
|
|
cur += sprintf(cur, "<g id=\"mainlayer\" font-size=\"12\">\n"); |
|
|
|
|
|
|
|
cur += sprintf(cur, " </style>\n"); |
|
|
|
cur += sprintf(cur, " </defs>\n"); |
|
|
|
cur += sprintf(cur, " <g id=\"mainlayer\" font-size=\"12\">\n"); |
|
|
|
|
|
|
|
/* Background */ |
|
|
|
for(y=0; y<(int)(qq->height);y++) { |
|
|
|
uint8_t *lineattr = qq->attr + y * qq->width; |
|
|
|
for(x = 0; x < (int)qq->width; x++) { |
|
|
|
cur += sprintf(cur, "<rect class=\"b%02x\" x=\"%d\" y=\"%d\" width=\"6\" height=\"10\"/>\n", |
|
|
|
lineattr[x], |
|
|
|
x*6, |
|
|
|
y*10); |
|
|
|
} |
|
|
|
for(y = 0; y < qq->height; y++) |
|
|
|
{ |
|
|
|
uint8_t *lineattr = qq->attr + y * qq->width; |
|
|
|
|
|
|
|
for(x = 0; x < qq->width; x++) |
|
|
|
{ |
|
|
|
cur += sprintf(cur, "<rect class=\"b%02x\" x=\"%d\" y=\"%d\"" |
|
|
|
" width=\"6\" height=\"10\"/>\n", |
|
|
|
*lineattr++, x * 6, y * 10); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* Text */ |
|
|
|
for(y=0; y<(int)(qq->height);y++) { |
|
|
|
uint8_t *lineattr = qq->attr + y * qq->width; |
|
|
|
uint32_t *linechar = qq->chars + y * qq->width; |
|
|
|
for(x = 0; x < (int)qq->width; x++) { |
|
|
|
cur += sprintf(cur, "<text class=\"f%02x\" x=\"%d\" y=\"%d\">%c</text>\n", |
|
|
|
lineattr[x], |
|
|
|
x*6, |
|
|
|
(y*10)+10, |
|
|
|
linechar[x]); |
|
|
|
} |
|
|
|
for(y = 0; y < qq->height; y++) |
|
|
|
{ |
|
|
|
uint8_t *lineattr = qq->attr + y * qq->width; |
|
|
|
uint32_t *linechar = qq->chars + y * qq->width; |
|
|
|
|
|
|
|
for(x = 0; x < qq->width; x++) |
|
|
|
{ |
|
|
|
uint32_t c = *linechar++; |
|
|
|
|
|
|
|
cur += sprintf(cur, "<text class=\"f%02x\" x=\"%d\" y=\"%d\">", |
|
|
|
*lineattr++, x * 6, (y * 10) + 10); |
|
|
|
if(c < 0x00000020) |
|
|
|
cur += sprintf(cur, "?"); |
|
|
|
else if(c < 0x00000080) |
|
|
|
cur += sprintf(cur, "%c", c); |
|
|
|
else |
|
|
|
cur += sprintf(cur, "?"); /* FIXME: SVG supports UTF-8 */ |
|
|
|
cur += sprintf(cur, "</text>\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
cur += sprintf(cur, "</g>\n"); |
|
|
|
cur += sprintf(cur, " </g>\n"); |
|
|
|
cur += sprintf(cur, "</svg>\n"); |
|
|
|
|
|
|
|
/* Crop to really used size */ |
|
|
|