Skip to content

Commit dd4db66

Browse files
committed
Improvements in SVG renderer: added 'width' and 'height' attrs to 'svg' tag and split text into multiple lines using 'tspan' tags
1 parent fc1d854 commit dd4db66

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

src/libduc-graph/graph-svg.c

+32-16
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@ void br_svg_start(duc_graph *g)
3636
fprintf(f, "<?xml version='1.0' standalone='no'?>\n");
3737
fprintf(f, "<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' \n");
3838
fprintf(f, " 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>\n");
39-
fprintf(f, "<svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink= 'http://www.w3.org/1999/xlink'>\n");
40-
39+
fprintf(f, "<svg width='%.0fpx' height='%.0fpx'\n", g->width, g->height);
40+
fprintf(f, " xmlns='http://www.w3.org/2000/svg'\n");
41+
fprintf(f, " xmlns:xlink='http://www.w3.org/1999/xlink'>\n");
4142
fprintf(f, " <style><![CDATA[\n");
4243
fprintf(f, " text {\n");
4344
fprintf(f, " font-family: 'Arial';\n");
@@ -52,31 +53,46 @@ void br_svg_start(duc_graph *g)
5253

5354
}
5455

55-
static void print_html(const char *s, FILE *f)
56+
static void draw_text_aux(int x, const char *s, FILE *f)
5657
{
57-
while(*s) {
58-
switch(*s) {
59-
case '<': fprintf(f, "&lt;"); break;
60-
case '>': fprintf(f, "&gt;"); break;
61-
case '&': fprintf(f, "&amp;"); break;
62-
case '"': fprintf(f, "&quot;"); break;
63-
default: fputc(*s, f); break;
58+
char *p = strdup(s);
59+
assert(p);
60+
61+
double y = 0;
62+
char *l = strtok(p, "\n");
63+
64+
while(l != NULL) {
65+
fprintf(f, " <tspan x='%d' dy='%.1fem'>", x, y);
66+
while(*l) {
67+
switch(*l) {
68+
case '<': fprintf(f, "&lt;"); break;
69+
case '>': fprintf(f, "&gt;"); break;
70+
case '&': fprintf(f, "&amp;"); break;
71+
case '"': fprintf(f, "&quot;"); break;
72+
default: fputc(*l, f); break;
73+
}
74+
l++;
6475
}
65-
s++;
76+
fprintf(f, "</tspan>\n");
77+
78+
y += 1.2;
79+
l = strtok(NULL, "\n");
6680
}
81+
82+
free(p);
6783
}
6884

6985
static void br_svg_draw_text(duc_graph *g, double x, double y, double size, char *text)
7086
{
7187
struct svg_backend_data *bd = g->backend_data;
7288
FILE *f = bd->fout;
7389

74-
fprintf(f, "<text x='%.0f' y='%.0f' font-size='%.0fpt' stroke='white' stroke-width='2'>", x, y, size);
75-
print_html(text, f);
90+
fprintf(f, "<text x='%.0f' y='%.0f' font-size='%.0fpt' stroke='white' stroke-width='2'>\n", x, y, size);
91+
draw_text_aux(x, text, f);
7692
fprintf(f, "</text>\n");
77-
78-
fprintf(f, "<text x='%.0f' y='%.0f' font-size='%.0fpt' fill='black' stroke-width='2'>", x, y, size);
79-
print_html(text, f);
93+
94+
fprintf(f, "<text x='%.0f' y='%.0f' font-size='%.0fpt' fill='black' stroke-width='2'>\n", x, y, size);
95+
draw_text_aux(x, text, f);
8096
fprintf(f, "</text>\n");
8197
}
8298

0 commit comments

Comments
 (0)