[BACK]Return to post.trm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot / term

Annotation of OpenXM_contrib/gnuplot/term/post.trm, Revision 1.1.1.1

1.1       maekawa     1: /*
                      2:  * $Id: post.trm,v 1.46 1998/06/18 14:59:23 ddenholm Exp $
                      3:  */
                      4:
                      5: /* GNUPLOT - post.trm */
                      6:
                      7: /*[
                      8:  * Copyright 1990 - 1993, 1998
                      9:  *
                     10:  * Permission to use, copy, and distribute this software and its
                     11:  * documentation for any purpose with or without fee is hereby granted,
                     12:  * provided that the above copyright notice appear in all copies and
                     13:  * that both that copyright notice and this permission notice appear
                     14:  * in supporting documentation.
                     15:  *
                     16:  * Permission to modify the software is granted, but not the right to
                     17:  * distribute the complete modified source code.  Modifications are to
                     18:  * be distributed as patches to the released version.  Permission to
                     19:  * distribute binaries produced by compiling modified sources is granted,
                     20:  * provided you
                     21:  *   1. distribute the corresponding source modifications from the
                     22:  *    released version in the form of a patch file along with the binaries,
                     23:  *   2. add special version identification to distinguish your version
                     24:  *    in addition to the base release version number,
                     25:  *   3. provide your name and address as the primary contact for the
                     26:  *    support of your modified version, and
                     27:  *   4. retain our contact information in regard to use of the base
                     28:  *    software.
                     29:  * Permission to distribute the released version of the source code along
                     30:  * with corresponding source modifications in the form of a patch file is
                     31:  * granted with same provisions 2 through 4 for binary distributions.
                     32:  *
                     33:  * This software is provided "as is" without express or implied warranty
                     34:  * to the extent permitted by applicable law.
                     35: ]*/
                     36:
                     37: /*
                     38:  * This terminal driver supports:
                     39:  *     postscript
                     40:  *
                     41:  * AUTHORS
                     42:  *  Russell Lang
                     43:  *
                     44:  * modified 10/5/95 by drd - put in support for other postscript drivers
                     45:  * (enhpost, pslatex, ...) so they dont have to work quite so hard
                     46:  *
                     47:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
                     48:  *
                     49:  * The 'postscript' driver produces landscape output 10" wide and 7" high.
                     50:  * To change font to Times-Roman and font size to 20pts use
                     51:  * 'set term postscript "Times-Roman" 20'.
                     52:  * To get a smaller (5" x 3.5") eps output use 'set term post eps'
                     53:  * and make only one plot per file.  Font size for eps will be half
                     54:  * the specified size.
                     55:  *
                     56:  * Erik Luijten 30/5/97: added %%CreationDate, made %%DocumentFonts conform
                     57:  *                       to DSC, added version no. and patchl. to %%Creator
                     58:  */
                     59:
                     60: #include "driver.h"
                     61:
                     62: #ifdef TERM_REGISTER
                     63: register_term(post)
                     64: #endif
                     65:
                     66: #ifdef TERM_PROTO
                     67: TERM_PUBLIC void PS_options __PROTO((void));
                     68: TERM_PUBLIC void PS_common_init __PROTO((int encap, int portrait, int uses_fonts, unsigned int xoff, unsigned int yoff, unsigned int bb_xmin, unsigned int bb_ymin, unsigned int bb_xmax, unsigned int bb_ymax, char **dict));
                     69: TERM_PUBLIC void PS_init __PROTO((void));
                     70: TERM_PUBLIC void PS_graphics __PROTO((void));
                     71: TERM_PUBLIC void PS_text __PROTO((void));
                     72: TERM_PUBLIC void PS_reset __PROTO((void));
                     73: TERM_PUBLIC void PS_linetype __PROTO((int linetype));
                     74: TERM_PUBLIC void PS_move __PROTO((unsigned int x, unsigned int y));
                     75: TERM_PUBLIC void PS_vector __PROTO((unsigned int x, unsigned int y));
                     76: TERM_PUBLIC void PS_put_text __PROTO((unsigned int x, unsigned int y, char *str));
                     77: TERM_PUBLIC void ENHPS_put_text __PROTO((unsigned int x, unsigned int y, char *str));
                     78: TERM_PUBLIC int PS_text_angle __PROTO((int ang));
                     79: TERM_PUBLIC int PS_justify_text __PROTO((enum JUSTIFY mode));
                     80: TERM_PUBLIC void PS_point __PROTO((unsigned int x, unsigned int y, int number));
                     81: TERM_PUBLIC int PS_set_font __PROTO((char * font));
                     82: TERM_PUBLIC int ENHPS_set_font __PROTO((char * font));
                     83: TERM_PUBLIC void PS_fillbox __PROTO((int style, unsigned int x1, unsigned int y1, unsigned int width, unsigned int height));
                     84: TERM_PUBLIC void PS_linewidth __PROTO((double linewidth)); /* JFi [linewidth] */
                     85: TERM_PUBLIC void PS_pointsize __PROTO((double ptsize)); /* JFi [pointsize] */
                     86:
                     87: #define PS_POINT_TYPES 8
                     88: #define PS_XOFF        50      /* page offset in pts */
                     89: #define PS_YOFF        50
                     90: #define PS_XMAX 7200 /* assumes landscape */
                     91: #define PS_YMAX 5040
                     92: #define PS_XLAST (PS_XMAX - 1)
                     93: #define PS_YLAST (PS_YMAX - 1)
                     94: #define PS_VTIC (PS_YMAX/80)
                     95: #define PS_HTIC (PS_YMAX/80)
                     96: #define PS_SC (10)                             /* scale is 1pt = 10 units */
                     97: #define        PS_LW (0.5*PS_SC)               /* linewidth = 0.5 pts */
                     98: #define PS_VCHAR (14*PS_SC)            /* default is 14 point characters */
                     99: #define PS_HCHAR (14*PS_SC*6/10)
                    100:
                    101: #endif
                    102:
                    103:
                    104: #ifndef TERM_PROTO_ONLY
                    105:
                    106: #ifdef TERM_BODY
                    107: /* PostScript driver by Russell Lang, rjl@monu1.cc.monash.edu.au */
                    108:
                    109: /* From version.c */
                    110: extern char version[];
                    111: extern char patchlevel[];
                    112:
                    113: #define PS_FLUSH_PATH \
                    114:     if (ps_path_count) { fprintf(gpoutfile, "stroke "); ps_path_count = 0; }
                    115:
                    116: static char *PS_RememberFont __PROTO((char *fname, int reencode));
                    117: static void ENHPS_put_text __PROTO((unsigned int x, unsigned int y, char *str));
                    118: static char *ENHPS_recurse __PROTO((char *p, TBOOLEAN brace, char *fontname, double fontsize, double base, TBOOLEAN widthflag, TBOOLEAN showflag));
                    119: static char ps_font[MAX_ID_LEN+1] = "Helvetica" ; /* name of font */
                    120: static int ps_fontsize = 14;                                    /* size of font in pts */
                    121:
                    122: /* for enhanced mode, we keep a separate font name and size, which
                    123:  * is restored to the default value on font of ""
                    124:  */
                    125: static char ps_enh_font[MAX_ID_LEN+1];
                    126: static int  ps_enh_fontsize;
                    127:
                    128: static TBOOLEAN ps_portrait = FALSE;                            /* vertical page */
                    129: static TBOOLEAN ps_color = FALSE;
                    130: static TBOOLEAN ps_solid = FALSE;              /*  use solid lines */
                    131: static TBOOLEAN ps_eps = FALSE;        /* Is this for an eps file? */
                    132:                        /* Added by Robert Davis <davis@ecn.purdue.edu> */
                    133: static int ps_page=0;                  /* page count */
                    134: static int ps_path_count=0;    /* count of lines in path */
                    135: static int ps_ang=0;                   /* text angle */
                    136: static enum JUSTIFY ps_justify=LEFT;   /* text is flush left */
                    137:
                    138: /* added by Matt Heffron <heffron@falstaff.css.beckman.com> */
                    139: static TBOOLEAN ps_duplex_state = FALSE;
                    140: static TBOOLEAN ps_duplex_option = FALSE;
                    141:
                    142: static char GPFAR * GPFAR PS_header[] = {
                    143: "/M {moveto} bind def\n",
                    144: "/L {lineto} bind def\n",
                    145: "/R {rmoveto} bind def\n",
                    146: "/V {rlineto} bind def\n",
                    147: "/vpt2 vpt 2 mul def\n",
                    148: "/hpt2 hpt 2 mul def\n",
                    149: /* flush left show */
                    150: "/Lshow { currentpoint stroke M\n",
                    151: "  0 vshift R show } def\n",
                    152: /* flush right show */
                    153: "/Rshow { currentpoint stroke M\n",
                    154: "  dup stringwidth pop neg vshift R show } def\n",
                    155: /* centred show */
                    156: "/Cshow { currentpoint stroke M\n",
                    157: "  dup stringwidth pop -2 div vshift R show } def\n",
                    158: /* set pointsize */
                    159: "/UP { dup vpt_ mul /vpt exch def hpt_ mul /hpt exch def\n",
                    160: "  /hpt2 hpt 2 mul def /vpt2 vpt 2 mul def } def\n",
                    161: /* Dash or Color Line */
                    162: "/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }\n",
                    163: " {pop pop pop Solid {pop []} if 0 setdash} ifelse } def\n",
                    164: /* Border Lines */
                    165: "/BL { stroke gnulinewidth 2 mul setlinewidth } def\n",
                    166: /* Axes Lines */
                    167: "/AL { stroke gnulinewidth 2 div setlinewidth } def\n",
                    168: /* set user defined linewidth */
                    169: "/UL { gnulinewidth mul /userlinewidth exch def } def\n",
                    170: /* Plot Lines */
                    171: "/PL { stroke userlinewidth setlinewidth } def\n",
                    172: /* Line Types */
                    173: "/LTb { BL [] 0 0 0 DL } def\n", /* border */
                    174: "/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def\n", /* axes */
                    175: "/LT0 { PL [] 1 0 0 DL } def\n",
                    176: "/LT1 { PL [4 dl 2 dl] 0 1 0 DL } def\n",
                    177: "/LT2 { PL [2 dl 3 dl] 0 0 1 DL } def\n",
                    178: "/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def\n",
                    179: "/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def\n",
                    180: "/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def\n",
                    181: "/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def\n",
                    182: "/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def\n",
                    183: "/LT8 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 0.5 0.5 0.5 DL } def\n",
                    184: /* Point (Round) */    /* Matt Heffron make it round */
                    185: "/Pnt { stroke [] 0 setdash\n",
                    186: "   gsave 1 setlinecap M 0 0 V stroke grestore } def\n",
                    187:
                    188: /* Diamond */
                    189: "/Dia { stroke [] 0 setdash 2 copy vpt add M\n",
                    190: "  hpt neg vpt neg V hpt vpt neg V\n",
                    191: "  hpt vpt V hpt neg vpt V closepath stroke\n",
                    192: "  Pnt } def\n",
                    193:
                    194: /* Plus */
                    195: "/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V\n",
                    196: "  currentpoint stroke M\n",
                    197: "  hpt neg vpt neg R hpt2 0 V stroke\n",
                    198: "  } def\n",
                    199:
                    200: /* Box */
                    201: "/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M\n",
                    202: "  0 vpt2 neg V hpt2 0 V 0 vpt2 V\n",
                    203: "  hpt2 neg 0 V closepath stroke\n",
                    204: "  Pnt } def\n",
                    205:
                    206: /* Cross (X) */
                    207: "/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
                    208: "  hpt2 vpt2 neg V currentpoint stroke M\n",
                    209: "  hpt2 neg 0 R hpt2 vpt2 V stroke } def\n",
                    210:
                    211: /* Triangle Up*/
                    212: "/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M\n",
                    213: "  hpt neg vpt -1.62 mul V\n",
                    214: "  hpt 2 mul 0 V\n",
                    215: "  hpt neg vpt 1.62 mul V closepath stroke\n",
                    216: "  Pnt  } def\n",
                    217:
                    218: /* Star */
                    219: "/Star { 2 copy Pls Crs } def\n",
                    220:
                    221: /* div added filed box */
                    222: /* Filled Box */
                    223: "/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
                    224: "  0 vpt2 neg V  hpt2 0 V  0 vpt2 V\n",
                    225: "  hpt2 neg 0 V  closepath fill } def\n",
                    226:
                    227: /* div added filled triangle */
                    228: /* Triangle Up, Filled */
                    229: "/TriUF { stroke [] 0 setdash vpt 1.12 mul add M\n",
                    230: "  hpt neg vpt -1.62 mul V\n",
                    231: "  hpt 2 mul 0 V\n",
                    232: "  hpt neg vpt 1.62 mul V closepath fill } def\n",
                    233:
                    234: /* Matt Heffron: added a few more types */
                    235: /* Triangle Down */
                    236: "/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M\n",
                    237: "  hpt neg vpt 1.62 mul V\n",
                    238: "  hpt 2 mul 0 V\n",
                    239: "  hpt neg vpt -1.62 mul V closepath stroke\n",
                    240: "  Pnt  } def\n",
                    241:
                    242: /* Triangle Down, Filled*/
                    243: "/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M\n",
                    244: "  hpt neg vpt 1.62 mul V\n",
                    245: "  hpt 2 mul 0 V\n",
                    246: "  hpt neg vpt -1.62 mul V closepath fill} def\n",
                    247:
                    248: /* Diamond, Filled */
                    249: "/DiaF { stroke [] 0 setdash vpt add M\n",
                    250: "  hpt neg vpt neg V hpt vpt neg V\n",
                    251: "  hpt vpt V hpt neg vpt V closepath fill } def\n",
                    252:
                    253: /* Pentagon */
                    254: "/Pent { stroke [] 0 setdash 2 copy gsave\n",
                    255: "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
                    256: "  closepath stroke grestore Pnt } def\n",
                    257:
                    258: /* Pentagon, Filled */
                    259: "/PentF { stroke [] 0 setdash gsave\n",
                    260: "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
                    261: "  closepath fill grestore } def\n",
                    262:
                    263: /* Circle */
                    264: "/Circle { stroke [] 0 setdash 2 copy\n",
                    265: "  hpt 0 360 arc stroke Pnt } def\n",
                    266:
                    267: /* Circle,Filled */
                    268: "/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def\n",
                    269: /* 16 differently filled circles */
                    270: "/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450  arc } bind def\n",
                    271: "/C1 { BL [] 0 setdash 2 copy        moveto\n",
                    272: "       2 copy  vpt 0 90 arc closepath fill\n",
                    273: "               vpt 0 360 arc closepath } bind def\n",
                    274: "/C2 { BL [] 0 setdash 2 copy moveto\n",
                    275: "       2 copy  vpt 90 180 arc closepath fill\n",
                    276: "               vpt 0 360 arc closepath } bind def\n",
                    277: "/C3 { BL [] 0 setdash 2 copy moveto\n",
                    278: "       2 copy  vpt 0 180 arc closepath fill\n",
                    279: "               vpt 0 360 arc closepath } bind def\n",
                    280: "/C4 { BL [] 0 setdash 2 copy moveto\n",
                    281: "       2 copy  vpt 180 270 arc closepath fill\n",
                    282: "               vpt 0 360 arc closepath } bind def\n",
                    283: "/C5 { BL [] 0 setdash 2 copy moveto\n",
                    284: "       2 copy  vpt 0 90 arc\n",
                    285: "       2 copy moveto\n",
                    286: "       2 copy  vpt 180 270 arc closepath fill\n",
                    287: "               vpt 0 360 arc } bind def\n",
                    288: "/C6 { BL [] 0 setdash 2 copy moveto\n",
                    289: "      2 copy  vpt 90 270 arc closepath fill\n",
                    290: "              vpt 0 360 arc closepath } bind def\n",
                    291: "/C7 { BL [] 0 setdash 2 copy moveto\n",
                    292: "      2 copy  vpt 0 270 arc closepath fill\n",
                    293: "              vpt 0 360 arc closepath } bind def\n",
                    294: "/C8 { BL [] 0 setdash 2 copy moveto\n",
                    295: "      2 copy vpt 270 360 arc closepath fill\n",
                    296: "              vpt 0 360 arc closepath } bind def\n",
                    297: "/C9 { BL [] 0 setdash 2 copy moveto\n",
                    298: "      2 copy  vpt 270 450 arc closepath fill\n",
                    299: "              vpt 0 360 arc closepath } bind def\n",
                    300: "/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill\n",
                    301: "       2 copy moveto\n",
                    302: "       2 copy vpt 90 180 arc closepath fill\n",
                    303: "               vpt 0 360 arc closepath } bind def\n",
                    304: "/C11 { BL [] 0 setdash 2 copy moveto\n",
                    305: "       2 copy  vpt 0 180 arc closepath fill\n",
                    306: "       2 copy moveto\n",
                    307: "       2 copy  vpt 270 360 arc closepath fill\n",
                    308: "               vpt 0 360 arc closepath } bind def\n",
                    309: "/C12 { BL [] 0 setdash 2 copy moveto\n",
                    310: "       2 copy  vpt 180 360 arc closepath fill\n",
                    311: "               vpt 0 360 arc closepath } bind def\n",
                    312: "/C13 { BL [] 0 setdash  2 copy moveto\n",
                    313: "       2 copy  vpt 0 90 arc closepath fill\n",
                    314: "       2 copy moveto\n",
                    315: "       2 copy  vpt 180 360 arc closepath fill\n",
                    316: "               vpt 0 360 arc closepath } bind def\n",
                    317: "/C14 { BL [] 0 setdash 2 copy moveto\n",
                    318: "       2 copy  vpt 90 360 arc closepath fill\n",
                    319: "               vpt 0 360 arc } bind def\n",
                    320: "/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill\n",
                    321: "               vpt 0 360 arc closepath } bind def\n",
                    322:
                    323: /* Auxiliary definitions for rectangles */
                    324:
                    325: "/Rec   { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n",
                    326: "       neg 0 rlineto closepath } bind def\n",
                    327: "/Square { dup Rec } bind def\n",
                    328: "/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def\n",
                    329:
                    330: /* 16 differently filled squares */
                    331:
                    332: "/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def\n",
                    333: "/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def\n",
                    334: "/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def\n",
                    335: "/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def\n",
                    336: "/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def\n",
                    337: "/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill\n",
                    338: "       exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def\n",
                    339: "/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def\n",
                    340: "/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill\n",
                    341: "       2 copy vpt Square fill\n",
                    342: "       Bsquare } bind def\n",
                    343: "/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def\n",
                    344: "/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def\n",
                    345: "/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill\n",
                    346: "       Bsquare } bind def\n",
                    347: "/S11 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill\n",
                    348: "       Bsquare } bind def\n",
                    349: "/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def\n",
                    350: "/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill\n",
                    351: "       2 copy vpt Square fill Bsquare } bind def\n",
                    352: "/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill\n",
                    353: "       2 copy exch vpt sub exch vpt Square fill Bsquare } bind def\n",
                    354: "/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def\n",
                    355:
                    356: /* 16 different diamonds (actually just rotated squares) */
                    357:
                    358: "/D0 { gsave translate 45 rotate 0 0 S0 stroke grestore } bind def\n",
                    359: "/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def\n",
                    360: "/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def\n",
                    361: "/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def\n",
                    362: "/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def\n",
                    363: "/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def\n",
                    364: "/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def\n",
                    365: "/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def\n",
                    366: "/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def\n",
                    367: "/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def\n",
                    368: "/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def\n",
                    369: "/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def\n",
                    370: "/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def\n",
                    371: "/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def\n",
                    372: "/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def\n",
                    373: "/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def\n",
                    374:
                    375: /* closed figures w/o the point in the middle (added by Dick Crawford) */
                    376:
                    377: /* Diamond */
                    378: "/DiaE { stroke [] 0 setdash vpt add M\n",
                    379: "  hpt neg vpt neg V hpt vpt neg V\n",
                    380: "  hpt vpt V hpt neg vpt V closepath stroke } def\n",
                    381:
                    382: /* Box */
                    383: "/BoxE { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
                    384: "  0 vpt2 neg V hpt2 0 V 0 vpt2 V\n",
                    385: "  hpt2 neg 0 V closepath stroke } def\n",
                    386:
                    387: /* Triangle Up*/
                    388: "/TriUE { stroke [] 0 setdash vpt 1.12 mul add M\n",
                    389: "  hpt neg vpt -1.62 mul V\n",
                    390: "  hpt 2 mul 0 V\n",
                    391: "  hpt neg vpt 1.62 mul V closepath stroke } def\n",
                    392:
                    393: /* Triangle Down */
                    394: "/TriDE { stroke [] 0 setdash vpt 1.12 mul sub M\n",
                    395: "  hpt neg vpt 1.62 mul V\n",
                    396: "  hpt 2 mul 0 V\n",
                    397: "  hpt neg vpt -1.62 mul V closepath stroke } def\n",
                    398:
                    399: /* Pentagon */
                    400: "/PentE { stroke [] 0 setdash gsave\n",
                    401: "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
                    402: "  closepath stroke grestore } def\n",
                    403:
                    404: /* Circle */
                    405: "/CircE { stroke [] 0 setdash \n",
                    406: "  hpt 0 360 arc stroke } def\n",
                    407:
                    408: /* opaque closed figures w/o the point in the middle (added by Dick Crawford) */
                    409:
                    410: "/Opaque { gsave closepath 1 setgray fill grestore 0 setgray closepath } def\n",
                    411:
                    412: /* Diamond */
                    413: "/DiaW { stroke [] 0 setdash vpt add M\n",
                    414: "  hpt neg vpt neg V hpt vpt neg V\n",
                    415: "  hpt vpt V hpt neg vpt V Opaque stroke } def\n",
                    416:
                    417: /* Box */
                    418: "/BoxW { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
                    419: "  0 vpt2 neg V hpt2 0 V 0 vpt2 V\n",
                    420: "  hpt2 neg 0 V Opaque stroke } def\n",
                    421:
                    422: /* Triangle Up*/
                    423: "/TriUW { stroke [] 0 setdash vpt 1.12 mul add M\n",
                    424: "  hpt neg vpt -1.62 mul V\n",
                    425: "  hpt 2 mul 0 V\n",
                    426: "  hpt neg vpt 1.62 mul V Opaque stroke } def\n",
                    427:
                    428: /* Triangle Down */
                    429: "/TriDW { stroke [] 0 setdash vpt 1.12 mul sub M\n",
                    430: "  hpt neg vpt 1.62 mul V\n",
                    431: "  hpt 2 mul 0 V\n",
                    432: "  hpt neg vpt -1.62 mul V Opaque stroke } def\n",
                    433:
                    434: /* Pentagon */
                    435: "/PentW { stroke [] 0 setdash gsave\n",
                    436: "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
                    437: "  Opaque stroke grestore } def\n",
                    438:
                    439: /* Circle */
                    440: "/CircW { stroke [] 0 setdash \n",
                    441: "  hpt 0 360 arc Opaque stroke } def\n",
                    442:
                    443: /* filled box : usage   x1 y1 x2 y2 BoxFill */
                    444: "/BoxFill { gsave Rec 1 setgray fill grestore } def\n",
                    445:
                    446: NULL
                    447: };
                    448:
                    449: static char GPFAR * GPFAR ENHPS_header[] = {
                    450: /* For MFshow and MFwidth the tos is an array with the string and font info:  */
                    451: /*     [<fontname (a string)> <fontsize> <vertical offset> <width significant?> <printed?> <text string>]  */
                    452:
                    453: "/MFshow {{dup dup 0 get findfont exch 1 get scalefont setfont\n",
                    454: "     [ currentpoint ] exch dup 2 get 0 exch rmoveto dup dup 5 get exch 4 get\n",
                    455: "     {show} {stringwidth pop 0 rmoveto}ifelse dup 3 get\n",
                    456: "     {2 get neg 0 exch rmoveto pop} {pop aload pop moveto}ifelse} forall} bind def\n",
                    457: "/MFwidth {0 exch {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont\n",
                    458: "      5 get stringwidth pop add}\n",
                    459: "    {pop} ifelse} forall} bind def\n",
                    460:
                    461: /* flush left show */
                    462: "/MLshow { currentpoint stroke M\n",
                    463: "  0 exch R MFshow } bind def\n",
                    464:
                    465: /* flush right show */
                    466: "/MRshow { currentpoint stroke M\n",
                    467: "  exch dup MFwidth neg 3 -1 roll R MFshow } def\n",
                    468:
                    469: /* centred show */
                    470: "/MCshow { currentpoint stroke M\n",
                    471: "  exch dup MFwidth -2 div 3 -1 roll R MFshow } def\n",
                    472: NULL
                    473: };
                    474:
                    475: /* added to enhpost by Matt Heffron <heffron@falstaff.css.beckman.com> */
                    476: /* moved to post.trm by drd */
                    477:
                    478: static struct PS_FontName {
                    479:        char *name;
                    480:        struct PS_FontName *next;
                    481: } *PS_DocFonts = NULL;
                    482:
                    483: /* given a font, look in store to see if it is there already
                    484:  * if so, return NULL. If not, reencode it if allowed to, otherwise
                    485:  * return an appropriate re-encode string
                    486:  */
                    487:
                    488: TERM_PUBLIC char *PS_RememberFont(fname, can_reencode)
                    489: char *fname;
                    490: int can_reencode;
                    491: {
                    492:        struct PS_FontName *fnp;
                    493:        char *recode = NULL;
                    494:
                    495:    for (fnp=PS_DocFonts; fnp ; fnp = fnp->next)
                    496:                if (strcmp(fnp->name, fname)==0)
                    497:                        return NULL;
                    498:
                    499:        /* we did not find the name */
                    500:
                    501:    fnp = (struct PS_FontName *)gp_alloc(sizeof(struct PS_FontName), "PostScript Font record");
                    502:    fnp->name = gp_alloc(1+strlen(fname), "PostScript Font name");
                    503:    strcpy(fnp->name, fname);
                    504:    fnp->next = PS_DocFonts;
                    505:    PS_DocFonts = fnp;
                    506:
                    507:        switch(encoding)
                    508:        {
                    509:                case ENCODING_ISO_8859_1:
                    510:                        recode = "reencodeISO def\n";
                    511:                        break;
                    512:                case ENCODING_CP_437:
                    513:                        recode = "reencodeCP437 def\n";
                    514:                        break;
                    515:                case ENCODING_CP_850 :
                    516:                        recode = "reencodeCP850 def\n";
                    517:                        break;
                    518:        }
                    519:
                    520:        if (can_reencode && recode)
                    521:        {       fprintf(gpoutfile,"/%s %s",fname, recode);
                    522:                return NULL;
                    523:        }
                    524:        else
                    525:                return recode;
                    526: }
                    527:
                    528: static int PS_pen_x, PS_pen_y;
                    529: static int PS_taken;
                    530: static int PS_linetype_last;
                    531: static TBOOLEAN PS_relative_ok;
                    532:
                    533: TERM_PUBLIC void PS_options()
                    534: {
                    535:        if (!END_OF_COMMAND) {
                    536:                if (almost_equals(c_token,"p$ortrait")) {
                    537:                        ps_portrait=TRUE;
                    538:                        ps_eps=FALSE;
                    539:                        c_token++;
                    540:                }
                    541:                else if (almost_equals(c_token,"l$andscape")) {
                    542:                        ps_portrait=FALSE;
                    543:                        ps_eps=FALSE;
                    544:                        c_token++;
                    545:                }
                    546:                else if (almost_equals(c_token,"ep$sf")) {
                    547:                        ps_portrait=TRUE;
                    548:                        ps_eps = TRUE;
                    549:                        c_token++;
                    550:                }
                    551:                else if (almost_equals(c_token,"d$efault")) {
                    552:                        ps_portrait=FALSE;
                    553:                        ps_eps=FALSE;
                    554:                        ps_color=FALSE;
                    555:                        ps_solid=FALSE;
                    556:                        ps_duplex_option=FALSE;
                    557:                        strcpy(ps_font,"Helvetica");
                    558:                        ps_fontsize = 14;
                    559:                        term->v_char = (unsigned int)(ps_fontsize*PS_SC);
                    560:                        term->h_char = (unsigned int)(ps_fontsize*PS_SC*6/10);
                    561:                        term->put_text = PS_put_text;
                    562:                        c_token++;
                    563:                }
                    564:        }
                    565:
                    566:        if (almost_equals(c_token, "enh$anced")) {
                    567:                term->put_text = ENHPS_put_text;
                    568:                term->set_font = ENHPS_set_font;
                    569:                ++c_token;
                    570:        } else if (almost_equals(c_token, "noenh$anced")) {
                    571:                term->put_text = PS_put_text;
                    572:                term->set_font = PS_set_font;
                    573:                ++c_token;
                    574:        }
                    575:
                    576:        if (!END_OF_COMMAND) {
                    577:                if (almost_equals(c_token,"m$onochrome")) {
                    578:                        ps_color=FALSE;
                    579:                        c_token++;
                    580:                }
                    581:                else if (almost_equals(c_token,"c$olor")
                    582:                         || almost_equals(c_token,"c$olour")) {
                    583:                        ps_color=TRUE;
                    584:                        c_token++;
                    585:                }
                    586:        }
                    587:
                    588:        if (!END_OF_COMMAND) {
                    589:                if (almost_equals(c_token,"so$lid")) {
                    590:                        ps_solid=TRUE;
                    591:                        c_token++;
                    592:                }
                    593:                else if (almost_equals(c_token,"da$shed")) {
                    594:                        ps_solid=FALSE;
                    595:                        c_token++;
                    596:                }
                    597:        }
                    598:
                    599:        if (!END_OF_COMMAND) {
                    600:                if (almost_equals(c_token,"si$mplex")) {
                    601:                        ps_duplex_state  = FALSE;
                    602:                        ps_duplex_option = TRUE;
                    603:                        c_token++;
                    604:                }
                    605:                else if (almost_equals(c_token,"du$plex")) {
                    606:                        ps_duplex_state  = TRUE;
                    607:                        ps_duplex_option = TRUE;
                    608:                        c_token++;
                    609:                }
                    610:                else if (almost_equals(c_token,"defaultp$lex")) {
                    611:                        ps_duplex_option = FALSE;
                    612:                        c_token++;
                    613:                }
                    614:        }
                    615:
                    616:        if (!END_OF_COMMAND && isstring(c_token)) {
                    617:                quote_str(ps_font,c_token, MAX_ID_LEN);
                    618:                c_token++;
                    619:        }
                    620:
                    621:        if (!END_OF_COMMAND) {
                    622:                /* We have font size specified */
                    623:                struct value a;
                    624:                ps_fontsize = (int)real(const_express(&a));
                    625:                term->v_char = (unsigned int)(ps_fontsize*PS_SC);
                    626:                term->h_char = (unsigned int)(ps_fontsize*PS_SC*6/10);
                    627:        }
                    628:
                    629:        sprintf(default_font,"%s,%d",ps_font,ps_fontsize);
                    630:        /* default_font holds the font and size set at 'set term' */
                    631:        /* Entry font added by DJL */
                    632:        sprintf(term_options,"%s %senhanced %s %s %s \"%s\" %d",
                    633:                ps_eps ? "eps" : (ps_portrait ? "portrait" : "landscape"),
                    634:       term->put_text == ENHPS_put_text ? "" : "no",
                    635:                ps_color ? "color" : "monochrome",
                    636:                ps_solid ? "solid" : "dashed",
                    637:                ps_duplex_option ? (ps_duplex_state ? "duplex" : "simplex")
                    638:                                     : "defaultplex",
                    639:                ps_font,ps_fontsize);
                    640: }
                    641:
                    642: /* store settings passed to common_init() for use in PS_graphics()
                    643:  * ps_eps, ps_portrait, etc are reserved for storing the term options
                    644:  */
                    645: static int ps_common_encap;
                    646: static int ps_common_portrait;
                    647: static int ps_common_uses_fonts;
                    648: static unsigned int ps_common_xoff, ps_common_yoff;
                    649:
                    650:
                    651: TERM_PUBLIC void PS_common_init(encap, portrait, uses_fonts, xoff, yoff, bb_xmin, bb_ymin, bb_xmax, bb_ymax, dict)
                    652: int encap; /* encapsulated or not - 1 for pslatex */
                    653: int portrait; /* 1 for pslatex */
                    654: int uses_fonts; /* 0 for ps(la)tex */
                    655: unsigned int xoff, yoff; /* how much to translate by */
                    656: unsigned int bb_xmin, bb_ymin, bb_xmax, bb_ymax; /* bounding box */
                    657: char **dict; /* extra entries for the dictionary */
                    658: {
                    659: static char GPFAR psi1[] = "%%%%Creator: gnuplot %s patchlevel %s\n\
                    660: %%%%CreationDate: %s\
                    661: %%%%DocumentFonts: %s\n";
                    662: static char GPFAR psi2[] = "%%%%EndComments\n\
                    663: /gnudict 256 dict def\ngnudict begin\n\
                    664: /Color %s def\n\
                    665: /Solid %s def\n\
                    666: /gnulinewidth %.3f def\n\
                    667: /userlinewidth gnulinewidth def\n\
                    668: /vshift %d def\n\
                    669: /dl {%d mul} def\n\
                    670: /hpt_ %.1f def\n\
                    671: /vpt_ %.1f def\n\
                    672: /hpt hpt_ def\n\
                    673: /vpt vpt_ def\n";
                    674: static char GPFAR * GPFAR PS_iso_8859_1_encoding[] = {
                    675: "/reencodeISO {\n",
                    676: "dup dup findfont dup length dict begin\n",
                    677: "{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n",
                    678: "currentdict /CharStrings known {\n",
                    679: "\tCharStrings /Idieresis known {\n",
                    680: "\t\t/Encoding ISOLatin1Encoding def } if\n} if\n",
                    681: "currentdict end definefont\n",
                    682: "} def\n",
                    683: "/ISOLatin1Encoding [\n",
                    684: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    685: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    686: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    687: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    688: "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n",
                    689: "/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n",
                    690: "/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n",
                    691: "/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n",
                    692: "/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n",
                    693: "/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n",
                    694: "/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde\n",
                    695: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    696: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    697: "/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve\n",
                    698: "/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut\n",
                    699: "/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar\n",
                    700: "/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot\n",
                    701: "/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior\n",
                    702: "/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine\n",
                    703: "/guillemotright/onequarter/onehalf/threequarters/questiondown\n",
                    704: "/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla\n",
                    705: "/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex\n",
                    706: "/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis\n",
                    707: "/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute\n",
                    708: "/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis\n",
                    709: "/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave\n",
                    710: "/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex\n",
                    711: "/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n",
                    712: "/yacute/thorn/ydieresis\n",
                    713: "] def\n",
                    714: NULL };
                    715:
                    716: /*   encoding for code page 437                                            */
                    717: /*                                                                         */
                    718: /*   version 1.0:  - Mainly letters are mapped. The following positions    */
                    719: /*   (JFi)           are left blank (undefined):                           */
                    720: /*                   -- first 32 positions,                                */
                    721: /*                   -- frame characters,                                  */
                    722: /*                   -- greek characters,                                  */
                    723: /*                   -- some more special characters.                      */
                    724: /*                                                                         */
                    725: /*   version 1.1:  - added some more special characters                    */
                    726: /*                                                                         */
                    727: static char GPFAR * GPFAR PS_cp_437_encoding[] = {
                    728: "/reencodeCP437 {\n",
                    729: "dup dup findfont dup length dict begin\n",
                    730: "{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n",
                    731: "currentdict /CharStrings known {\n",
                    732: "\tCharStrings /Idieresis known {\n",
                    733: "\t\t/Encoding CP437Encoding def } if\n} if\n",
                    734: "currentdict end definefont\n",
                    735: "} def\n",
                    736: "/CP437Encoding [\n",
                    737: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    738: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    739: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    740: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    741: "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n",
                    742: "/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n",
                    743: "/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n",
                    744: "/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n",
                    745: "/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n",
                    746: "/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n",
                    747: "/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/.notdef\n",
                    748: "/Ccedilla/udieresis/eacute/acircumflex/adieresis/agrave/aring/ccedilla\n",
                    749: "/ecircumflex/edieresis/egrave/idieresis/icircumflex/igrave/Adieresis/Aring\n",
                    750: "/Eacute/ae/AE/ocircumflex/odieresis/ograve/ucircumflex/ugrave\n",
                    751: "/ydieresis/Odieresis/Udieresis/cent/sterling/yen/.notdef/florin\n",
                    752: "/aacute/iacute/oacute/uacute/ntilde/Ntilde/ordfeminine/ordmasculine\n",
                    753: "/questiondown/.notdef/logicalnot/onehalf/onequarter/exclamdown/guillemotleft/guillemotright\n",
                    754: "/space/space/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    755: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    756: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    757: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    758: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    759: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    760: "/.notdef/germandbls/.notdef/.notdef/.notdef/.notdef/mu/.notdef\n",
                    761: "/.notdef/.notdef/.notdef/.notdef/infinity/.notdef/.notdef/.notdef\n",
                    762: "/.notdef/plusminus/greaterequal/lessequal/.notdef/.notdef/divide/.notdef\n",
                    763: "/degree/bullet/periodcentered/.notdef/nsuperior/twosuperior/.notdef\n",
                    764: "] def\n",
                    765: NULL };
                    766:
                    767: /*   encoding for code page 850                                            */
                    768: /*                                                                         */
                    769: /*   version 1.0:  - Mainly letters are mapped. The following positions    */
                    770: /*   (JFi)           are left blank (undefined):                           */
                    771: /*                   -- first 32 positions,                                */
                    772: /*                   -- frame characters,                                  */
                    773: /*                   -- a few special characters.                          */
                    774: /*                                                                         */
                    775: static char GPFAR * GPFAR PS_cp_850_encoding[] = {
                    776: "/reencodeCP850 {\n",
                    777: "dup dup findfont dup length dict begin\n",
                    778: "{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n",
                    779: "currentdict /CharStrings known {\n",
                    780: "\tCharStrings /Idieresis known {\n",
                    781: "\t\t/Encoding CP850Encoding def } if\n} if\n",
                    782: "currentdict end definefont\n",
                    783: "} def\n",
                    784: "/CP850Encoding [\n",
                    785: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    786: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    787: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    788: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    789: "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n",
                    790: "/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n",
                    791: "/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n",
                    792: "/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n",
                    793: "/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n",
                    794: "/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n",
                    795: "/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde/.notdef\n",
                    796: "/Ccedilla/udieresis/eacute/acircumflex/adieresis/agrave/aring/ccedilla\n",
                    797: "/ecircumflex/edieresis/egrave/idieresis/icircumflex/igrave/Adieresis/Aring\n",
                    798: "/Eacute/ae/AE/ocircumflex/odieresis/ograve/ucircumflex/ugrave\n",
                    799: "/ydieresis/Odieresis/Udieresis/oslash/sterling/Oslash/multiply/florin\n",
                    800: "/aacute/iacute/oacute/uacute/ntilde/Ntilde/ordfeminine/ordmasculine\n",
                    801: "/questiondown/registered/logicalnot/onehalf/onequarter/exclamdown/guillemotleft/guillemotright\n",
                    802: "/space/space/.notdef/.notdef/.notdef/Aacute/Acircumflex/Agrave\n",
                    803: "/.notdef/.notdef/.notdef/.notdef/.notdef/cent/yen/.notdef\n",
                    804: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/atilde/Atilde\n",
                    805: "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/currency\n",
                    806: "/eth/Eth/Ecircumflex/Edieresis/Egrave/dotlessi/Iacute/Icircumflex\n",
                    807: "/Idieresis/.notdef/.notdef/.notdef/.notdef/brokenbar/Igrave/.notdef\n",
                    808: "/Oacute/germandbls/Ocircumflex/Ograve/otilde/Otilde/mu/thorn\n",
                    809: "/Thorn/Uacute/Ucircumflex/Ugrave/yacute/Yacute/macron/acute\n",
                    810: "/hyphen/plusminus/equal/threequarters/paragraph/section/divide/.notdef\n",
                    811: "/degree/.notdef/periodcentered/onesuperior/threesuperior/twosuperior/.notdef\n",
                    812: "] def\n",
                    813: NULL };
                    814:
                    815:        struct termentry *t = term;
                    816:        int i;
                    817:         time_t now;
                    818:
                    819:        ps_common_encap = encap; /* store for later */
                    820:        ps_common_portrait = portrait; /* store for later */
                    821:        ps_common_uses_fonts = uses_fonts;
                    822:        ps_common_xoff = xoff;
                    823:        ps_common_yoff = yoff;
                    824:
                    825:        ps_page = 0;
                    826:
                    827:        if (!encap)
                    828:                fprintf(gpoutfile,"%%!PS-Adobe-2.0\n");
                    829:        else
                    830:                fprintf(gpoutfile,"%%!PS-Adobe-2.0 EPSF-2.0\n");
                    831:
                    832:        if (outstr) fprintf(gpoutfile, "%%%%Title: %s\n", outstr );             /*  JFi  */
                    833:        time(&now);
                    834:        fprintf(gpoutfile, psi1, version, patchlevel, asctime(localtime(&now)), uses_fonts ? "(atend)" : "");
                    835:
                    836:        fprintf(gpoutfile,"%%%%BoundingBox: %d %d %d %d\n", xoff + bb_xmin, yoff + bb_ymin, xoff + bb_xmax, yoff + bb_ymax);
                    837:
                    838:        fprintf(gpoutfile,"%%%%Orientation: %s\n", ps_portrait ? "Portrait" : "Landscape");
                    839:
                    840:        if (!encap)
                    841:                fprintf(gpoutfile,"%%%%Pages: (atend)\n");
                    842:        fprintf(gpoutfile, psi2,
                    843:                ps_color ? "true" : "false",
                    844:                ps_solid ? "true" : "false",
                    845:                PS_LW,                  /* line width */
                    846:                (int)(t->v_char)/(-3),  /* shift for vertical centring */
                    847:                PS_SC,                  /* dash length */
                    848:                PS_HTIC/2.0,            /* half point width */
                    849:                PS_VTIC/2.0);           /* half point height */
                    850:
                    851:        if (uses_fonts && (encoding == ENCODING_ISO_8859_1)) {
                    852:                for (i=0; PS_iso_8859_1_encoding[i] != NULL; i++) {
                    853:                        fprintf(gpoutfile,"%s",PS_iso_8859_1_encoding[i]);
                    854:                }
                    855:        }
                    856:        if (uses_fonts && (encoding == ENCODING_CP_437)) {       /* JFi */
                    857:                for (i=0; PS_cp_437_encoding[i] != NULL; i++) {
                    858:                        fprintf(gpoutfile,"%s",PS_cp_437_encoding[i]);
                    859:                }
                    860:        }
                    861:        if (uses_fonts && (encoding == ENCODING_CP_850)) {       /* JFi */
                    862:                for (i=0; PS_cp_850_encoding[i] != NULL; i++) {
                    863:                        fprintf(gpoutfile,"%s",PS_cp_850_encoding[i]);
                    864:                }
                    865:        }
                    866: /*        Duplicate code!
                    867:           As long as only two code pages are implemented, that's not a big
                    868:           problem. Otherwise a small procedure might be beneficial.
                    869: */
                    870:
                    871:        for ( i=0; PS_header[i] != NULL; i++)
                    872:                fprintf(gpoutfile,"%s",PS_header[i]);
                    873:        if (ps_duplex_option)
                    874:                fprintf(gpoutfile, "statusdict begin %s setduplexmode end\n",
                    875:                                ps_duplex_state ? "true" : "false");
                    876:        PS_RememberFont(ps_font, 1);
                    877:
                    878:        if (dict)
                    879:                while (*dict)
                    880:                        fputs(*(dict++), gpoutfile);
                    881:
                    882:        fprintf(gpoutfile,"end\n%%%%EndProlog\n");
                    883: }
                    884:
                    885: /* the init fn for the postscript driver */
                    886: TERM_PUBLIC void PS_init()
                    887: {
                    888:        unsigned int xmin_t, ymin_t, xmax_t, ymax_t;
                    889:
                    890:        if (ps_eps)
                    891:        {
                    892:                term->xmax = PS_XMAX;
                    893:                term->ymax = PS_YMAX;
                    894:                xmin_t = PS_XMAX * xoffset / (2*PS_SC);
                    895:                xmax_t = PS_XMAX * (xsize + xoffset) / (2*PS_SC);
                    896:                ymin_t = PS_YMAX * yoffset / (2*PS_SC);
                    897:                ymax_t = PS_YMAX * (yoffset + ysize) / (2*PS_SC);
                    898:        }
                    899:        else if (ps_portrait)
                    900:        {
                    901:                term->xmax = PS_YMAX;
                    902:                term->ymax = PS_XMAX;
                    903:                xmin_t = PS_YMAX * xoffset / PS_SC;
                    904:                xmax_t = PS_YMAX * (xsize + xoffset) / PS_SC;
                    905:                ymin_t = PS_XMAX * yoffset / PS_SC;
                    906:                ymax_t = PS_XMAX * (ysize + yoffset) / PS_SC;
                    907:        }
                    908:        else
                    909:        {
                    910:                term->xmax = PS_XMAX;
                    911:                term->ymax = PS_YMAX;
                    912:                ymin_t = PS_XMAX * xoffset / PS_SC;
                    913:                ymax_t = PS_XMAX * (xsize+xoffset) / PS_SC;
                    914:                xmin_t = PS_YMAX * (1-ysize-yoffset) / PS_SC;
                    915:                xmax_t = PS_YMAX * (1-yoffset) / PS_SC;
                    916:        }
                    917:
                    918:        /* for enhanced postscript, copy ps_font to ps_enh_font
                    919:         * does no harm for non-enhanced
                    920:         */
                    921:        strcpy(ps_enh_font, ps_font);
                    922:        ps_enh_fontsize = ps_fontsize;
                    923:
                    924:        PS_common_init(ps_eps, ps_portrait, 1, PS_XOFF, PS_YOFF,
                    925:           xmin_t, ymin_t, xmax_t, ymax_t,
                    926:           (term->put_text == ENHPS_put_text) ? ENHPS_header : NULL);
                    927: }
                    928:
                    929:
                    930: TERM_PUBLIC void PS_graphics()
                    931: {
                    932: static char GPFAR psg1[] = "0 setgray\nnewpath\n";
                    933: struct termentry *t = term;
                    934:        ps_page++;
                    935:        if (!ps_common_encap)
                    936:                fprintf(gpoutfile,"%%%%Page: %d %d\n",ps_page,ps_page);
                    937:        fprintf(gpoutfile,"gnudict begin\ngsave\n");
                    938:        fprintf(gpoutfile,"%d %d translate\n",ps_common_xoff, ps_common_yoff);
                    939:        fprintf(gpoutfile,"%.3f %.3f scale\n", (ps_eps ? 0.5 : 1.0)/PS_SC,
                    940:                                             (ps_eps ? 0.5 : 1.0)/PS_SC);
                    941:        if (!ps_common_portrait) {
                    942:            fprintf(gpoutfile,"90 rotate\n0 %d translate\n", (int)(-PS_YMAX));
                    943:        }
                    944:        fprintf(gpoutfile, psg1);
                    945:        if (ps_common_uses_fonts)
                    946:                fprintf(gpoutfile, "(%s) findfont %d scalefont setfont\n", ps_font, (t->v_char) );
                    947:        ps_path_count = 0;
                    948:        PS_relative_ok = FALSE;
                    949:        PS_pen_x = PS_pen_y = -4000;
                    950:        PS_taken = 0;
                    951:        PS_linetype_last = -1;
                    952: }
                    953:
                    954:
                    955: TERM_PUBLIC void PS_text()
                    956: {
                    957:        ps_path_count = 0;
                    958:        fprintf(gpoutfile,"stroke\ngrestore\nend\nshowpage\n");
                    959:        /* fprintf(stderr,"taken %d times\n",PS_taken); */
                    960:        /* informational:  tells how many times it was "cheaper"
                    961:           to do a relative moveto or lineto rather than an
                    962:           absolute one */
                    963: }
                    964:
                    965:
                    966: TERM_PUBLIC void PS_reset()
                    967: {
                    968:        fprintf(gpoutfile,"%%%%Trailer\n");
                    969:
                    970: /*      I think the following commands should be executed
                    971:         `if (ps_common_uses_fonts)`. So I changed the next line.
                    972:         Please see "PS_RememberFont", too.                       */  /* JFi */
                    973:
                    974: /*     if (!ps_common_uses_fonts) {  */                             /* JFi */
                    975:        if (ps_common_uses_fonts) {
                    976:                fprintf(gpoutfile,"%%%%DocumentFonts: ");
                    977:                while (PS_DocFonts) {
                    978:                    struct PS_FontName *fnp;
                    979:                        fnp = PS_DocFonts->next;
                    980:                        fprintf(gpoutfile, "%s%s", PS_DocFonts->name, fnp ? " " : "\n");
                    981:                        free(PS_DocFonts->name);
                    982:                        free(PS_DocFonts);
                    983:                        PS_DocFonts=fnp;
                    984:                }
                    985:        }
                    986:        if (!ps_common_encap)
                    987:                fprintf(gpoutfile,"%%%%Pages: %d\n",ps_page);
                    988: }
                    989:
                    990:
                    991: TERM_PUBLIC void PS_linetype(linetype)
                    992: int linetype;
                    993: {
                    994:        linetype = (linetype % 9) + 2;
                    995:        if (linetype < 0) linetype = 0;
                    996:        PS_relative_ok = FALSE;
                    997: #if 0
                    998:        /*  In order to make 'PS_linewidth' work properly, I need to comment
                    999:         *  this line out.  Especially in combination with the line width
                   1000:         *  extension of the `set arrow` command this is necessary.
                   1001:         *  Can we live with that drawback?  (JFi)
                   1002:         */
                   1003:        if (PS_linetype_last == linetype) return;
                   1004: #endif
                   1005:        PS_linetype_last = linetype;
                   1006:        fprintf(gpoutfile,"LT%c\n", "ba012345678"[linetype]);
                   1007:        ps_path_count = 0;
                   1008: }
                   1009:
                   1010:
                   1011: TERM_PUBLIC void PS_linewidth (linewidth)
                   1012: double linewidth;
                   1013: {
                   1014:         fprintf(gpoutfile,"%.3f UL\n",linewidth);
                   1015:
                   1016: /*
                   1017:   Documentation of the 'change linewidth' strategy of the postscript terminal:
                   1018:
                   1019:   1. define a new postscript variable with a default value:
                   1020:      /userlinewidth gnulinewidth def
                   1021:
                   1022:   2. define a new postscript command to change the contents of that variable:
                   1023:      /UL { gnulinewidth mul /userlinewidth exch def } def
                   1024:      usage:  multiplication_factor UL
                   1025:
                   1026:   3. modify the already known postscript command /PL for the plot lines:
                   1027:      /PL { stroke userlinewidth setlinewidth } def
                   1028:
                   1029:   4. issue the new command before every change of the plot linestyle:
                   1030:      example:
                   1031:          4.0 UL
                   1032:          LT0
                   1033:      result:
                   1034:          Linetype 0 is drawn four times as thick as defined by the contents
                   1035:          of the postscript variable 'gnulinewidth'.
                   1036: */
                   1037: }
                   1038:
                   1039:
                   1040: TERM_PUBLIC void PS_pointsize (ptsize)
                   1041: double ptsize;
                   1042: {
                   1043:         fprintf(gpoutfile,"%.3f UP\n",ptsize);
                   1044:
                   1045: /*
                   1046:   Documentation of the 'change pointsize' strategy of the postscript terminal:
                   1047:
                   1048:   1. define two new postscript variables to hold the overall pointsize:
                   1049:      /hpt_  and  /vpt_
                   1050:
                   1051:   2. define a new postscript command to use the contents of these variables:
                   1052:      /UP { cf. definition above } def
                   1053:      usage:  multiplication_factor UP
                   1054:
                   1055:  [3.] [doesn't exist, skip to next number]
                   1056:
                   1057:   4. issue the new command whereever you change the symbols (and linetype):
                   1058:      example:
                   1059:          2.5 UP
                   1060:          4.0 UL  % optionally change linewidth, too
                   1061:          LT0
                   1062:      result:
                   1063:          Next symbols will be drawn 2.5 times as big as defined by the
                   1064:          GNUPLOT `set pointsize` command (= overall pointsize).
                   1065: */
                   1066: }
                   1067:
                   1068:
                   1069: TERM_PUBLIC void PS_move(x,y)
                   1070: unsigned int x,y;
                   1071: {
                   1072:        int dx, dy;
                   1073:        /* Make this semi-dynamic and independent of architecture */
                   1074:        char abso[5+2*INT_STR_LEN], rel[5+2*INT_STR_LEN];
                   1075:        dx = x - PS_pen_x;
                   1076:        dy = y - PS_pen_y;
                   1077:        /* can't cancel all null moves--need a move after stroke'ing */
                   1078:        if (dx==0 && dy==0 && PS_relative_ok)
                   1079:                return;
                   1080:        sprintf(abso, "%d %d M\n", x, y);
                   1081:        sprintf(rel, "%d %d R\n", dx, dy);
                   1082:        if (strlen(rel) < strlen(abso) && PS_relative_ok){
                   1083:                fputs(rel, gpoutfile);
                   1084:                PS_taken++;
                   1085:        }else
                   1086:                fputs(abso, gpoutfile);
                   1087:        PS_relative_ok = TRUE;
                   1088:        ps_path_count += 1;
                   1089:
                   1090:        PS_pen_x = x;
                   1091:        PS_pen_y = y;
                   1092: }
                   1093:
                   1094: TERM_PUBLIC void PS_vector(x,y)
                   1095: unsigned int x,y;
                   1096: {
                   1097:        int dx, dy;
                   1098:        char abso[5+2*INT_STR_LEN], rel[5+2*INT_STR_LEN];
                   1099:        dx = x - PS_pen_x;
                   1100:        dy = y - PS_pen_y;
                   1101:        if (dx==0 && dy==0) return;
                   1102:        sprintf(abso, "%d %d L\n", x, y);
                   1103:        sprintf(rel, "%d %d V\n", dx, dy);
                   1104:        if (strlen(rel) < strlen(abso) && PS_relative_ok){
                   1105:                fputs(rel, gpoutfile);
                   1106:                PS_taken++;
                   1107:        }else
                   1108:                fputs(abso, gpoutfile);
                   1109:        PS_relative_ok = TRUE;
                   1110:        ps_path_count += 1;
                   1111:        PS_pen_x = x;
                   1112:        PS_pen_y = y;
                   1113:        if (ps_path_count >= 400) {
                   1114:                fprintf(gpoutfile,"currentpoint stroke M\n");
                   1115:                ps_path_count = 0;
                   1116:        }
                   1117: }
                   1118:
                   1119:
                   1120: TERM_PUBLIC void PS_put_text(x,y,str)
                   1121: unsigned int x, y;
                   1122: char *str;
                   1123: {
                   1124: char ch;
                   1125:        if (!strlen(str)) return;
                   1126:        PS_move(x,y);
                   1127:        if (ps_ang != 0)
                   1128:                fprintf(gpoutfile,"currentpoint gsave translate %d rotate 0 0 M\n"
                   1129:                        ,ps_ang*90);
                   1130:        putc('(',gpoutfile);
                   1131:        ch = *str++;
                   1132:        while(ch!='\0') {
                   1133:                if ( (ch=='(') || (ch==')') || (ch=='\\') )
                   1134:                        putc('\\',gpoutfile);
                   1135:                putc(ch,gpoutfile);
                   1136:                ch = *str++;
                   1137:        }
                   1138:        switch(ps_justify) {
                   1139:                case LEFT : fprintf(gpoutfile,") Lshow\n");
                   1140:                        break;
                   1141:                case CENTRE : fprintf(gpoutfile,") Cshow\n");
                   1142:                        break;
                   1143:                case RIGHT : fprintf(gpoutfile,") Rshow\n");
                   1144:                        break;
                   1145:        }
                   1146:        if (ps_ang != 0)
                   1147:                fprintf(gpoutfile,"grestore\n");
                   1148:        ps_path_count = 0;
                   1149:        PS_relative_ok = FALSE;
                   1150: }
                   1151:
                   1152:
                   1153: TERM_PUBLIC int PS_text_angle(ang)
                   1154: int ang;
                   1155: {
                   1156:        ps_ang=ang;
                   1157:        return TRUE;
                   1158: }
                   1159:
                   1160:
                   1161: TERM_PUBLIC int PS_justify_text(mode)
                   1162: enum JUSTIFY mode;
                   1163: {
                   1164:        ps_justify=mode;
                   1165:        return TRUE;
                   1166: }
                   1167:
                   1168:
                   1169: TERM_PUBLIC int PS_set_font(font)  /* Entry font added by DJL */
                   1170: char *font;
                   1171: {
                   1172: char name[32];
                   1173: int  size,sep;
                   1174:
                   1175:         sep=strcspn(font,",");
                   1176:         strncpy(name,font,sep); name[sep]=NUL;
                   1177:         size=ps_fontsize; sscanf (&(font[sep+1]),"%d",&size);
                   1178:         fprintf(gpoutfile,"/%s findfont %d scalefont setfont\n",name,size*PS_SC);
                   1179:         PS_RememberFont(name,1 );
                   1180:         return TRUE;
                   1181: }
                   1182:
                   1183:
                   1184: /* postscript point routines */
                   1185:
                   1186:
                   1187: TERM_PUBLIC void PS_point(x,y,number)
                   1188: unsigned int x,y;
                   1189: int number;
                   1190: {
                   1191: static char GPFAR * GPFAR pointFNS[] = {"Pnt",  "Pls",   "Crs",    "Star",
                   1192:                            "Box",  "BoxF",  "Circle", "CircleF",
                   1193:                            "TriU", "TriUF", "TriD",   "TriDF",
                   1194:                            "Dia",  "DiaF",  "Pent",   "PentF",
                   1195:                           "C0",   "C1",    "C2",     "C3",
                   1196:                           "C4",   "C5",    "C6",     "C7",
                   1197:                           "C8",   "C9",    "C10",    "C11",
                   1198:                           "C12",  "C13",   "C14",    "C15",
                   1199:                            "S0",   "S1",    "S2",     "S3",
                   1200:                           "S4",   "S5",    "S6",     "S7",
                   1201:                            "S8",   "S9",    "S10",    "S11",
                   1202:                           "S12",  "S13",   "S14",    "S15",
                   1203:                           "D0",   "D1",    "D2",     "D3",
                   1204:                           "D4",   "D5",    "D6",     "D7",
                   1205:                           "D8",   "D9",    "D10",    "D11",
                   1206:                           "D12",  "D13",   "D14",    "D15",
                   1207:                            "BoxE", "CircE", "TriUE",  "TriDE",
                   1208:                            "DiaE", "PentE", "BoxW",   "CircW",
                   1209:                            "TriUW", "TriDW", "DiaW",  "PentW"
                   1210: };
                   1211:        if (number < 0)
                   1212:                number = -1;            /* negative types are all 'dot' */
                   1213:        else
                   1214:                number %= sizeof(pointFNS)/sizeof(pointFNS[0]) -1;
                   1215:        fprintf(gpoutfile,"%d %d %s\n", x, y, pointFNS[number+1]);
                   1216:
                   1217:        PS_relative_ok = 0;
                   1218:        ps_path_count = 0;
                   1219:        PS_linetype_last = -1; /* force next linetype change */
                   1220: }
                   1221:
                   1222: TERM_PUBLIC void PS_fillbox(style, x1,y1,x2,y2)
                   1223: int style;
                   1224: unsigned int x1,y1,x2,y2;
                   1225: {
                   1226:        PS_FLUSH_PATH
                   1227:
                   1228:        fprintf(gpoutfile, "%d %d %d %d BoxFill\n", x1,y1, x2,y2);
                   1229:
                   1230:        PS_relative_ok = 0;
                   1231:        PS_linetype_last = -1;
                   1232: }
                   1233:
                   1234:
                   1235: /* ENHPOST */
                   1236:
                   1237:
                   1238: #ifdef DEBUG_ENHPS
                   1239: #define ENHPS_DEBUG(x) printf x;
                   1240: #else
                   1241: #define ENHPS_DEBUG(x)
                   1242: #endif
                   1243:
                   1244:
                   1245: static TBOOLEAN ENHps_opened_string;  /* try to cut out empty ()'s */
                   1246:
                   1247: /* used in determining height of processed text */
                   1248:
                   1249: static float ENHps_max_height, ENHps_min_height;
                   1250:
                   1251:
                   1252: /* process a bit of string, and return the last character used.
                   1253:  * p is start of string
                   1254:  * brace is TRUE to keep processing to }, FALSE for do one character
                   1255:  * fontname & fontsize are obvious
                   1256:  * base is the current baseline
                   1257:  * widthflag is TRUE if the width of this should count,
                   1258:  *              FALSE for zero width boxes
                   1259:  * showflag is TRUE if this should be shown,
                   1260:  *             FALSE if it should not be shown (like TeX \phantom)
                   1261:  */
                   1262:
                   1263: static char *ENHPS_recurse(p, brace, fontname, fontsize, base, widthflag, showflag)
                   1264: char *p, *fontname;
                   1265: TBOOLEAN brace, widthflag, showflag;
                   1266: double fontsize, base;
                   1267: {
                   1268:
                   1269: /* close a postscript string if it has been opened */
                   1270: #define ENHPS_FLUSH      \
                   1271: {      if (ENHps_opened_string)  \
                   1272:        {       fputs(")]\n", gpoutfile);   \
                   1273:                ENHps_opened_string = FALSE; \
                   1274:        }                         \
                   1275: }
                   1276:
                   1277: #define ENHPS_OPEN     \
                   1278: {      if (!ENHps_opened_string) \
                   1279:        { fprintf(gpoutfile, "[(%s) %.1f %.1f %s %s (",  \
                   1280:                  fontname, fontsize, base, \
                   1281:                  widthflag ? "true" : "false",  \
                   1282:                  showflag ? "true" : "false");  \
                   1283:          ENHps_opened_string = TRUE; \
                   1284:        }       \
                   1285: }
                   1286:
                   1287:        ENHPS_DEBUG(("RECURSE WITH [%p] \"%s\", %d %s %.1f %.1f %d %d\n", p, p, brace, fontname, fontsize, base, widthflag, showflag))
                   1288:
                   1289:        /* Start each recursion with a clean string */
                   1290:        ENHPS_FLUSH
                   1291:
                   1292:        if (base + fontsize > ENHps_max_height)
                   1293:        {       ENHps_max_height = base + fontsize;
                   1294:                ENHPS_DEBUG(("Setting max height to %.1f\n", ENHps_max_height));
                   1295:        }
                   1296:
                   1297:        if (base < ENHps_min_height)
                   1298:        {       ENHps_min_height = base;
                   1299:                ENHPS_DEBUG(("Setting min height to %.1f\n", ENHps_min_height));
                   1300:        }
                   1301:
                   1302:        while (*p)
                   1303:        {       float shift;
                   1304:
                   1305:                switch (*p)
                   1306:                {
                   1307:                        case '}'  :
                   1308:                                /*{{{  deal with it*/
                   1309:                                if (brace)
                   1310:                                        return (p);
                   1311:
                   1312:                                fprintf(stderr, "enhpost printer driver - spurious }\n");
                   1313:                                break;
                   1314:                                /*}}}*/
                   1315:
                   1316:                        case '_'  :
                   1317:                        case '^'  :
                   1318:                                /*{{{  deal with super/sub script*/
                   1319:
                   1320:                                shift = (*p == '^') ? 0.5 : -0.3;
                   1321:
                   1322:                                ENHPS_FLUSH
                   1323:
                   1324:                                p = ENHPS_recurse(p+1, FALSE, fontname, fontsize*0.8, base+shift*fontsize, widthflag, showflag);
                   1325:
                   1326:                                break;
                   1327:                                /*}}}*/
                   1328:
                   1329:                        case '{'  :
                   1330:                        {
                   1331:                                char *savepos=NULL, save=0;
                   1332:                                char *localfontname=fontname, ch;
                   1333:                                int recode=1;
                   1334:                                float f=fontsize;
                   1335:
                   1336:                                /*{{{  recurse (possibly with a new font) */
                   1337:
                   1338:                                ENHPS_DEBUG(("Dealing with {\n"))
                   1339:
                   1340:                                if (*++p == '/')
                   1341:                                {       /* then parse a fontname, optional fontsize */
                   1342:                                        while (*++p == ' ');
                   1343:                                        if (*p=='-')
                   1344:                                        {
                   1345:                                                recode=0;
                   1346:                                                while (*++p == ' ');
                   1347:                                        }
                   1348:                                        localfontname = p;
                   1349:                                        while ((ch = *p) > ' ' && ch != '=' && ch != '*')
                   1350:                                                ++p;
                   1351:                                        save = *(savepos=p);
                   1352:                                        if (ch == '=')
                   1353:                                        {
                   1354:                                                *p++ = '\0';
                   1355:                                                /*{{{  get optional font size*/
                   1356:                                                ENHPS_DEBUG(("Calling strtod(\"%s\") ...", p))
                   1357:                                                f = (float)strtod(p, &p);
                   1358:                                                ENHPS_DEBUG(("Returned %.1f and \"%s\"\n", f, p))
                   1359:
                   1360:                                                if (f)
                   1361:                                                        f *= PS_SC;  /* remember the scaling */
                   1362:                                                else
                   1363:                                                        f = fontsize;
                   1364:
                   1365:                                                ENHPS_DEBUG(("Font size %.1f\n", f))
                   1366:                                                /*}}}*/
                   1367:                                        }
                   1368:                                        else if (ch == '*')
                   1369:                                        {
                   1370:                                                *p++ = '\0';
                   1371:                                                /*{{{  get optional font size scale factor*/
                   1372:                                                ENHPS_DEBUG(("Calling strtod(\"%s\") ...", p))
                   1373:                                                f = (float)strtod(p, &p);
                   1374:                                                ENHPS_DEBUG(("Returned %.1f and \"%s\"\n", f, p))
                   1375:
                   1376:                                                if (f)
                   1377:                                                        f *= fontsize;  /* apply the scale factor */
                   1378:                                                else
                   1379:                                                        f = fontsize;
                   1380:
                   1381:                                                ENHPS_DEBUG(("Font size %.1f\n", f))
                   1382:                                                /*}}}*/
                   1383:                                        }
                   1384:                                        else
                   1385:                                        {
                   1386:                                                *p++ = '\0';
                   1387:                                                f = fontsize;
                   1388:                                        }
                   1389:
                   1390:                                        while (*p == ' ')
                   1391:                                                ++p;
                   1392:                                        if (*localfontname)
                   1393:                                        {
                   1394:                                                /* only allow RememberFont to re-encode it if no string active */
                   1395:                                                char *recodestring = PS_RememberFont(localfontname, recode && !ENHps_opened_string);
                   1396:                                                if (recode && recodestring)
                   1397:                                                {
                   1398:                                                        ENHPS_FLUSH
                   1399:                                                        fprintf(gpoutfile, "/%s %s", localfontname, recodestring);
                   1400:                                                }
                   1401:                                        }
                   1402:                                        else
                   1403:                                                localfontname = fontname;
                   1404:                                }
                   1405:                                /*}}}*/
                   1406:
                   1407:                                ENHPS_DEBUG(("Before recursing, we are at [%p] \"%s\"\n", p, p))
                   1408:
                   1409:                                p = ENHPS_recurse(p, TRUE, localfontname, f, base, widthflag, showflag);
                   1410:
                   1411:                                ENHPS_DEBUG(("BACK WITH \"%s\"\n", p));
                   1412:
                   1413:                                ENHPS_FLUSH
                   1414:
                   1415:                                if (savepos)
                   1416:                                        /* restore overwritten character */
                   1417:                                        *savepos = save;
                   1418:
                   1419:                                break;
                   1420:                        }
                   1421:
                   1422:                        case '@' :
                   1423:                                /*{{{  phantom box - prints next 'char', then restores currentpoint */
                   1424:
                   1425:                                ENHPS_FLUSH
                   1426:
                   1427:                                p = ENHPS_recurse(++p, FALSE, fontname, fontsize, base, FALSE, showflag);
                   1428:
                   1429:                                break;
                   1430:                                /*}}}*/
                   1431:
                   1432:                        case '&' :
                   1433:                                /*{{{  character skip - skips space equal to length of character(s) */
                   1434:
                   1435:                                ENHPS_FLUSH
                   1436:
                   1437:                                p = ENHPS_recurse(++p, FALSE, fontname, fontsize, base, widthflag, FALSE);
                   1438:
                   1439:                                break;
                   1440:                                /*}}}*/
                   1441:
                   1442:                        case '('  :
                   1443:                        case ')'  :
                   1444:                                /*{{{  an escape and print it */
                   1445:                                /* special cases */
                   1446:                                ENHPS_OPEN
                   1447:                                fputc('\\', gpoutfile);
                   1448:                                fputc(*p, gpoutfile);
                   1449:                                break;
                   1450:                                /*}}}*/
                   1451:
                   1452:                        case '\\'  :
                   1453:                                /*{{{  is it an escape */
                   1454:                                /* special cases */
                   1455:
                   1456:                                if (p[1]=='\\' || p[1]=='(' || p[1]==')')
                   1457:                                {
                   1458:                                        ENHPS_OPEN
                   1459:                                        fputc('\\', gpoutfile);
                   1460:                                }
                   1461:                                else if (p[1] >= '0' && p[1] <= '7')
                   1462:                                {
                   1463:                                        /* up to 3 octal digits */
                   1464:                                        ENHPS_OPEN
                   1465:                                        fputc('\\', gpoutfile);
                   1466:                                        fputc(p[1], gpoutfile);
                   1467:                                        ++p;
                   1468:                                        if (p[1] >= '0' && p[1] <= '7')
                   1469:                                        {
                   1470:                                                fputc(p[1], gpoutfile);
                   1471:                                                ++p;
                   1472:                                                if (p[1] >= '0' && p[1] <= '7')
                   1473:                                                {
                   1474:                                                        fputc(p[1], gpoutfile);
                   1475:                                                        ++p;
                   1476:                                                }
                   1477:                                        }
                   1478:                                        break;
                   1479:                                }
                   1480:
                   1481:                                ++p;
                   1482:                                /* just go and print it (fall into the 'default' case) */
                   1483:
                   1484:                                /*}}}*/
                   1485:                        default:
                   1486:                                /*{{{  print it */
                   1487:                                ENHPS_OPEN
                   1488:
                   1489:                                fputc(*p, gpoutfile);
                   1490:
                   1491:                        /*}}}*/
                   1492:
                   1493:                }
                   1494:
                   1495:                /* like TeX, we only do one character in a recursion, unless it's
                   1496:                 * in braces
                   1497:                 */
                   1498:
                   1499:                if (!brace)
                   1500:                {
                   1501:                        ENHPS_FLUSH
                   1502:                        return(p);  /* the ++p in the outer copy will increment us */
                   1503:                }
                   1504:
                   1505:                if (*p) /* only not true if { not terminated, I think */
                   1506:                        ++p;
                   1507:        }
                   1508:        ENHPS_FLUSH
                   1509:        return p;
                   1510: }
                   1511:
                   1512:
                   1513: /* a set-font routine for enhanced post : simply copies
                   1514:  * the font into a global, or restores the globals
                   1515:  * to the ps_font default
                   1516:  */
                   1517:
                   1518: TERM_PUBLIC int ENHPS_set_font(font)  /* Entry font added by DJL */
                   1519: char *font;
                   1520: {
                   1521:        ENHPS_DEBUG(("ENHPS_set_font(\"%s\")\n", font));
                   1522:
                   1523:        if (*font)
                   1524:        {
                   1525:                int sep=strcspn(font,",");
                   1526:                strncpy(ps_enh_font,font,sep); ps_enh_font[sep]=NUL;
                   1527:                ps_enh_fontsize=ps_fontsize; sscanf (font+sep+1,"%d",&ps_enh_fontsize);
                   1528:                PS_RememberFont(ps_enh_font, 1);
                   1529:        }
                   1530:        else
                   1531:        {
                   1532:                /* return to defaults */
                   1533:                strcpy(ps_enh_font, ps_font);
                   1534:                ps_enh_fontsize = ps_fontsize;
                   1535:        }
                   1536:
                   1537:        return TRUE;
                   1538: }
                   1539:
                   1540: TERM_PUBLIC void ENHPS_put_text(x, y, str)
                   1541: unsigned int x, y;
                   1542: char *str;
                   1543: {
                   1544:        /* flush any pending graphics (all the XShow routines do this...) */
                   1545:
                   1546:        if (!strlen(str))
                   1547:                return;
                   1548:
                   1549:        if (ps_path_count)
                   1550:        {
                   1551:                fputs(" stroke\n",gpoutfile);
                   1552:                ps_path_count=0;
                   1553:                PS_relative_ok=FALSE;
                   1554:        }
                   1555:
                   1556:        /* if there are no magic characters, we should just be able
                   1557:         * punt the string to PS_put_text(), which will give shorter
                   1558:         * ps output [eg tics and stuff rarely need extra processing],
                   1559:         * but we need to make sure that the current font is the
                   1560:         * default one before we can do that. {ie I tried it and it
                   1561:         * used the wrong font !}
                   1562:         * if (!strpbrk(str, "{}^_@&"))
                   1563:         * {
                   1564:         *   - do something to ensure default font is selected
                   1565:         *   PS_put_text(x,y,str);
                   1566:         *   return;
                   1567:         * }
                   1568:         */
                   1569:
                   1570:
                   1571:        PS_move(x,y);
                   1572:
                   1573:        if (ps_ang != 0)
                   1574:                fprintf(gpoutfile,"currentpoint gsave translate %d rotate 0 0 moveto\n",
                   1575:                        ps_ang*90);
                   1576:
                   1577:        fputs("[ ",gpoutfile);
                   1578:
                   1579:        /* set up the globals */
                   1580:
                   1581:        ENHps_opened_string = FALSE;
                   1582:        ENHps_max_height = -1000;
                   1583:        ENHps_min_height = 1000;
                   1584:
                   1585:        /* Set the recursion going. We say to keep going until a
                   1586:         * closing brace, but we don't really expect to find one.
                   1587:         * If the return value is not the nul-terminator of the
                   1588:         * string, that can only mean that we did find an unmatched
                   1589:         * closing brace in the string. We increment past it (else
                   1590:         * we get stuck in an infinite loop) and try again.
                   1591:         *
                   1592:         * ps_enh_font and ps_enh_fontsize are either set to the
                   1593:         * the defaults set on option line, or have been set to
                   1594:         * "font,size". That is to say, ps_font is used only
                   1595:         * at startup and by ENHPS_set_font
                   1596:         */
                   1597:        while (*(str = ENHPS_recurse(str, TRUE, ps_enh_font,
                   1598:                                     (double)(ps_enh_fontsize*PS_SC),
                   1599:                                     0.0, TRUE, TRUE)))
                   1600:        {
                   1601:                ENHPS_FLUSH
                   1602:
                   1603:                /* I think we can only get here if *str == '}' */
                   1604:                if (*str == '}')
                   1605:                        fprintf(stderr, "enhpost printer driver - ignoring spurious }\n");
                   1606:                else
                   1607:                        fprintf(stderr, "internal error in enhpost driver - *str=0x%x\n", *str);
                   1608:
                   1609:                if (!*++str)
                   1610:                        break; /* end of string */
                   1611:
                   1612:                /* else carry on and process the rest of the string */
                   1613:        }
                   1614:
                   1615:        ENHps_max_height += ENHps_min_height;
                   1616:
                   1617:        fprintf(gpoutfile, "] %.1f ", -ENHps_max_height/3);
                   1618:
                   1619:        switch(ps_justify)
                   1620:        {
                   1621:                case LEFT : fprintf(gpoutfile, "MLshow\n");
                   1622:                        break;
                   1623:                case CENTRE : fprintf(gpoutfile, "MCshow\n");
                   1624:                        break;
                   1625:                case RIGHT : fprintf(gpoutfile, "MRshow\n");
                   1626:                        break;
                   1627:        }
                   1628:
                   1629:        if (ps_ang != 0)
                   1630:                fputs("grestore\n", gpoutfile);
                   1631:        ps_path_count = 0;
                   1632:        PS_relative_ok=FALSE;
                   1633: }
                   1634:
                   1635:
                   1636:
                   1637:
                   1638:
                   1639: #endif /* TERM_BODY */
                   1640:
                   1641: #ifdef TERM_TABLE
                   1642:
                   1643: TERM_TABLE_START(post_driver)
                   1644:
                   1645:       "postscript",
                   1646:       "PostScript graphics language [mode \042fontname\042 font_size]",
                   1647:           PS_XMAX, PS_YMAX, PS_VCHAR, PS_HCHAR,
                   1648:           PS_VTIC, PS_HTIC, PS_options, PS_init, PS_reset,
                   1649:           PS_text, null_scale, PS_graphics, PS_move, PS_vector,
                   1650:           PS_linetype, PS_put_text, PS_text_angle,
                   1651:           PS_justify_text, PS_point, do_arrow, PS_set_font, PS_pointsize,
                   1652:           0 /*flags*/, 0 /*suspend*/, 0 /*resume*/, PS_fillbox, PS_linewidth
                   1653:
                   1654: TERM_TABLE_END(post_driver)
                   1655:
                   1656: #undef LAST_TERM
                   1657: #define LAST_TERM post_driver
                   1658:
                   1659: #endif /* TERM_TABLE */
                   1660:
                   1661: #endif /* TERM_PROTO_ONLY */
                   1662:
                   1663: #ifdef TERM_HELP
                   1664: START_HELP(post)
                   1665: "1 postscript",
                   1666: "?commands set terminal postscript",
                   1667: "?set terminal postscript",
                   1668: "?set term postscript",
                   1669: "?terminal postscript",
                   1670: "?term postscript",
                   1671: "?postscript",
                   1672: " Several options may be set in the `postscript` driver.",
                   1673: "",
                   1674: " Syntax:",
                   1675: "       set terminal postscript {<mode>} {enhanced | noenhanced}",
                   1676: "                               {color | monochrome} {solid | dashed}",
                   1677: "                               {<duplexing>}",
                   1678: "                               {\"<fontname>\"} {<fontsize>}",
                   1679: "",
                   1680: " where <mode> is `landscape`, `portrait`, `eps` or `default`;",
                   1681: " `solid` draws all plots with solid lines, overriding any dashed patterns;",
                   1682: " <duplexing> is `defaultplex`, `simplex` or `duplex` (\"duplexing\" in",
                   1683: " PostScript is the ability of the printer to print on both sides of the same",
                   1684: " page---don't set this if your printer can't do it);",
                   1685: " `enhanced` activates the \"enhanced PostScript\" features (subscripts,",
                   1686: " superscripts and mixed fonts);",
                   1687: " `\"<fontname>\"` is the name of a valid PostScript font; and `<fontsize>` is",
                   1688: " the size of the font in PostScript points.",
                   1689: "",
                   1690: " `default` mode sets all options to their defaults: `landscape`, `monochrome`,",
                   1691: " `dashed`, `defaultplex`, `noenhanced`, \"Helvetica\" and 14pt.",
                   1692: "  Default size of a PostScript plot is 10 inches wide and 7 inches high.",
                   1693: "",
                   1694: " `eps` mode generates EPS (Encapsulated PostScript) output, which is just",
                   1695: " regular PostScript with some additional lines that allow the file to be",
                   1696: " imported into a variety of other applications.  (The added lines are",
                   1697: " PostScript comment lines, so the file may still be printed by itself.)  To",
                   1698: " get EPS output, use the `eps` mode and make only one plot per file.  In `eps`",
                   1699: " mode the whole plot, including the fonts, is reduced to half of the default",
                   1700: " size.",
                   1701: "",
                   1702: " Examples:",
                   1703: "       set terminal postscript default       # old postscript",
                   1704: "       set terminal postscript enhanced      # old enhpost",
                   1705: "       set terminal postscript landscape 22  # old psbig",
                   1706: "       set terminal postscript eps 14        # old epsf1",
                   1707: "       set terminal postscript eps 22        # old epsf2",
                   1708: "       set size 0.7,1.4; set term post portrait color \"Times-Roman\" 14",
                   1709: "",
                   1710: " Linewidths and pointsizes may be changed with `set linestyle`.",
                   1711: "",
                   1712: " The `postscript` driver supports about 70 distinct pointtypes, selectable",
                   1713: " through the `pointtype` option on `plot` and `set linestyle`.",
                   1714: "",
                   1715: " Several possibly useful files about `gnuplot`'s PostScript are included",
                   1716: " in the /docs/ps subdirectory of the `gnuplot` distribution and at the",
                   1717: " distribution sites.  These are \"ps_symbols.gpi\" (a `gnuplot` command file",
                   1718: " that, when executed, creates the file \"ps_symbols.ps\" which shows all the",
                   1719: " symbols available through the `postscript` terminal), \"ps_guide.ps\" (a",
                   1720: " PostScript file that contains a summary of the enhanced syntax and a page",
                   1721: " showing what the octal codes produce with text and symbol fonts) and",
                   1722: " \"ps_file.doc\" (a text file that contains a discussion of the organization",
                   1723: " of a PostScript file written by `gnuplot`).",
                   1724: "",
                   1725: " A PostScript file is editable, so once `gnuplot` has created one, you are",
                   1726: " free to modify it to your heart's desire.  See the \"editing postscript\"",
                   1727: " section for some hints.",
                   1728: "2 enhanced postscript",
                   1729: "?commands set terminal postscript enhanced",
                   1730: "?set terminal postscript enhanced",
                   1731: "?set term postscript enhanced",
                   1732: "?terminal postscript enhanced",
                   1733: "?term postscript enhanced",
                   1734: "?enhanced_postscript",
                   1735: "@start table - first is interactive cleartext form",
                   1736: "  Control      Examples        Explanation",
                   1737: "   ^           a^x             superscript",
                   1738: "   _           a_x             subscript",
                   1739: "   @           @x or a@^b_c    phantom box (occupies no width)",
                   1740: "   &           &{space}        inserts space of specified length",
                   1741: "#\\begin{tabular}{|ccl|} \\hline",
                   1742: "#\\multicolumn{3}{|c|}{Enhanced Text Control Codes} \\\\ \\hline",
                   1743: "#Control & Examples & Explanation \\\\ \\hline",
                   1744: "#\\verb~^~ & \\verb~a^x~ & superscript\\\\",
                   1745: "#\\verb~_~ & \\verb~a_x~ & subscript\\\\",
                   1746: "#\\verb~@~ & \\verb~@x or a@^b_c~ & phantom box (occupies no width)\\\\",
                   1747: "#\\verb~&~ & \\verb~&{space}~ & inserts space of specified length\\\\",
                   1748: "%c c l .",
                   1749: "%.TE", /* ugly - doc2ms uses @ for column separator, but here we */
                   1750: "%.TS", /* need @ in table, so end and restart the table ! */
                   1751: "%center box tab ($) ;",
                   1752: "%c c l .",
                   1753: "%Control$Examples$Explanation",
                   1754: "%_",
                   1755: "%^$a^x$superscript",
                   1756: "%\\&_$a\\&_x$subscript",
                   1757: "% @ $ @x or a\\&@^b\\&_c$phantom box (occupies no width)",
                   1758: "% & $ &{space}$inserts space of specified length",
                   1759: "@end table",
                   1760: "",
                   1761: " Braces can be used to place multiple-character text where a single character",
                   1762: " is expected (e.g., 2^{10}).  To change the font and/or size, use the full",
                   1763: " form:  {/[fontname][=fontsize | *fontscale] text}.  Thus {/Symbol=20 G} is a",
                   1764: " 20-point GAMMA) and {/*0.75 K} is a K at three-quarters of whatever fontsize",
                   1765: " is currently in effect.  (The '/' character MUST be the first character after",
                   1766: " the '{'.)",
                   1767: "",
                   1768: " If the encoding vector has been changed by `set encoding`, the default",
                   1769: " encoding vector can be used instead by following the slash with a dash.  This",
                   1770: " is unnecessary if you use the Symbol font, however---since /Symbol uses its",
                   1771: " own encoding vector, `gnuplot` will not apply any other encoding vector to",
                   1772: " it.",
                   1773: "",
                   1774: " The phantom box is useful for a@^b_c to align superscripts and subscripts",
                   1775: " but does not work well for overwriting an accent on a letter.  (To do the",
                   1776: " latter, it is much better to use `set encoding iso_8859_1` to change to the",
                   1777: " ISO Latin-1 encoding vector, which contains a large variety of letters with",
                   1778: " accents or other diacritical marks.)  Since the box is non-spacing, it is",
                   1779: " sensible to put the shorter of the subscript or superscript in the box (that",
                   1780: " is, after the @).",
                   1781: "",
                   1782: " Space equal in length to a string can be inserted using the '&' character.",
                   1783: " Thus",
                   1784: "         'abc&{def}ghi'",
                   1785: " would produce",
                   1786: "         'abc   ghi'.",
                   1787: "",
                   1788: " You can access special symbols numerically by specifying \\character-code (in",
                   1789: " octal), e.g., {/Symbol \\245} is the symbol for infinity.",
                   1790: "",
                   1791: " You can escape control characters using \\, e.g.,  \\\\, \\{, and so on.",
                   1792: "",
                   1793: " But be aware that strings in double-quotes are parsed differently than those",
                   1794: " enclosed in single-quotes.  The major difference is that backslashes may need",
                   1795: " to be doubled when in double-quoted strings.",
                   1796: "",
                   1797: " Examples (these are hard to describe in words---try them!):",
                   1798: "       set xlabel 'Time (10^6 {/Symbol m}s)'",
                   1799: "       set title '{/Symbol=18 \\362@_{/=9.6 0}^{/=12 x}} \\",
                   1800: "                  {/Helvetica e^{-{/Symbol m}^2/2} d}{/Symbol m}'",
                   1801: "",
                   1802: " The file \"ps_guide.ps\" in the /docs/ps subdirectory of the `gnuplot` source",
                   1803: " distribution contains more examples of the enhanced syntax.",
                   1804: "2 editing postscript",
                   1805: "?commands set terminal postscript editing",
                   1806: "?set terminal postscript editing",
                   1807: "?set term postscript editing",
                   1808: "?terminal postscript editing",
                   1809: "?term postscript editing",
                   1810: "?editing_postscript",
                   1811: " The PostScript language is a very complex language---far too complex to",
                   1812: " describe in any detail in this document.  Nevertheless there are some things",
                   1813: " in a PostScript file written by `gnuplot` that can be changed without risk of",
                   1814: " introducing fatal errors into the file.",
                   1815: "",
                   1816: " For example, the PostScript statement \"/Color true def\" (written into the",
                   1817: " file in response to the command `set terminal postscript color`), may be",
                   1818: " altered in an obvious way to generate a black-and-white version of a plot.",
                   1819: " Similarly line colors, text colors, line weights and symbol sizes can also be",
                   1820: " altered in straight-forward ways.  Text (titles and labels) can be edited to",
                   1821: " correct misspellings or to change fonts.  Anything can be repositioned, and",
                   1822: " of course anything can be added or deleted, but modifications such as these",
                   1823: " may require deeper knowledge of the PostScript language.",
                   1824: "",
                   1825: " The organization of a PostScript file written by `gnuplot` is discussed in",
                   1826: " the text file \"ps_file.doc\" in the /docs/ps subdirectory."
                   1827: END_HELP(post)
                   1828: #endif
                   1829:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>