Annotation of OpenXM_contrib/gnuplot/term/svg.trm, Revision 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>