Skip to content

Commit 0258d60

Browse files
committed
use number rounding gvprintdouble() in .svg output - already used in tk and ps output
1 parent ed8be24 commit 0258d60

File tree

2 files changed

+68
-25
lines changed

2 files changed

+68
-25
lines changed

lib/gvc/gvdevice.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -427,8 +427,8 @@ void gvprintf(GVJ_t * job, const char *format, ...)
427427
* cc -DGVPRINTNUM_TEST gvprintnum.c -o gvprintnum
428428
*/
429429

430-
#define DECPLACES 2
431-
#define DECPLACES_SCALE 100
430+
#define DECPLACES 4
431+
#define DECPLACES_SCALE 10000
432432

433433
/* use macro so maxnegnum is stated just once for both double and string versions */
434434
#define val_str(n, x) static double n = x; static char n##str[] = #x;

plugin/core/gvrender_core_svg.c

Lines changed: 66 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,10 @@ static void svg_bzptarray(GVJ_t * job, pointf * A, int n)
5959
if (A[0].x <= A[n-1].x) {
6060
#endif
6161
for (i = 0; i < n; i++) {
62-
gvprintf(job, "%c%g,%g", c, A[i].x, -A[i].y);
62+
gvprintf(job, "%c", c);
63+
gvprintdouble(job, A[i].x);
64+
gvputs(job, ",");
65+
gvprintdouble(job, -A[i].y);
6366
if (i == 0)
6467
c = 'C'; /* second point */
6568
else
@@ -68,7 +71,10 @@ static void svg_bzptarray(GVJ_t * job, pointf * A, int n)
6871
#if EDGEALIGN
6972
} else {
7073
for (i = n-1; i >= 0; i--) {
71-
gvprintf(job, "%c%g,%g", c, A[i].x, -A[i].y);
74+
gvprintf(job, "%c", c);
75+
gvprintdouble(job, A[i].x);
76+
gvputs(job, ",");
77+
gvprintdouble(job, -A[i].y);
7278
if (i == 0)
7379
c = 'C'; /* second point */
7480
else
@@ -133,8 +139,10 @@ static void svg_grstyle(GVJ_t * job, int filled, int gid)
133139
}
134140
gvputs(job, "\" stroke=\"");
135141
svg_print_color(job, obj->pencolor);
136-
if (obj->penwidth != PENWIDTH_NORMAL)
137-
gvprintf(job, "\" stroke-width=\"%g", obj->penwidth);
142+
if (obj->penwidth != PENWIDTH_NORMAL) {
143+
gvputs(job, "\" stroke-width=\"");
144+
gvprintdouble(job, obj->penwidth);
145+
}
138146
if (obj->pen == PEN_DASHED) {
139147
gvprintf(job, "\" stroke-dasharray=\"%s", sdasharray);
140148
} else if (obj->pen == PEN_DOTTED) {
@@ -244,10 +252,15 @@ static void svg_begin_page(GVJ_t * job)
244252
/* its really just a page of the graph, but its still a graph,
245253
* and it is the entire graph if we're not currently paging */
246254
svg_print_id_class(job, obj->id, NULL, "graph", obj->u.g);
247-
gvprintf(job,
248-
" transform=\"scale(%g %g) rotate(%d) translate(%g %g)\">\n",
249-
job->scale.x, job->scale.y, -job->rotation,
250-
job->translation.x, -job->translation.y);
255+
gvputs(job, " transform=\"scale(");
256+
gvprintdouble(job, job->scale.x);
257+
gvputs(job, " ");
258+
gvprintdouble(job, job->scale.y);
259+
gvprintf(job, ") rotate(%d) translate(", -job->rotation);
260+
gvprintdouble(job, job->translation.x);
261+
gvputs(job, " ");
262+
gvprintdouble(job, -job->translation.y);
263+
gvputs(job, ")\">\n");
251264
/* default style */
252265
if (agnameof(obj->u.g)[0]) {
253266
gvputs(job, "<title>");
@@ -391,8 +404,13 @@ static void svg_textspan(GVJ_t * job, pointf p, textspan_t * span)
391404
break;
392405
}
393406
p.y += span->yoffset_centerline;
394-
if (!obj->labeledgealigned)
395-
gvprintf(job, " x=\"%g\" y=\"%g\"", p.x, -p.y);
407+
if (!obj->labeledgealigned) {
408+
gvputs(job, " x=\"");
409+
gvprintdouble(job, p.x);
410+
gvputs(job, "\" y=\"");
411+
gvprintdouble(job, p.y);
412+
gvputs(job, "\"");
413+
}
396414
pA = span->font->postscript_alias;
397415
if (pA) {
398416
switch (GD_fontnames(job->gvc->g)) {
@@ -469,8 +487,10 @@ static void svg_textspan(GVJ_t * job, pointf p, textspan_t * span)
469487
}
470488
gvputs(job, ">");
471489
if (obj->labeledgealigned) {
472-
gvprintf (job, "<textPath xlink:href=\"#%s_p\" startOffset=\"50%%\">", xml_string(obj->id));
473-
gvprintf (job, "<tspan x=\"0\" dy=\"%g\">", -p.y);
490+
gvprintf(job, "<textPath xlink:href=\"#%s_p\" startOffset=\"50%%\">", xml_string(obj->id));
491+
gvputs(job, "<tspan x=\"0\" dy=\"");
492+
gvprintdouble(job, -p.y);
493+
gvputs(job, "\">");
474494
}
475495
gvputs(job, xml_string0(span->str, TRUE));
476496
if (obj->labeledgealigned)
@@ -495,8 +515,15 @@ static int svg_gradstyle(GVJ_t * job, pointf * A, int n)
495515

496516
gvprintf(job,
497517
"<defs>\n<linearGradient id=\"l_%d\" gradientUnits=\"userSpaceOnUse\" ", id);
498-
gvprintf(job, "x1=\"%g\" y1=\"%g\" x2=\"%g\" y2=\"%g\" >\n", G[0].x,
499-
G[0].y, G[1].x, G[1].y);
518+
gvputs(job, "x1=\"");
519+
gvprintdouble(job, G[0].x);
520+
gvputs(job, "\" y1=\"");
521+
gvprintdouble(job, G[0].y);
522+
gvputs(job, "\" x2=\"");
523+
gvprintdouble(job, G[1].x);
524+
gvputs(job, "\" y2=\"");
525+
gvprintdouble(job, G[1].y);
526+
gvputs(job, "\" >\n");
500527
if (obj->gradient_frac > 0)
501528
gvprintf(job, "<stop offset=\"%.03f\" style=\"stop-color:", obj->gradient_frac - 0.001);
502529
else
@@ -582,10 +609,15 @@ static void svg_ellipse(GVJ_t * job, pointf * A, int filled)
582609
}
583610
gvputs(job, "<ellipse");
584611
svg_grstyle(job, filled, gid);
585-
gvprintf(job, " cx=\"%g\" cy=\"%g\"", A[0].x, -A[0].y);
586-
gvprintf(job, " rx=\"%g\" ry=\"%g\"",
587-
A[1].x - A[0].x, A[1].y - A[0].y);
588-
gvputs(job, "/>\n");
612+
gvputs(job, " cx=\"");
613+
gvprintdouble(job, A[0].x);
614+
gvputs(job, "\" cy=\"");
615+
gvprintdouble(job, -A[0].y);
616+
gvputs(job, "\" rx=\"");
617+
gvprintdouble(job, A[1].x - A[0].x);
618+
gvputs(job, "\" ry=\"");
619+
gvprintdouble(job, A[1].y - A[0].y);
620+
gvputs(job, "\"/>\n");
589621
}
590622

591623
static void
@@ -623,9 +655,16 @@ static void svg_polygon(GVJ_t * job, pointf * A, int n, int filled)
623655
gvputs(job, "<polygon");
624656
svg_grstyle(job, filled, gid);
625657
gvputs(job, " points=\"");
626-
for (i = 0; i < n; i++)
627-
gvprintf(job, "%g,%g ", A[i].x, -A[i].y);
628-
gvprintf(job, "%g,%g", A[0].x, -A[0].y); /* because Adobe SVG is broken */
658+
for (i = 0; i < n; i++) {
659+
gvprintdouble(job, A[i].x);
660+
gvputs(job, ",");
661+
gvprintdouble(job, -A[i].y);
662+
gvputs(job, " ");
663+
}
664+
/* repeat the first point because Adobe SVG is broken */
665+
gvprintdouble(job, A[0].x);
666+
gvputs(job, ",");
667+
gvprintdouble(job, -A[0].y);
629668
gvputs(job, "\"/>\n");
630669
}
631670

@@ -636,8 +675,12 @@ static void svg_polyline(GVJ_t * job, pointf * A, int n)
636675
gvputs(job, "<polyline");
637676
svg_grstyle(job, 0, 0);
638677
gvputs(job, " points=\"");
639-
for (i = 0; i < n; i++)
640-
gvprintf(job, "%g,%g ", A[i].x, -A[i].y);
678+
for (i = 0; i < n; i++) {
679+
gvprintdouble(job, A[i].x);
680+
gvputs(job, ",");
681+
gvprintdouble(job, -A[i].y);
682+
gvputs(job, " ");
683+
}
641684
gvputs(job, "\"/>\n");
642685
}
643686

0 commit comments

Comments
 (0)