Blame


1 3ebbd193 2017-06-19 rsc #include <stdio.h>
2 3ebbd193 2017-06-19 rsc #include <math.h>
3 3ebbd193 2017-06-19 rsc #include <string.h>
4 3ebbd193 2017-06-19 rsc #include "pic.h"
5 3ebbd193 2017-06-19 rsc extern int dbg;
6 3ebbd193 2017-06-19 rsc
7 3ebbd193 2017-06-19 rsc #define abs(n) (n >= 0 ? n : -(n))
8 3ebbd193 2017-06-19 rsc #define max(x,y) ((x)>(y) ? (x) : (y))
9 3ebbd193 2017-06-19 rsc
10 3ebbd193 2017-06-19 rsc char *textshift = "\\v'.2m'"; /* move text this far down */
11 3ebbd193 2017-06-19 rsc
12 3ebbd193 2017-06-19 rsc /* scaling stuff defined by s command as X0,Y0 to X1,Y1 */
13 3ebbd193 2017-06-19 rsc /* output dimensions set by -l,-w options to 0,0 to hmax, vmax */
14 3ebbd193 2017-06-19 rsc /* default output is 6x6 inches */
15 3ebbd193 2017-06-19 rsc
16 3ebbd193 2017-06-19 rsc
17 3ebbd193 2017-06-19 rsc double xscale;
18 3ebbd193 2017-06-19 rsc double yscale;
19 3ebbd193 2017-06-19 rsc
20 3ebbd193 2017-06-19 rsc double hpos = 0; /* current horizontal position in output coordinate system */
21 3ebbd193 2017-06-19 rsc double vpos = 0; /* current vertical position; 0 is top of page */
22 3ebbd193 2017-06-19 rsc
23 3ebbd193 2017-06-19 rsc double htrue = 0; /* where we really are */
24 3ebbd193 2017-06-19 rsc double vtrue = 0;
25 3ebbd193 2017-06-19 rsc
26 3ebbd193 2017-06-19 rsc double X0, Y0; /* left bottom of input */
27 3ebbd193 2017-06-19 rsc double X1, Y1; /* right top of input */
28 3ebbd193 2017-06-19 rsc
29 3ebbd193 2017-06-19 rsc double hmax; /* right end of output */
30 3ebbd193 2017-06-19 rsc double vmax; /* top of output (down is positive) */
31 3ebbd193 2017-06-19 rsc
32 3ebbd193 2017-06-19 rsc extern double deltx;
33 3ebbd193 2017-06-19 rsc extern double delty;
34 3ebbd193 2017-06-19 rsc extern double xmin, ymin, xmax, ymax;
35 3ebbd193 2017-06-19 rsc
36 3ebbd193 2017-06-19 rsc double xconv(double), yconv(double), xsc(double), ysc(double);
37 3ebbd193 2017-06-19 rsc void space(double, double, double, double);
38 3ebbd193 2017-06-19 rsc void hgoto(double), vgoto(double), hmot(double), vmot(double);
39 3ebbd193 2017-06-19 rsc void move(double, double), movehv(double, double);
40 3ebbd193 2017-06-19 rsc
41 3ebbd193 2017-06-19 rsc char svgfill[40] = "transparent";
42 3ebbd193 2017-06-19 rsc char svgstroke[40] = "black";
43 3ebbd193 2017-06-19 rsc
44 3ebbd193 2017-06-19 rsc void openpl(char *s) /* initialize device; s is residue of .PS invocation line */
45 3ebbd193 2017-06-19 rsc {
46 3ebbd193 2017-06-19 rsc double maxw, maxh, ratio = 1;
47 3ebbd193 2017-06-19 rsc double odeltx = deltx, odelty = delty;
48 3ebbd193 2017-06-19 rsc
49 3ebbd193 2017-06-19 rsc hpos = vpos = 0;
50 3ebbd193 2017-06-19 rsc maxw = getfval("maxpswid");
51 3ebbd193 2017-06-19 rsc maxh = getfval("maxpsht");
52 3ebbd193 2017-06-19 rsc if (deltx > maxw) { /* shrink horizontal */
53 3ebbd193 2017-06-19 rsc ratio = maxw / deltx;
54 3ebbd193 2017-06-19 rsc deltx *= ratio;
55 3ebbd193 2017-06-19 rsc delty *= ratio;
56 3ebbd193 2017-06-19 rsc }
57 3ebbd193 2017-06-19 rsc if (delty > maxh) { /* shrink vertical */
58 3ebbd193 2017-06-19 rsc ratio = maxh / delty;
59 3ebbd193 2017-06-19 rsc deltx *= ratio;
60 3ebbd193 2017-06-19 rsc delty *= ratio;
61 3ebbd193 2017-06-19 rsc }
62 3ebbd193 2017-06-19 rsc if (ratio != 1) {
63 3ebbd193 2017-06-19 rsc fprintf(stderr, "pic: %g X %g picture shrunk to", odeltx, odelty);
64 3ebbd193 2017-06-19 rsc fprintf(stderr, " %g X %g\n", deltx, delty);
65 3ebbd193 2017-06-19 rsc }
66 3ebbd193 2017-06-19 rsc space(xmin, ymin, xmax, ymax);
67 3ebbd193 2017-06-19 rsc
68 3ebbd193 2017-06-19 rsc printf("<svg height=\"%.3f\" width=\"%.3f\"\n", yconv(ymin)+10, xconv(xmax)+10);
69 3ebbd193 2017-06-19 rsc printf(" xmlns=\"http://www.w3.org/2000/svg\">\n");
70 3ebbd193 2017-06-19 rsc printf("<g transform=\"translate(5 5)\">\n");
71 3ebbd193 2017-06-19 rsc
72 3ebbd193 2017-06-19 rsc /*
73 3ebbd193 2017-06-19 rsc printf("... %g %g %g %g\n", xmin, ymin, xmax, ymax);
74 3ebbd193 2017-06-19 rsc printf("... %.3fi %.3fi %.3fi %.3fi\n",
75 3ebbd193 2017-06-19 rsc xconv(xmin), yconv(ymin), xconv(xmax), yconv(ymax));
76 3ebbd193 2017-06-19 rsc printf(".nr 00 \\n(.u\n");
77 3ebbd193 2017-06-19 rsc printf(".nf\n");
78 3ebbd193 2017-06-19 rsc printf(".PS %.3fi %.3fi %s", yconv(ymin), xconv(xmax), s);
79 3ebbd193 2017-06-19 rsc */
80 3ebbd193 2017-06-19 rsc }
81 3ebbd193 2017-06-19 rsc
82 3ebbd193 2017-06-19 rsc void space(double x0, double y0, double x1, double y1) /* set limits of page */
83 3ebbd193 2017-06-19 rsc {
84 3ebbd193 2017-06-19 rsc X0 = x0;
85 3ebbd193 2017-06-19 rsc Y0 = y0;
86 3ebbd193 2017-06-19 rsc X1 = x1;
87 3ebbd193 2017-06-19 rsc Y1 = y1;
88 3ebbd193 2017-06-19 rsc xscale = deltx == 0.0 ? 1.0 : deltx / (X1-X0);
89 3ebbd193 2017-06-19 rsc yscale = delty == 0.0 ? 1.0 : delty / (Y1-Y0);
90 3ebbd193 2017-06-19 rsc
91 3ebbd193 2017-06-19 rsc xscale *= 144;
92 3ebbd193 2017-06-19 rsc yscale *= 144;
93 3ebbd193 2017-06-19 rsc }
94 3ebbd193 2017-06-19 rsc
95 3ebbd193 2017-06-19 rsc double xconv(double x) /* convert x from external to internal form */
96 3ebbd193 2017-06-19 rsc {
97 3ebbd193 2017-06-19 rsc return (x-X0) * xscale;
98 3ebbd193 2017-06-19 rsc }
99 3ebbd193 2017-06-19 rsc
100 3ebbd193 2017-06-19 rsc double xsc(double x) /* convert x from external to internal form, scaling only */
101 3ebbd193 2017-06-19 rsc {
102 3ebbd193 2017-06-19 rsc
103 3ebbd193 2017-06-19 rsc return (x) * xscale;
104 3ebbd193 2017-06-19 rsc }
105 3ebbd193 2017-06-19 rsc
106 3ebbd193 2017-06-19 rsc double yconv(double y) /* convert y from external to internal form */
107 3ebbd193 2017-06-19 rsc {
108 3ebbd193 2017-06-19 rsc return (Y1-y) * yscale;
109 3ebbd193 2017-06-19 rsc }
110 3ebbd193 2017-06-19 rsc
111 3ebbd193 2017-06-19 rsc double ysc(double y) /* convert y from external to internal form, scaling only */
112 3ebbd193 2017-06-19 rsc {
113 3ebbd193 2017-06-19 rsc return (y) * yscale;
114 3ebbd193 2017-06-19 rsc }
115 3ebbd193 2017-06-19 rsc
116 3ebbd193 2017-06-19 rsc void closepl(char *PEline) /* clean up after finished */
117 3ebbd193 2017-06-19 rsc {
118 3ebbd193 2017-06-19 rsc printf("</g>\n");
119 3ebbd193 2017-06-19 rsc printf("</svg>\n");
120 3ebbd193 2017-06-19 rsc }
121 3ebbd193 2017-06-19 rsc
122 3ebbd193 2017-06-19 rsc void move(double x, double y) /* go to position x, y in external coords */
123 3ebbd193 2017-06-19 rsc {
124 3ebbd193 2017-06-19 rsc hgoto(xconv(x));
125 3ebbd193 2017-06-19 rsc vgoto(yconv(y));
126 3ebbd193 2017-06-19 rsc }
127 3ebbd193 2017-06-19 rsc
128 3ebbd193 2017-06-19 rsc void movehv(double h, double v) /* go to internal position h, v */
129 3ebbd193 2017-06-19 rsc {
130 3ebbd193 2017-06-19 rsc hgoto(h);
131 3ebbd193 2017-06-19 rsc vgoto(v);
132 3ebbd193 2017-06-19 rsc }
133 3ebbd193 2017-06-19 rsc
134 3ebbd193 2017-06-19 rsc void hmot(double n) /* generate n units of horizontal motion */
135 3ebbd193 2017-06-19 rsc {
136 3ebbd193 2017-06-19 rsc hpos += n;
137 3ebbd193 2017-06-19 rsc }
138 3ebbd193 2017-06-19 rsc
139 3ebbd193 2017-06-19 rsc void vmot(double n) /* generate n units of vertical motion */
140 3ebbd193 2017-06-19 rsc {
141 3ebbd193 2017-06-19 rsc vpos += n;
142 3ebbd193 2017-06-19 rsc }
143 3ebbd193 2017-06-19 rsc
144 3ebbd193 2017-06-19 rsc void hgoto(double n)
145 3ebbd193 2017-06-19 rsc {
146 3ebbd193 2017-06-19 rsc hpos = n;
147 3ebbd193 2017-06-19 rsc }
148 3ebbd193 2017-06-19 rsc
149 3ebbd193 2017-06-19 rsc void vgoto(double n)
150 3ebbd193 2017-06-19 rsc {
151 3ebbd193 2017-06-19 rsc vpos = n;
152 3ebbd193 2017-06-19 rsc }
153 3ebbd193 2017-06-19 rsc
154 3ebbd193 2017-06-19 rsc void hvflush(void) /* get to proper point for output */
155 3ebbd193 2017-06-19 rsc {
156 3ebbd193 2017-06-19 rsc /*
157 3ebbd193 2017-06-19 rsc if (fabs(hpos-htrue) >= 0.0005) {
158 3ebbd193 2017-06-19 rsc printf("\\h'%.3fi'", hpos - htrue);
159 3ebbd193 2017-06-19 rsc htrue = hpos;
160 3ebbd193 2017-06-19 rsc }
161 3ebbd193 2017-06-19 rsc if (fabs(vpos-vtrue) >= 0.0005) {
162 3ebbd193 2017-06-19 rsc printf("\\v'%.3fi'", vpos - vtrue);
163 3ebbd193 2017-06-19 rsc vtrue = vpos;
164 3ebbd193 2017-06-19 rsc }
165 3ebbd193 2017-06-19 rsc */
166 3ebbd193 2017-06-19 rsc }
167 3ebbd193 2017-06-19 rsc
168 3ebbd193 2017-06-19 rsc void printlf(int n, char *f)
169 3ebbd193 2017-06-19 rsc {
170 3ebbd193 2017-06-19 rsc }
171 3ebbd193 2017-06-19 rsc
172 3ebbd193 2017-06-19 rsc void troff(char *s) /* output troff right here */
173 3ebbd193 2017-06-19 rsc {
174 3ebbd193 2017-06-19 rsc printf("%s\n", s);
175 3ebbd193 2017-06-19 rsc }
176 3ebbd193 2017-06-19 rsc
177 3ebbd193 2017-06-19 rsc void label(char *s, int t, int nh) /* text s of type t nh half-lines up */
178 3ebbd193 2017-06-19 rsc {
179 3ebbd193 2017-06-19 rsc char *anchor;
180 3ebbd193 2017-06-19 rsc
181 3ebbd193 2017-06-19 rsc if (!s)
182 3ebbd193 2017-06-19 rsc return;
183 3ebbd193 2017-06-19 rsc
184 3ebbd193 2017-06-19 rsc if (t & ABOVE)
185 3ebbd193 2017-06-19 rsc nh++;
186 3ebbd193 2017-06-19 rsc else if (t & BELOW)
187 3ebbd193 2017-06-19 rsc nh--;
188 3ebbd193 2017-06-19 rsc t &= ~(ABOVE|BELOW);
189 3ebbd193 2017-06-19 rsc anchor = 0;
190 3ebbd193 2017-06-19 rsc if (t & LJUST) {
191 3ebbd193 2017-06-19 rsc // default
192 3ebbd193 2017-06-19 rsc } else if (t & RJUST) {
193 3ebbd193 2017-06-19 rsc anchor = "end";
194 3ebbd193 2017-06-19 rsc } else { /* CENTER */
195 3ebbd193 2017-06-19 rsc anchor = "middle";
196 3ebbd193 2017-06-19 rsc }
197 3ebbd193 2017-06-19 rsc printf("<text x=\"%.3f\" y=\"%.3f\"", hpos, vpos-(double)(nh-0.4)*(12.0/72)/2*144);
198 3ebbd193 2017-06-19 rsc if(anchor)
199 3ebbd193 2017-06-19 rsc printf(" text-anchor=\"%s\"", anchor);
200 3ebbd193 2017-06-19 rsc printf(">%s</text>\n", s);
201 3ebbd193 2017-06-19 rsc }
202 3ebbd193 2017-06-19 rsc
203 3ebbd193 2017-06-19 rsc void line(double x0, double y0, double x1, double y1, int attr, double ddval) /* draw line from x0,y0 to x1,y1 */
204 3ebbd193 2017-06-19 rsc {
205 3ebbd193 2017-06-19 rsc printf("<path d=\"M %.3f %.3f L %.3f %.3f\" fill=\"transparent\" stroke=\"black\"", xconv(x0), yconv(y0), xconv(x1), yconv(y1));
206 3ebbd193 2017-06-19 rsc if(attr & DASHBIT)
207 3ebbd193 2017-06-19 rsc printf(" stroke-dasharray=\"%.3f, %.3f\"", xsc(ddval), xsc(ddval));
208 3ebbd193 2017-06-19 rsc else if(attr & DOTBIT)
209 3ebbd193 2017-06-19 rsc printf(" stroke-dasharray=\"1, %.3f\"", xsc(ddval));
210 3ebbd193 2017-06-19 rsc printf("/>\n");
211 3ebbd193 2017-06-19 rsc }
212 3ebbd193 2017-06-19 rsc
213 3ebbd193 2017-06-19 rsc void arrow(double x0, double y0, double x1, double y1, double w, double h,
214 3ebbd193 2017-06-19 rsc double ang, int nhead) /* draw arrow (without shaft) */
215 3ebbd193 2017-06-19 rsc {
216 3ebbd193 2017-06-19 rsc double alpha, rot, drot, hyp;
217 3ebbd193 2017-06-19 rsc double dx, dy;
218 3ebbd193 2017-06-19 rsc int i;
219 3ebbd193 2017-06-19 rsc
220 3ebbd193 2017-06-19 rsc rot = atan2(w / 2, h);
221 3ebbd193 2017-06-19 rsc hyp = sqrt(w/2 * w/2 + h * h);
222 3ebbd193 2017-06-19 rsc alpha = atan2(y1-y0, x1-x0) + ang;
223 3ebbd193 2017-06-19 rsc if (nhead < 2)
224 3ebbd193 2017-06-19 rsc nhead = 2;
225 3ebbd193 2017-06-19 rsc dprintf("rot=%g, hyp=%g, alpha=%g\n", rot, hyp, alpha);
226 3ebbd193 2017-06-19 rsc printf("<path d=\"");
227 3ebbd193 2017-06-19 rsc for (i = 1; i >= 0; i--) {
228 3ebbd193 2017-06-19 rsc drot = 2 * rot / (double) (2-1) * (double) i;
229 3ebbd193 2017-06-19 rsc dx = hyp * cos(alpha + PI - rot + drot);
230 3ebbd193 2017-06-19 rsc dy = hyp * sin(alpha + PI - rot + drot);
231 3ebbd193 2017-06-19 rsc dprintf("dx,dy = %g,%g\n", dx, dy);
232 3ebbd193 2017-06-19 rsc if(i == 1)
233 3ebbd193 2017-06-19 rsc printf("M %.3f %.3f L %.3f %.3f", xconv(x1+dx), yconv(y1+dy), xconv(x1), yconv(y1));
234 3ebbd193 2017-06-19 rsc else
235 fa325e9b 2020-01-10 cross printf(" L %.3f %.3f", xconv(x1+dx), yconv(y1+dy));
236 3ebbd193 2017-06-19 rsc }
237 3ebbd193 2017-06-19 rsc if (nhead > 2)
238 3ebbd193 2017-06-19 rsc printf(" Z");
239 3ebbd193 2017-06-19 rsc printf("\"");
240 3ebbd193 2017-06-19 rsc if(nhead > 3)
241 3ebbd193 2017-06-19 rsc printf(" fill=\"black\" stroke=\"black\"");
242 3ebbd193 2017-06-19 rsc else if(nhead == 3)
243 3ebbd193 2017-06-19 rsc printf(" fill=\"white\" stroke=\"black\"");
244 3ebbd193 2017-06-19 rsc else
245 3ebbd193 2017-06-19 rsc printf(" fill=\"transparent\" stroke=\"black\"");
246 3ebbd193 2017-06-19 rsc printf("/>\n");
247 3ebbd193 2017-06-19 rsc }
248 3ebbd193 2017-06-19 rsc
249 3ebbd193 2017-06-19 rsc double lastgray = 0;
250 3ebbd193 2017-06-19 rsc
251 3ebbd193 2017-06-19 rsc void fillstart(double v, int vis, int fill)
252 3ebbd193 2017-06-19 rsc {
253 3ebbd193 2017-06-19 rsc int x;
254 3ebbd193 2017-06-19 rsc
255 3ebbd193 2017-06-19 rsc if(fill) {
256 3ebbd193 2017-06-19 rsc x = (int)(v*255.0);
257 3ebbd193 2017-06-19 rsc sprintf(svgfill, "#%02x%02x%02x", x, x, x);
258 3ebbd193 2017-06-19 rsc } else
259 3ebbd193 2017-06-19 rsc strcpy(svgfill, "transparent");
260 3ebbd193 2017-06-19 rsc if(vis)
261 3ebbd193 2017-06-19 rsc strcpy(svgstroke, "black");
262 3ebbd193 2017-06-19 rsc else
263 3ebbd193 2017-06-19 rsc strcpy(svgstroke, "transparent");
264 3ebbd193 2017-06-19 rsc }
265 3ebbd193 2017-06-19 rsc
266 3ebbd193 2017-06-19 rsc void fillend(void)
267 3ebbd193 2017-06-19 rsc {
268 3ebbd193 2017-06-19 rsc strcpy(svgfill, "transparent");
269 3ebbd193 2017-06-19 rsc strcpy(svgstroke, "black");
270 3ebbd193 2017-06-19 rsc }
271 3ebbd193 2017-06-19 rsc
272 3ebbd193 2017-06-19 rsc void box(double x0, double y0, double x1, double y1, int attr, double ddval)
273 3ebbd193 2017-06-19 rsc {
274 3ebbd193 2017-06-19 rsc printf("<path d=\"M %.3f %.3f V %.3f H %.3f V %.3f Z\" fill=\"transparent\" stroke=\"black\"", xconv(x0), yconv(y0), yconv(y1), xconv(x1), yconv(y0));
275 3ebbd193 2017-06-19 rsc if(attr & DASHBIT)
276 3ebbd193 2017-06-19 rsc printf(" stroke-dasharray=\"%.3f, %.3f\"", xsc(ddval), xsc(ddval));
277 3ebbd193 2017-06-19 rsc else if(attr & DOTBIT)
278 3ebbd193 2017-06-19 rsc printf(" stroke-dasharray=\"1, %.3f\"", xsc(ddval));
279 3ebbd193 2017-06-19 rsc printf("/>\n");
280 3ebbd193 2017-06-19 rsc
281 3ebbd193 2017-06-19 rsc }
282 3ebbd193 2017-06-19 rsc
283 3ebbd193 2017-06-19 rsc void circle(double x, double y, double r)
284 3ebbd193 2017-06-19 rsc {
285 3ebbd193 2017-06-19 rsc printf("<circle cx=\"%.3f\" cy=\"%.3f\" r=\"%.3f\" fill=\"%s\" stroke=\"%s\"/>\n", xconv(x), yconv(y), xsc(r), svgfill, svgstroke);
286 3ebbd193 2017-06-19 rsc }
287 3ebbd193 2017-06-19 rsc
288 3ebbd193 2017-06-19 rsc void spline(double x, double y, double n, ofloat *p, int attr, double ddval)
289 3ebbd193 2017-06-19 rsc {
290 3ebbd193 2017-06-19 rsc int i;
291 bb044732 2017-09-01 0intro double x1, y1;
292 3ebbd193 2017-06-19 rsc
293 3ebbd193 2017-06-19 rsc printf("<path d=\"M %.3f %.3f", xconv(x), yconv(y));
294 3ebbd193 2017-06-19 rsc x1 = 0;
295 3ebbd193 2017-06-19 rsc y1 = 0;
296 3ebbd193 2017-06-19 rsc for (i = 0; i < 2 * n; i += 2) {
297 3ebbd193 2017-06-19 rsc x1 = x;
298 3ebbd193 2017-06-19 rsc y1 = y;
299 3ebbd193 2017-06-19 rsc x += p[i];
300 3ebbd193 2017-06-19 rsc y += p[i+1];
301 3ebbd193 2017-06-19 rsc if(i == 0)
302 3ebbd193 2017-06-19 rsc printf(" L %.3f %.3f", xconv((x+x1)/2), yconv((y+y1)/2));
303 3ebbd193 2017-06-19 rsc else
304 3ebbd193 2017-06-19 rsc printf(" Q %.3f %.3f %.3f %.3f", xconv(x1), yconv(y1), xconv((x+x1)/2), yconv((y+y1)/2));
305 3ebbd193 2017-06-19 rsc }
306 3ebbd193 2017-06-19 rsc printf(" L %.3f %.3f", xconv(x), yconv(y));
307 3ebbd193 2017-06-19 rsc printf("\" fill=\"%s\" stroke=\"%s\"", svgfill, svgstroke);
308 3ebbd193 2017-06-19 rsc if(attr & DASHBIT)
309 3ebbd193 2017-06-19 rsc printf(" stroke-dasharray=\"%.3f, %.3f\"", xsc(ddval), xsc(ddval));
310 3ebbd193 2017-06-19 rsc else if(attr & DOTBIT)
311 3ebbd193 2017-06-19 rsc printf(" stroke-dasharray=\"1, %.3f\"", xsc(ddval));
312 3ebbd193 2017-06-19 rsc printf("/>\n");
313 3ebbd193 2017-06-19 rsc }
314 3ebbd193 2017-06-19 rsc
315 3ebbd193 2017-06-19 rsc void ellipse(double x, double y, double r1, double r2)
316 3ebbd193 2017-06-19 rsc {
317 3ebbd193 2017-06-19 rsc printf("<ellipse cx=\"%.3f\" cy=\"%.3f\" rx=\"%.3f\" ry=\"%.3f\" fill=\"%s\" stroke=\"%s\"/>\n", xconv(x), yconv(y), xsc(r1), ysc(r2), svgfill, svgstroke);
318 3ebbd193 2017-06-19 rsc }
319 3ebbd193 2017-06-19 rsc
320 3ebbd193 2017-06-19 rsc void arc(double x, double y, double x0, double y0, double x1, double y1, double r) /* draw arc with center x,y */
321 3ebbd193 2017-06-19 rsc {
322 3ebbd193 2017-06-19 rsc printf("<path d=\"M %.3f %.3f A %.3f %.3f %d %d %d %.3f %.3f\" fill=\"%s\" stroke=\"%s\"/>\n",
323 3ebbd193 2017-06-19 rsc xconv(x0), yconv(y0),
324 3ebbd193 2017-06-19 rsc xsc(r), ysc(r), 0, 0, 0, xconv(x1), yconv(y1),
325 3ebbd193 2017-06-19 rsc svgfill, svgstroke);
326 3ebbd193 2017-06-19 rsc }