Annotation of OpenXM_contrib/gnuplot/term/svg.trm, Revision 1.1.1.1
1.1 ohara 1: /*Hello, Emacs! this is -*-C-*- ! */
2: /*------------------------------------------------------------------------------------------------------------------------------------
3: GNUPLOT - svg.trm
4:
5: This file is included by ../term.c.
6:
7: This terminal driver supports:
8: W3C Scalable Vector Graphics
9:
10: AUTHOR
11:
12: Amedeo Farello
13: afarello@libero.it
14:
15: HEAVILY MODIFIED by
16:
17: Hans-Bernhard Br"oker
18: broeker@physik.rwth-aachen.de
19:
20: ------------------------------------------------------------------------------------------------------------------------------------*/
21: #include "driver.h"
22:
23: #ifdef TERM_REGISTER
24: register_term (svg)
25: #endif
26:
27: #ifdef TERM_PROTO
28: TERM_PUBLIC void SVG_options __PROTO ((void));
29: TERM_PUBLIC void SVG_init __PROTO ((void));
30: TERM_PUBLIC void SVG_graphics __PROTO ((void));
31: TERM_PUBLIC void SVG_text __PROTO ((void));
32: TERM_PUBLIC void SVG_linetype __PROTO ((int linetype));
33: TERM_PUBLIC void SVG_move __PROTO ((unsigned int x, unsigned int y));
34: TERM_PUBLIC void SVG_vector __PROTO ((unsigned int x, unsigned int y));
35: TERM_PUBLIC void SVG_put_text __PROTO ((unsigned int x, unsigned int y, char *str));
36: TERM_PUBLIC void SVG_reset __PROTO ((void));
37: TERM_PUBLIC int SVG_justify_text __PROTO ((enum JUSTIFY mode));
38: TERM_PUBLIC int SVG_text_angle __PROTO ((int ang));
39: TERM_PUBLIC void SVG_point __PROTO ((unsigned int x, unsigned int y, int pointstyle));
40: TERM_PUBLIC int SVG_set_font __PROTO ((char *font));
41: /* TERM_PUBLIC void SVG_pointsize __PROTO((double pointsize)); */
42: /* TERM_PUBLIC void SVG_fillbox __PROTO((int style, unsigned int x1, unsigned int y1, unsigned int width, unsigned int height)); */
43: TERM_PUBLIC void SVG_linewidth __PROTO ((double linewidth));
44:
45: #define SVG_XMAX 600
46: #define SVG_YMAX 480
47:
48: #endif /* TERM_PROTO */
49:
50: #ifndef TERM_PROTO_ONLY
51: #ifdef TERM_BODY
52:
53: struct SVG_PEN
54: {
55: double width;
56: char color[8];
57: };
58:
59: unsigned int SVG_xSize = SVG_XMAX; /* plot horizontal size */
60: unsigned int SVG_ySize = SVG_YMAX; /* plot vertical size*/
61:
62: unsigned int SVG_xLast = UINT_MAX; /* current pen horizontal position*/
63: unsigned int SVG_yLast = UINT_MAX; /* current pen vertical position*/
64:
65: int SVG_LineType = -3; /* current line type*/
66: double SVG_LineWidth = 1.0; /* current line width*/
67: int SVG_TextAngle = 0; /* current text orientation*/
68: enum JUSTIFY SVG_TextJust = LEFT; /* current text justification*/
69:
70: char SVG_fontNameDef[MAX_ID_LEN + 1] = "Arial"; /* default text font family*/
71: double SVG_fontSizeDef = 12; /* default text size*/
72: char SVG_fontNameCur[MAX_ID_LEN + 1] = "Arial"; /* current text font family*/
73: double SVG_fontSizeCur = 12; /* current text size*/
74: TBOOLEAN SVG_groupIsOpen = FALSE; /* open group flag*/
75: TBOOLEAN SVG_pathIsOpen = FALSE; /* open path flag*/
76: unsigned int SVG_path_count = 0; /* size of current path*/
77: struct SVG_PEN SVG_pens[16]; /* pen descriptors*/
78:
79: int SVG_fontAscent = 0; /* estimated current font ascent*/
80: int SVG_fontDescent = 0; /* estimated current font descent*/
81: int SVG_fontLeading = 0; /* estimated current font leading*/
82: int SVG_fontAvWidth = 0; /* estimated current font char average width*/
83:
84: static short SVG_Pen_RealID __PROTO ((int));
85: static void SVG_PathOpen __PROTO ((void));
86: static void SVG_PathClose __PROTO ((void));
87: static void SVG_PathLimit __PROTO ((void));
88: static void SVG_GroupOpen __PROTO ((void));
89: static void SVG_GroupClose __PROTO ((void));
90: static void SVG_SetFont __PROTO ((char *name, double size));
91: /*------------------------------------------------------------------------------------------------------------------------------------
92: SVG_Pen_RealID
93: ------------------------------------------------------------------------------------------------------------------------------------*/
94: static short
95: SVG_Pen_RealID (inPenCode)
96: int inPenCode;
97: {
98: if (inPenCode >= 13)
99: inPenCode %= 13; /* normalize pen code*/
100: if (inPenCode < -2)
101: inPenCode = -2;
102:
103: return (inPenCode + 2);
104: }
105:
106: /*------------------------------------------------------------------------------------------------------------------------------------
107: SVG_GroupOpen
108: ------------------------------------------------------------------------------------------------------------------------------------*/
109: static void
110: SVG_GroupOpen ()
111: {
112: if (!SVG_groupIsOpen) {
113: fprintf (gpoutfile,
114: "<g style=\"fill:none; stroke:%s; stroke-width:%.2f\">\n",
115: SVG_pens[SVG_Pen_RealID (SVG_LineType)].color,
116: SVG_pens[SVG_Pen_RealID (SVG_LineType)].width);
117:
118: SVG_groupIsOpen = TRUE;
119: }
120: }
121:
122: /*------------------------------------------------------------------------------------------------------------------------------------
123: SVG_GroupClose
124: ------------------------------------------------------------------------------------------------------------------------------------*/
125: static void
126: SVG_GroupClose ()
127: {
128: if (SVG_groupIsOpen)
129: {
130: fprintf (gpoutfile, "</g>\n");
131: SVG_groupIsOpen = FALSE;
132: }
133: }
134:
135: /*------------------------------------------------------------------------------------------------------------------------------------
136: SVG_PathOpen
137: ------------------------------------------------------------------------------------------------------------------------------------*/
138: static void
139: SVG_PathOpen ()
140: {
141: if (!SVG_pathIsOpen) {
142: fprintf (gpoutfile, "\t<path d=\"");
143: SVG_pathIsOpen = TRUE;
144: }
145: }
146:
147: /*------------------------------------------------------------------------------------------------------------------------------------
148: SVG_PathClose
149: ------------------------------------------------------------------------------------------------------------------------------------*/
150: static void
151: SVG_PathClose ()
152: {
153: if (SVG_pathIsOpen) {
154: fprintf (gpoutfile, "\"></path>\n");
155: SVG_path_count = 0;
156: SVG_pathIsOpen = FALSE;
157: }
158: }
159:
160: /*------------------------------------------------------------------------------------------------------------------------------------
161: SVG_PathLimit
162: ------------------------------------------------------------------------------------------------------------------------------------*/
163: static void
164: SVG_PathLimit ()
165: {
166: if (SVG_path_count >= 10) { /* avoid excessive line length*/
167: fprintf (gpoutfile, "\n\t\t");
168: SVG_path_count = 0;
169: }
170: }
171:
172: /*------------------------------------------------------------------------------------------------------------------------------------
173: SVG_SetFont
174: ------------------------------------------------------------------------------------------------------------------------------------*/
175: static void
176: SVG_SetFont (char *name, double size)
177: {
178: strcpy (SVG_fontNameCur, name);
179: SVG_fontSizeCur = size;
180:
181: /* since we cannot interrogate SVG about text properties and according
182: * to SVG 1.0 W3C Candidate Recommendation 2 August 2000 the
183: * "line-height" of the 'text' element is defined to be equal to the
184: * 'font-size' (!), we have to to define font properties in a less
185: * than optimal way */
186:
187: SVG_fontAscent = (int) (SVG_fontSizeCur * 1.00); /* estimated current font ascent*/
188: SVG_fontDescent = (int) (SVG_fontSizeCur * 0.25); /* estimated current font descent*/
189: SVG_fontLeading = (int) (SVG_fontSizeCur * 0.25); /* estimated current font leading*/
190: SVG_fontAvWidth = (int) (SVG_fontSizeCur * 0.70); /* estimated current font char average width*/
191: }
192:
193: /*------------------------------------------------------------------------------------------------------------------------------------
194: SVG_options
195: ------------------------------------------------------------------------------------------------------------------------------------*/
196: TERM_PUBLIC void
197: SVG_options ()
198: {
199: struct value a;
200:
201: if (!END_OF_COMMAND) { /* get terminal size*/
202: if (almost_equals (c_token, "s$ize")) {
203: c_token++;
204:
205: if (END_OF_COMMAND)
206: int_error("expecting x size", c_token);
207: SVG_xSize = (unsigned int) real (const_express (&a));
208: if (SVG_xSize < 2 || SVG_xSize > 8192)
209: int_error("x size out of range", c_token);
210:
211: if (END_OF_COMMAND)
212: int_error("expecting y size", c_token);
213: SVG_ySize = (unsigned int) real (const_express (&a));
214: if (SVG_ySize < 2 || SVG_ySize > 8192)
215: int_error("y size out of range", c_token);
216: }
217: }
218:
219: if (!END_OF_COMMAND) { /* get default font family name*/
220: if (almost_equals (c_token, "fn$ame")) {
221: c_token++;
222:
223: if (!END_OF_COMMAND && isstring (c_token)) {
224: quote_str (SVG_fontNameDef, c_token, MAX_ID_LEN);
225: c_token++;
226: } else
227: int_error("fname: expecting font name", c_token);
228: }
229: }
230:
231: if (!END_OF_COMMAND) { /* get default font size*/
232: if (almost_equals (c_token, "fs$ize")) {
233: c_token++;
234:
235: if (END_OF_COMMAND)
236: int_error("fsize: expecting font size", c_token);
237: SVG_fontSizeDef = real (const_express (&a));
238: }
239: }
240:
241: if (!END_OF_COMMAND)
242: int_error("unexpected text at end of command", c_token);
243:
244: /* Save options back into options string in normalized format */
245: sprintf(term_options, "size %d %d fname '%s' fsize %g",
246: SVG_xSize, SVG_ySize, SVG_fontNameDef, SVG_fontSizeDef);
247: }
248:
249: /*------------------------------------------------------------------------------------------------------------------------------------
250: SVG_init
251: ------------------------------------------------------------------------------------------------------------------------------------*/
252: TERM_PUBLIC void
253: SVG_init ()
254: {
255: /* setup pens*/
256: SVG_pens[0].width = SVG_LineWidth;
257: sprintf (SVG_pens[0].color, "black"); /* black*/
258: SVG_pens[1].width = SVG_LineWidth;
259: sprintf (SVG_pens[1].color, "gray"); /* medium gray*/
260: SVG_pens[2].width = SVG_LineWidth;
261: sprintf (SVG_pens[2].color, "red");
262: SVG_pens[3].width = SVG_LineWidth;
263: /* sprintf (SVG_pens[3].color, "#%2.2X%2.2X%2.2X", 0, 209, 0); */ /* green*/
264: sprintf (SVG_pens[3].color, "green");
265: SVG_pens[4].width = SVG_LineWidth;
266: /* sprintf (SVG_pens[4].color, "#%2.2X%2.2X%2.2X", 74, 77, 201); */ /* blue*/
267: sprintf (SVG_pens[4].color, "blue"); /* blue*/
268: SVG_pens[5].width = SVG_LineWidth;
269: /* sprintf (SVG_pens[5].color, "#%2.2X%2.2X%2.2X", 173, 0, 0); */ /* brick*/
270: sprintf (SVG_pens[5].color, "cyan");
271: SVG_pens[6].width = SVG_LineWidth;
272: sprintf (SVG_pens[6].color, "#%2.2X%2.2X%2.2X", 21, 117, 69); /* pine green*/
273: SVG_pens[7].width = SVG_LineWidth;
274: sprintf (SVG_pens[7].color, "#%2.2X%2.2X%2.2X", 0, 0, 148); /* navy*/
275: SVG_pens[8].width = SVG_LineWidth;
276: sprintf (SVG_pens[8].color, "#%2.2X%2.2X%2.2X", 255, 153, 0); /* orange*/
277: SVG_pens[9].width = SVG_LineWidth;
278: sprintf (SVG_pens[9].color, "#%2.2X%2.2X%2.2X", 0, 153, 161); /* green blue*/
279: SVG_pens[10].width = SVG_LineWidth;
280: sprintf (SVG_pens[10].color, "#%2.2X%2.2X%2.2X", 214, 214, 69); /* olive*/
281: SVG_pens[11].width = SVG_LineWidth;
282: sprintf (SVG_pens[11].color, "#%2.2X%2.2X%2.2X", 163, 145, 255); /* cornflower*/
283: SVG_pens[12].width = SVG_LineWidth;
284: sprintf (SVG_pens[12].color, "#%2.2X%2.2X%2.2X", 255, 204, 0); /* gold*/
285: SVG_pens[13].width = SVG_LineWidth;
286: sprintf (SVG_pens[13].color, "#%2.2X%2.2X%2.2X", 214, 0, 120); /* mulberry*/
287: SVG_pens[14].width = SVG_LineWidth;
288: sprintf (SVG_pens[14].color, "#%2.2X%2.2X%2.2X", 171, 214, 0); /* green yellow*/
289: SVG_pens[15].width = SVG_LineWidth;
290: sprintf (SVG_pens[15].color, "#%2.2X%2.2X%2.2X", 222, 0, 186); /* red violet*/
291:
292: SVG_LineType = -3;
293:
294: /* set xmax, ymax*/
295:
296: term->xmax = SVG_xSize;
297: term->ymax = SVG_ySize;
298:
299: /* set current font*/
300:
301: SVG_SetFont (SVG_fontNameDef, SVG_fontSizeDef);
302:
303: /* set h_char, v_char*/
304:
305: term->h_char = SVG_fontAvWidth;
306: term->v_char = (SVG_fontAscent + SVG_fontDescent + SVG_fontLeading);
307:
308: /* set h_tic, v_tic*/
309:
310: term->h_tic = term->v_char / 2;
311: term->v_tic = term->v_char / 2;
312:
313: /* write file header*/
314:
315: fprintf (gpoutfile,
316: "<?xml version=\"1.0\" standalone=\"no\"?>\n"
317: "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 20001102//EN\" \"svg-20001102.dtd\">\n"
318: "<svg width=\"%u\" height=\"%u\" viewBox=\"0 0 %u %u\">\n\n"
319: "<desc>Produced by GNUPLOT %s patchlevel %s</desc>\n\n",
320: term->xmax, term->ymax, term->xmax, term->ymax,
321: gnuplot_version, gnuplot_patchlevel);
322:
323: /* definitions of point symbols */
324: /* FIXME: SVG scales linewidth along with the marker itself, and
325: * there seems to be no way to avoid that without copying the
326: * marker definition into the file, rather than referencing a
327: * defined one :-( That would make for much larger files */
328:
329:
330: fprintf (gpoutfile,
331: "<defs>\n"
332: /* dot: */
333: "\t<circle id=\"gpDot\" r=\"1\"></circle>\n"
334: /* diamond: */
335: "\t<path id=\"gpPt0\" style=\"stroke-width:%.3f\" d=\"M-1,0 L0,-1 L1,0 L0 1 z\"></path>\n"
336: /* cross: */
337: "\t<path id=\"gpPt1\" style=\"stroke-width:%.3f\" d=\"M-1,0 h2 M0,-1 v2\"></path>\n"
338: /* square: */
339: "\t<path id=\"gpPt2\" style=\"stroke-width:%.3f\" d=\"M-1,-1 h2 v2 h-2 z\"></path>\n"
340: /* triangle: */
341: "\t<path id=\"gpPt3\" style=\"stroke-width:%.3f\" d=\"M0,1.33 L-1.33,-0.67 L1.33,-0.67 z\"></path>\n"
342: /* 6-pointed star: */
343: "\t<path id=\"gpPt4\" style=\"stroke-width:%.3f\" d=\"M-1,0 L1,0 M0,-1 L0,1 M-1,-1 L1,1 M-1,1 L1,-1\"></path>\n"
344: "</defs>\n"
345: , 2.0 / term->h_tic
346: , 2.0 / term->h_tic
347: , 2.0 / term->h_tic
348: , 2.0 / term->h_tic
349: , 2.0 / term->h_tic
350: );
351: }
352:
353: /*------------------------------------------------------------------------------------------------------------------------------------
354: SVG_graphics
355: ------------------------------------------------------------------------------------------------------------------------------------*/
356: TERM_PUBLIC void
357: SVG_graphics ()
358: {
359: /* fprintf (gpoutfile, "<svg>\n"); --- disabled HBB 20001116*/
360:
361: SVG_groupIsOpen = FALSE;
362: SVG_pathIsOpen = FALSE;
363:
364: /* reset position*/
365:
366: SVG_xLast = SVG_yLast = UINT_MAX;
367: }
368:
369: /*------------------------------------------------------------------------------------------------------------------------------------
370: SVG_text
371: ------------------------------------------------------------------------------------------------------------------------------------*/
372: TERM_PUBLIC void
373: SVG_text ()
374: {
375: SVG_PathClose ();
376: SVG_GroupClose ();
377:
378: /* fprintf (gpoutfile, "</svg>\n\n"); --- disabled HBB 20001116 */
379: }
380:
381: /*------------------------------------------------------------------------------------------------------------------------------------
382: SVG_reset
383: ------------------------------------------------------------------------------------------------------------------------------------*/
384: TERM_PUBLIC void
385: SVG_reset ()
386: {
387: fprintf (gpoutfile, "</svg>\n\n");
388: }
389:
390: /*------------------------------------------------------------------------------------------------------------------------------------
391: SVG_linetype
392: ------------------------------------------------------------------------------------------------------------------------------------*/
393: TERM_PUBLIC void
394: SVG_linetype (int linetype)
395: {
396: if (linetype != SVG_LineType) {
397: SVG_PathClose ();
398: SVG_GroupClose ();
399: SVG_LineType = linetype;
400: SVG_GroupOpen ();
401: }
402: }
403:
404: /*------------------------------------------------------------------------------------------------------------------------------------
405: SVG_linewidth - verificare
406: ------------------------------------------------------------------------------------------------------------------------------------*/
407: TERM_PUBLIC void
408: SVG_linewidth (double linewidth)
409: {
410: if (linewidth != SVG_LineWidth) {
411: short k;
412:
413: SVG_LineWidth = linewidth;
414:
415: for (k = 0; k < 16; k++)
416: SVG_pens[k].width = SVG_LineWidth;
417: }
418: }
419:
420: /*------------------------------------------------------------------------------------------------------------------------------------
421: SVG_move
422: ------------------------------------------------------------------------------------------------------------------------------------*/
423: TERM_PUBLIC void
424: SVG_move (unsigned int x, unsigned int y)
425: {
426: if (x != SVG_xLast || y != SVG_yLast) {
427: SVG_PathOpen ();
428:
429: fprintf (gpoutfile, "M%u,%u ", x, term->ymax - y);
430: SVG_path_count++;
431:
432: SVG_PathLimit ();
433:
434: SVG_xLast = x;
435: SVG_yLast = y;
436: }
437: }
438:
439: /*------------------------------------------------------------------------------------------------------------------------------------
440: SVG_vector
441: ------------------------------------------------------------------------------------------------------------------------------------*/
442: TERM_PUBLIC void
443: SVG_vector (unsigned int x, unsigned int y)
444: {
445: if (x != SVG_xLast || y != SVG_yLast) {
446: SVG_PathOpen ();
447:
448: fprintf (gpoutfile, "L%u,%u ", x, term->ymax - y);
449: SVG_path_count++;
450:
451: SVG_PathLimit ();
452:
453: SVG_xLast = x;
454: SVG_yLast = y;
455: }
456: }
457:
458: /*------------------------------------------------------------------------------------------------------------------------------------
459: SVG_point
460: ------------------------------------------------------------------------------------------------------------------------------------*/
461: TERM_PUBLIC void
462: SVG_point (unsigned int x, unsigned int y, int number)
463: {
464: SVG_PathClose ();
465:
466: if (number < 0) { /* do dot */
467: fprintf (gpoutfile,
468: "\t<use xlink:href=\"#gpDot\" x=\"%u\" y=\"%u\"></use>\n",
469: x, term->ymax - y);
470:
471: } else { /* draw a point symbol */
472: fprintf (
473: gpoutfile,
474: "\t<use xlink:href=\"#gpPt%1u\" transform=\"translate(%u,%u) scale(%.2f)\"></use>\n"
475: , number % 5, x, term->ymax - y
476: , term_pointsize * term->h_tic / 2
477: );
478: }
479: SVG_xLast = x;
480: SVG_yLast = y;
481: }
482:
483: /*------------------------------------------------------------------------------------------------------------------------------------
484: SVG_justify_text
485: ------------------------------------------------------------------------------------------------------------------------------------*/
486: TERM_PUBLIC int
487: SVG_justify_text (enum JUSTIFY mode)
488: {
489: SVG_TextJust = mode;
490: return (TRUE);
491: }
492:
493: /*------------------------------------------------------------------------------------------------------------------------------------
494: SVG_text_angle
495: ------------------------------------------------------------------------------------------------------------------------------------*/
496: TERM_PUBLIC int
497: SVG_text_angle (int ang)
498: {
499: if (ang == 0 || ang == 1) {
500: SVG_TextAngle = ang;
501: return (TRUE);
502: }
503:
504: return (FALSE);
505: }
506:
507: /*------------------------------------------------------------------------------------------------------------------------------------
508: SVG_put_text
509: ------------------------------------------------------------------------------------------------------------------------------------*/
510: TERM_PUBLIC void
511: SVG_put_text (unsigned int x, unsigned int y, char *str)
512: {
513: char *alignment;
514: int h = x, v = y;
515:
516: SVG_PathClose ();
517:
518: /* horizontal justification*/
519:
520: switch (SVG_TextJust) {
521: case LEFT:
522: alignment = "start";
523: break;
524: case CENTRE:
525: alignment = "middle";
526: break;
527: case RIGHT:
528: default: /* can't happen, just to make gcc happy */
529: alignment = "end";
530: break;
531: }
532:
533: /* vertical justification*/
534:
535: switch (SVG_TextAngle) {
536: case 1:
537: h += (SVG_fontAscent - SVG_fontDescent) / 2;
538: break; /* vertical text*/
539: default:
540: v -= (SVG_fontAscent - SVG_fontDescent) / 2;
541: break; /* orizontal text*/
542: }
543:
544: /* define text position and attributes*/
545:
546: fprintf (gpoutfile, "\t<g transform=\"translate(%d,%d)%s\" \
547: style=\"stroke:none; fill:%s; font-family:%s; font-size:%.2f; text-anchor:%s\">\n",
548: h, term->ymax - v,
549: SVG_TextAngle ? " rotate(-90)" : "",
550: SVG_pens[SVG_Pen_RealID (SVG_LineType)].color,
551: SVG_fontNameCur, SVG_fontSizeCur, alignment);
552:
553: /* output text*/
554:
555: fprintf (gpoutfile, "\t\t<text>%s</text>\n\t</g>\n", str);
556: }
557:
558: /*------------------------------------------------------------------------------------------------------------------------------------
559: SVG_set_font
560: ------------------------------------------------------------------------------------------------------------------------------------*/
561: TERM_PUBLIC int
562: SVG_set_font (char *font)
563: {
564: if (strlen (font) > 0) { /* if available, parse the font specification ("fontname,fontsize")*/
565: short index;
566: char *token,
567: seps[] = ",", *buffer = (char *) malloc (strlen (font) + 1);
568:
569: if (buffer == NULL)
570: return (FALSE);
571: strcpy (buffer, font);
572:
573: for (token = strtok (buffer, seps), index = 1;
574: token != NULL; token = strtok (NULL, seps), index++
575: ) {
576: switch (index) {
577: case 1:
578: strcpy (SVG_fontNameCur, token);
579: break; /* font name*/
580: case 2:
581: SVG_fontSizeCur = atoi (token);
582: break; /* font size*/
583: default:
584: break;
585: }
586: }
587:
588: free (buffer);
589: } else { /* otherwise simply reset the default font*/
590: strcpy (SVG_fontNameCur, SVG_fontNameDef);
591: SVG_fontSizeCur = SVG_fontSizeDef;
592: }
593:
594: return (TRUE);
595: }
596:
597: #endif /* TERM_BODY */
598:
599: #ifdef TERM_TABLE
600: TERM_TABLE_START (svg_driver)
601: "svg", "W3C Scalable Vector Graphics driver",
602: 0 /* xmax */ , 0 /* ymax */ , 0 /* vchar */ , 0 /* hchar */ ,
603: 0 /* vtic */ , 0 /* htic */ ,
604: SVG_options, SVG_init, SVG_reset, SVG_text, null_scale, SVG_graphics,
605: SVG_move, SVG_vector, SVG_linetype, SVG_put_text, SVG_text_angle,
606: SVG_justify_text, SVG_point, do_arrow, SVG_set_font, do_pointsize,
607: TERM_CAN_MULTIPLOT,
608: 0 /* suspend */, 0 /* resume */ , 0 /* fillbox */ , SVG_linewidth
609: TERM_TABLE_END (svg_driver)
610: #undef LAST_TERM
611: #define LAST_TERM svg_driver
612: #endif /* TERM_TABLE */
613:
614: #endif /* TERM_PROTO_ONLY */
615:
616: #ifdef TERM_HELP
617: START_HELP (svg)
618: "1 svg",
619: "?commands set terminal svg",
620: "?set terminal svg",
621: "?set term svg",
622: "?terminal svg",
623: "?term svg",
624: "?svg",
625: " This terminal produces files in the W3C Scalable Vector Graphics format.",
626: "",
627: " Syntax:",
628: " set terminal svg {size <x> <y>}",
629: " {fname \"<font>\"} {fsize <fontsize>}",
630: "",
631: " where <x> and <y> are the size of the SVG plot to generate,",
632: " <font> is the name of the default font to use (default Arial) and",
633: " <fontsize> is the font size (in points, default 12)"
634: END_HELP (svg)
635: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>