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

Annotation of OpenXM_contrib/gnuplot/term/next.trm, Revision 1.1.1.2

1.1       maekawa     1: /*
1.1.1.2 ! maekawa     2:  * $Id: next.trm,v 1.10.2.1 1999/08/19 14:17:02 lhecking Exp $
1.1       maekawa     3:  *
                      4:  */
                      5:
                      6: /* GNUPLOT - next.trm */
                      7:
                      8: /*[
                      9:  * Copyright 1991 - 1993, 1998
                     10:  *
                     11:  * Permission to use, copy, and distribute this software and its
                     12:  * documentation for any purpose with or without fee is hereby granted,
                     13:  * provided that the above copyright notice appear in all copies and
                     14:  * that both that copyright notice and this permission notice appear
                     15:  * in supporting documentation.
                     16:  *
                     17:  * Permission to modify the software is granted, but not the right to
                     18:  * distribute the complete modified source code.  Modifications are to
                     19:  * be distributed as patches to the released version.  Permission to
                     20:  * distribute binaries produced by compiling modified sources is granted,
                     21:  * provided you
                     22:  *   1. distribute the corresponding source modifications from the
                     23:  *    released version in the form of a patch file along with the binaries,
                     24:  *   2. add special version identification to distinguish your version
                     25:  *    in addition to the base release version number,
                     26:  *   3. provide your name and address as the primary contact for the
                     27:  *    support of your modified version, and
                     28:  *   4. retain our contact information in regard to use of the base
                     29:  *    software.
                     30:  * Permission to distribute the released version of the source code along
                     31:  * with corresponding source modifications in the form of a patch file is
                     32:  * granted with same provisions 2 through 4 for binary distributions.
                     33:  *
                     34:  * This software is provided "as is" without express or implied warranty
                     35:  * to the extent permitted by applicable law.
                     36: ]*/
                     37:
                     38: /*
                     39:  * This file is included by ../term.c via ../term.h.
                     40:  *
                     41:  * This terminal driver supports:
                     42:  *     next
                     43:  *
                     44:  * AUTHORS
                     45:  *  Robert Lutwak from Russell Lang's post.trm
                     46:  *  'old' option invokes Nick Strobel's original, single viewport terminal
                     47:  *
                     48:  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
                     49:  *
                     50:  * This terminal attempts to connect, via the NeXTstep Distributed
                     51:  * Objects system, to the "gnuplotServer."  If there is no such
                     52:  * service registered with the OS, the terminal attempts to fire
                     53:  * up GnuTerm.app.  If the user has not set the environment variable
                     54:  * GNUTERMPATH, the terminal uses the users ApplicationPaths Workspace
                     55:  * dwrite to search for GnuTerm.app (Note:  this is usually something
                     56:  * like ~/Apps, ~/LocalApps, ~/NextApps, etc.).
                     57:  * In order to use this filter, you MUST have GnuTerm.app installed
                     58:  * on your system.
                     59:  *
                     60:  * Once connected to the server, this filter is basically Russell Lang's
                     61:  * Postscript filter, except that the resultant postscript code
                     62:  * is sent, via the D.O. system, to GnuTerm.app, which manages
                     63:  * the windows which produce the postscript output on the screen.
                     64:  *
                     65:  *
                     66:  * Defaults are
                     67:  * 'set term next new dashed auto "Helvetica" 14'
                     68:  *
                     69:  * To change font to Times-Roman and font size to 20pts use
                     70:  * 'set term next "Times-Roman" 20'.
                     71:  *
                     72:  * to choose window by title
                     73:  * 'set term next title "Window title"
                     74:  *
                     75:  * Monitor Options:
                     76:  * monochrome, color
                     77:  *
                     78:  * To invoke Nick Strobel's old terminal
                     79:  * 'set term next old'
                     80:  */
                     81:
                     82: #include "driver.h"
                     83:
                     84: #ifdef TERM_REGISTER
                     85: register_term(next)
                     86: #endif
                     87:
                     88: #ifdef TERM_PROTO
                     89:
                     90: /* whether or not to compile support for the old (self-contained)
                     91:    NeXT terminal */
                     92: /* #define NEXT_OLDTERMINAL    1 */
                     93:
                     94: #import <appkit/appkit.h>
                     95: #import <remote/NXProxy.h>     /* setProtocolForProxy */
                     96: #import <remote/NXConnection.h>        /* setProtocolForProxy */
                     97: #import <machkit/NXNetNameServer.h>
                     98: #import <machkit/senderIsInvalid.h>
                     99: #import <stdarg.h>
                    100:
                    101:
                    102: #ifdef NEXT_OLDTERMINAL
                    103: static void window_create __PROTO((void));
                    104: @interface EpsViewer:Application
                    105: {
                    106:     id theNewWin;
                    107: }
                    108:
                    109: -windowCreate:(NXCoord)
                    110: width Height:(NXCoord) height;
                    111: -(NXRect *) nextRectForWidth:(NXCoord)
                    112: width Height:(NXCoord) height;
                    113: @end
                    114: #endif /* NEXT_OLDTERMINAL */
                    115:
                    116:
                    117: TERM_PUBLIC void NEXT_options __PROTO((void));
                    118: TERM_PUBLIC void NEXT_common_init __PROTO((int uses_fonts, unsigned int xoff, unsigned int yoff, unsigned int xsize, unsigned int ysize, char **dict));
                    119: TERM_PUBLIC void NEXT_init __PROTO((void));
                    120: TERM_PUBLIC void NEXT_graphics __PROTO((void));
                    121: TERM_PUBLIC void NEXT_text __PROTO((void));
                    122: TERM_PUBLIC void NEXT_reset __PROTO((void));
                    123: TERM_PUBLIC void NEXT_linetype __PROTO((int linetype));
                    124: TERM_PUBLIC void NEXT_move __PROTO((unsigned int x, unsigned int y));
                    125: TERM_PUBLIC void NEXT_vector __PROTO((unsigned int x, unsigned int y));
                    126: TERM_PUBLIC void NEXT_put_text __PROTO((unsigned int x, unsigned int y, char *str));
                    127: TERM_PUBLIC int NEXT_text_angle __PROTO((int ang));
                    128: TERM_PUBLIC int NEXT_justify_text __PROTO((enum JUSTIFY mode));
                    129: TERM_PUBLIC void NEXT_point __PROTO((unsigned int x, unsigned int y, int number));
                    130: TERM_PUBLIC int NEXT_set_font __PROTO((char *font));
                    131: TERM_PUBLIC char *NEXT_RememberFont __PROTO((char *fname));
                    132: TERM_PUBLIC void NEXT_set_pointsize __PROTO((double size));
                    133:
                    134:
                    135: #define NEXT_POINT_TYPES 8     /* div */
                    136: #define NEXT_XOFF      1       /* page offset in pts */
                    137: #define NEXT_YOFF      1
                    138: #define NEXT_XMAX 6400
                    139: #define NEXT_YMAX 4800
                    140: #define NEXT_XLAST (NEXT_XMAX - 1)
                    141: #define NEXT_YLAST (NEXT_YMAX - 1)
                    142: #define NEXT_VTIC (NEXT_YMAX/80)
                    143: #define NEXT_HTIC (NEXT_YMAX/80)
                    144: #define NEXT_SC (10)           /* scale is 1pt = 10 units */
                    145: #define        NEXT_LW (0.5*NEXT_SC)   /* linewidth = 0.5 pts */
                    146: #define NEXT_VCHAR (14*NEXT_SC)        /* default is 14 point characters */
                    147: #define NEXT_HCHAR (14*NEXT_SC*6/10)
                    148:
                    149: #define GOT_NEXT_PROTO
                    150: #endif
                    151:
                    152:
                    153: #ifndef TERM_PROTO_ONLY
                    154:
                    155: #ifdef TERM_BODY
                    156:
                    157: @interface GnuTermDriver:Object < NXSenderIsInvalid >
                    158: {
                    159:     id server;
                    160: }
                    161:
                    162: -senderIsInvalid:(id) sender;
                    163: -plot:(char *) PSstr;
                    164: -init;
                    165: @end
                    166:
                    167:
                    168: #define DEFAULTNEXTSIZE 10000
                    169:
                    170: static id gnuTermAccess;       /* local object manages the D.O. connection */
                    171:
                    172: static char *NEXTBuffer, *NEXTBufAt, *NEXTBufEnd;
                    173: static int NEXTsize;
                    174: static char NEXTTmpBuf[1000];
                    175: static void NEXTPrintf(char *,...);
                    176: static TBOOLEAN NEXT_oldterminal = FALSE;
                    177: /*static TBOOLEAN NEXT_colordetect();*/
                    178:
                    179: static char NEXT_title[MAX_LINE_LEN + 1];      /* name of font */
                    180:
                    181: static char NEXT_font[MAX_LINE_LEN + 1] = "Helvetica"; /* name of font */
                    182: static int NEXT_fontsize = 14; /* size of font in pts */
                    183: static TBOOLEAN NEXT_color = FALSE;
                    184: static TBOOLEAN NEXT_solid = FALSE;    /*  use dashed lines */
                    185: static int NEXT_path_count = 0;        /* count of lines in path */
                    186: static int NEXT_ang = 0;       /* text angle */
                    187: static enum JUSTIFY NEXT_justify = LEFT;       /* text is flush left */
                    188:
                    189: static TBOOLEAN NEXT_duplex_state = FALSE;
                    190: static TBOOLEAN NEXT_duplex_option = FALSE;
                    191:
                    192: static char GPFAR *GPFAR NEXT_header[] =
                    193: {
                    194:     "/M {moveto} bind def\n",
                    195:     "/L {lineto} bind def\n",
                    196:     "/R {rmoveto} bind def\n",
                    197:     "/V {rlineto} bind def\n",
                    198:     "/vpt2 vpt 2 mul def\n",
                    199:     "/hpt2 hpt 2 mul def\n",
                    200: /* flush left show */
                    201:     "/Lshow { currentpoint stroke M\n",
                    202:     "  0 vshift R show } def\n",
                    203: /* flush right show */
                    204:     "/Rshow { currentpoint stroke M\n",
                    205:     "  dup stringwidth pop neg vshift R show } def\n",
                    206: /* centred show */
                    207:     "/Cshow { currentpoint stroke M\n",
                    208:     "  dup stringwidth pop -2 div vshift R show } def\n",
                    209: /* Dash or Color Line */
                    210:     "/DL { Color {setrgbcolor Solid {pop []} if 0 setdash }\n",
                    211:     " {pop pop pop Solid {pop []} if 0 setdash} ifelse } def\n",
                    212: /* Border Lines */
                    213:     "/BL { stroke gnulinewidth 2 mul setlinewidth } def\n",
                    214: /* Axes Lines */
                    215:     "/AL { stroke gnulinewidth 2 div setlinewidth } def\n",
                    216: /* Plot Lines */
                    217:     "/PL { stroke gnulinewidth setlinewidth } def\n",
                    218: /* Line Types */
                    219:     "/LTb { BL [] 0 0 0 DL } def\n",   /* border */
                    220:     "/LTa { AL [1 dl 2 dl] 0 setdash 0 0 0 setrgbcolor } def\n",       /* axes */
                    221:     "/LT0 { PL [] 0 1 0 DL } def\n",
                    222:     "/LT1 { PL [4 dl 2 dl] 0 0 1 DL } def\n",
                    223:     "/LT2 { PL [2 dl 3 dl] 1 0 0 DL } def\n",
                    224:     "/LT3 { PL [1 dl 1.5 dl] 1 0 1 DL } def\n",
                    225:     "/LT4 { PL [5 dl 2 dl 1 dl 2 dl] 0 1 1 DL } def\n",
                    226:     "/LT5 { PL [4 dl 3 dl 1 dl 3 dl] 1 1 0 DL } def\n",
                    227:     "/LT6 { PL [2 dl 2 dl 2 dl 4 dl] 0 0 0 DL } def\n",
                    228:     "/LT7 { PL [2 dl 2 dl 2 dl 2 dl 2 dl 4 dl] 1 0.3 0 DL } def\n",
                    229:     "/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",
                    230: /* Point (Round) *//* Matt Heffron make it round */
                    231:     "/Pnt { stroke [] 0 setdash\n",
                    232:     "   gsave 1 setlinecap M 0 0 V stroke grestore } def\n",
                    233:
                    234: /* Diamond */
                    235:     "/Dia { stroke [] 0 setdash 2 copy vpt add M\n",
                    236:     "  hpt neg vpt neg V hpt vpt neg V\n",
                    237:     "  hpt vpt V hpt neg vpt V closepath stroke\n",
                    238:     "  Pnt } def\n",
                    239:
                    240: /* Plus */
                    241:     "/Pls { stroke [] 0 setdash vpt sub M 0 vpt2 V\n",
                    242:     "  currentpoint stroke M\n",
                    243:     "  hpt neg vpt neg R hpt2 0 V stroke\n",
                    244:     "  } def\n",
                    245:
                    246: /* Box */
                    247:     "/Box { stroke [] 0 setdash 2 copy exch hpt sub exch vpt add M\n",
                    248:     "  0 vpt2 neg V hpt2 0 V 0 vpt2 V\n",
                    249:     "  hpt2 neg 0 V closepath stroke\n",
                    250:     "  Pnt } def\n",
                    251:
                    252: /* Cross (X) */
                    253:     "/Crs { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
                    254:     "  hpt2 vpt2 neg V currentpoint stroke M\n",
                    255:     "  hpt2 neg 0 R hpt2 vpt2 V stroke } def\n",
                    256:
                    257: /* Triangle Up*/
                    258:     "/TriU { stroke [] 0 setdash 2 copy vpt 1.12 mul add M\n",
                    259:     "  hpt neg vpt -1.62 mul V\n",
                    260:     "  hpt 2 mul 0 V\n",
                    261:     "  hpt neg vpt 1.62 mul V closepath stroke\n",
                    262:     "  Pnt  } def\n",
                    263:
                    264: /* Star */
                    265:     "/Star { 2 copy Pls Crs } def\n",
                    266:
                    267: /* div added filed box */
                    268: /* Filled Box */
                    269:     "/BoxF { stroke [] 0 setdash exch hpt sub exch vpt add M\n",
                    270:     "  0 vpt2 neg V  hpt2 0 V  0 vpt2 V\n",
                    271:     "  hpt2 neg 0 V  closepath fill } def\n",
                    272:
                    273: /* div added filled triangle */
                    274: /* Triangle Up, Filled */
                    275:     "/TriUF { stroke [] 0 setdash vpt 1.12 mul add M\n",
                    276:     "  hpt neg vpt -1.62 mul V\n",
                    277:     "  hpt 2 mul 0 V\n",
                    278:     "  hpt neg vpt 1.62 mul V closepath fill } def\n",
                    279:
                    280: /* Matt Heffron: added a few more types */
                    281: /* Triangle Down */
                    282:     "/TriD { stroke [] 0 setdash 2 copy vpt 1.12 mul sub M\n",
                    283:     "  hpt neg vpt 1.62 mul V\n",
                    284:     "  hpt 2 mul 0 V\n",
                    285:     "  hpt neg vpt -1.62 mul V closepath stroke\n",
                    286:     "  Pnt  } def\n",
                    287:
                    288: /* Triangle Down, Filled*/
                    289:     "/TriDF { stroke [] 0 setdash vpt 1.12 mul sub M\n",
                    290:     "  hpt neg vpt 1.62 mul V\n",
                    291:     "  hpt 2 mul 0 V\n",
                    292:     "  hpt neg vpt -1.62 mul V closepath fill} def\n",
                    293:
                    294: /* Diamond, Filled */
                    295:     "/DiaF { stroke [] 0 setdash vpt add M\n",
                    296:     "  hpt neg vpt neg V hpt vpt neg V\n",
                    297:     "  hpt vpt V hpt neg vpt V closepath fill } def\n",
                    298:
                    299: /* Pentagon */
                    300:     "/Pent { stroke [] 0 setdash 2 copy gsave\n",
                    301:     "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
                    302:     "  closepath stroke grestore Pnt } def\n",
                    303:
                    304: /* Pentagon, Filled */
                    305:     "/PentF { stroke [] 0 setdash gsave\n",
                    306:     "  translate 0 hpt M 4 {72 rotate 0 hpt L} repeat\n",
                    307:     "  closepath fill grestore } def\n",
                    308:
                    309: /* Circle */
                    310:     "/Circle { stroke [] 0 setdash 2 copy\n",
                    311:     "  hpt 0 360 arc stroke Pnt } def\n",
                    312:
                    313: /* Circle,Filled */
                    314:     "/CircleF { stroke [] 0 setdash hpt 0 360 arc fill } def\n",
                    315: /* 16 differently filled circles */
                    316:     "/C0 { BL [] 0 setdash 2 copy moveto vpt 90 450  arc } bind def\n",
                    317:     "/C1 { BL [] 0 setdash 2 copy        moveto\n",
                    318:     "       2 copy  vpt 0 90 arc closepath fill\n",
                    319:     "               vpt 0 360 arc closepath } bind def\n",
                    320:     "/C2 { BL [] 0 setdash 2 copy moveto\n",
                    321:     "       2 copy  vpt 90 180 arc closepath fill\n",
                    322:     "               vpt 0 360 arc closepath } bind def\n",
                    323:     "/C3 { BL [] 0 setdash 2 copy moveto\n",
                    324:     "       2 copy  vpt 0 180 arc closepath fill\n",
                    325:     "               vpt 0 360 arc closepath } bind def\n",
                    326:     "/C4 { BL [] 0 setdash 2 copy moveto\n",
                    327:     "       2 copy  vpt 180 270 arc closepath fill\n",
                    328:     "               vpt 0 360 arc closepath } bind def\n",
                    329:     "/C5 { BL [] 0 setdash 2 copy moveto\n",
                    330:     "       2 copy  vpt 0 90 arc\n",
                    331:     "       2 copy moveto\n",
                    332:     "       2 copy  vpt 180 270 arc closepath fill\n",
                    333:     "               vpt 0 360 arc } bind def\n",
                    334:     "/C6 { BL [] 0 setdash 2 copy moveto\n",
                    335:     "      2 copy  vpt 90 270 arc closepath fill\n",
                    336:     "              vpt 0 360 arc closepath } bind def\n",
                    337:     "/C7 { BL [] 0 setdash 2 copy moveto\n",
                    338:     "      2 copy  vpt 0 270 arc closepath fill\n",
                    339:     "              vpt 0 360 arc closepath } bind def\n",
                    340:     "/C8 { BL [] 0 setdash 2 copy moveto\n",
                    341:     "      2 copy vpt 270 360 arc closepath fill\n",
                    342:     "              vpt 0 360 arc closepath } bind def\n",
                    343:     "/C9 { BL [] 0 setdash 2 copy moveto\n",
                    344:     "      2 copy  vpt 270 450 arc closepath fill\n",
                    345:     "              vpt 0 360 arc closepath } bind def\n",
                    346:     "/C10 { BL [] 0 setdash 2 copy 2 copy moveto vpt 270 360 arc closepath fill\n",
                    347:     "       2 copy moveto\n",
                    348:     "       2 copy vpt 90 180 arc closepath fill\n",
                    349:     "               vpt 0 360 arc closepath } bind def\n",
                    350:     "/C11 { BL [] 0 setdash 2 copy moveto\n",
                    351:     "       2 copy  vpt 0 90 arc closepath fill\n",
                    352:     "       2 copy moveto\n",
                    353:     "       2 copy  vpt 180 360 arc closepath fill\n",
                    354:     "               vpt 0 360 arc closepath } bind def\n",
                    355:     "/C12 { BL [] 0 setdash 2 copy moveto\n",
                    356:     "       2 copy  vpt 180 360 arc closepath fill\n",
                    357:     "               vpt 0 360 arc closepath } bind def\n",
                    358:     "/C13 { BL [] 0 setdash  2 copy moveto\n",
                    359:     "       2 copy  vpt 0 90 arc closepath fill\n",
                    360:     "       2 copy moveto\n",
                    361:     "       2 copy  vpt 180 360 arc closepath fill\n",
                    362:     "               vpt 0 360 arc closepath } bind def\n",
                    363:     "/C14 { BL [] 0 setdash 2 copy moveto\n",
                    364:     "       2 copy  vpt 90 360 arc closepath fill\n",
                    365:     "               vpt 0 360 arc } bind def\n",
                    366:     "/C15 { BL [] 0 setdash 2 copy vpt 0 360 arc closepath fill\n",
                    367:     "               vpt 0 360 arc closepath } bind def\n",
                    368:
                    369: /* Auxiliary definitions for rectangles */
                    370:
                    371:     "/Rec   { newpath 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto\n",
                    372:     "       neg 0 rlineto closepath } bind def\n",
                    373:     "/Square { dup Rec } bind def\n",
                    374:     "/Bsquare { vpt sub exch vpt sub exch vpt2 Square } bind def\n",
                    375:
                    376: /* 16 differently filled squares */
                    377:
                    378:     "/S0 { BL [] 0 setdash 2 copy moveto 0 vpt rlineto BL Bsquare } bind def\n",
                    379:     "/S1 { BL [] 0 setdash 2 copy vpt Square fill Bsquare } bind def\n",
                    380:     "/S2 { BL [] 0 setdash 2 copy exch vpt sub exch vpt Square fill Bsquare } bind def\n",
                    381:     "/S3 { BL [] 0 setdash 2 copy exch vpt sub exch vpt2 vpt Rec fill Bsquare } bind def\n",
                    382:     "/S4 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def\n",
                    383:     "/S5 { BL [] 0 setdash 2 copy 2 copy vpt Square fill\n",
                    384:     "       exch vpt sub exch vpt sub vpt Square fill Bsquare } bind def\n",
                    385:     "/S6 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill Bsquare } bind def\n",
                    386:     "/S7 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt vpt2 Rec fill\n",
                    387:     "       2 copy vpt Square fill\n",
                    388:     "       Bsquare } bind def\n",
                    389:     "/S8 { BL [] 0 setdash 2 copy vpt sub vpt Square fill Bsquare } bind def\n",
                    390:     "/S9 { BL [] 0 setdash 2 copy vpt sub vpt vpt2 Rec fill Bsquare } bind def\n",
                    391:     "/S10 { BL [] 0 setdash 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt Square fill\n",
                    392:     "       Bsquare } bind def\n",
                    393:     "/S11 { 2 copy vpt sub vpt Square fill 2 copy exch vpt sub exch vpt2 vpt Rec fill\n",
                    394:     "       Bsquare } bind def\n",
                    395:     "/S12 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill Bsquare } bind def\n",
                    396:     "/S13 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill\n",
                    397:     "       2 copy vpt Square fill Bsquare } bind def\n",
                    398:     "/S14 { BL [] 0 setdash 2 copy exch vpt sub exch vpt sub vpt2 vpt Rec fill\n",
                    399:     "       2 copy exch vpt sub exch vpt Square fill Bsquare } bind def\n",
                    400:     "/S15 { BL [] 0 setdash 2 copy Bsquare fill Bsquare } bind def\n",
                    401:
                    402: /* 16 different diamonds (actually just rotated squares) */
                    403:
                    404:     "/D0 { gsave translate 45 rotate 0 0 Box stroke grestore } bind def\n",
                    405:     "/D1 { gsave translate 45 rotate 0 0 S1 stroke grestore } bind def\n",
                    406:     "/D2 { gsave translate 45 rotate 0 0 S2 stroke grestore } bind def\n",
                    407:     "/D3 { gsave translate 45 rotate 0 0 S3 stroke grestore } bind def\n",
                    408:     "/D4 { gsave translate 45 rotate 0 0 S4 stroke grestore } bind def\n",
                    409:     "/D5 { gsave translate 45 rotate 0 0 S5 stroke grestore } bind def\n",
                    410:     "/D6 { gsave translate 45 rotate 0 0 S6 stroke grestore } bind def\n",
                    411:     "/D7 { gsave translate 45 rotate 0 0 S7 stroke grestore } bind def\n",
                    412:     "/D8 { gsave translate 45 rotate 0 0 S8 stroke grestore } bind def\n",
                    413:     "/D9 { gsave translate 45 rotate 0 0 S9 stroke grestore } bind def\n",
                    414:     "/D10 { gsave translate 45 rotate 0 0 S10 stroke grestore } bind def\n",
                    415:     "/D11 { gsave translate 45 rotate 0 0 S11 stroke grestore } bind def\n",
                    416:     "/D12 { gsave translate 45 rotate 0 0 S12 stroke grestore } bind def\n",
                    417:     "/D13 { gsave translate 45 rotate 0 0 S13 stroke grestore } bind def\n",
                    418:     "/D14 { gsave translate 45 rotate 0 0 S14 stroke grestore } bind def\n",
                    419:     "/D15 { gsave translate 45 rotate 0 0 S15 stroke grestore } bind def\n",
                    420:
                    421:     NULL
                    422: };
                    423:
                    424: static char GPFAR *GPFAR ENHNEXT_header[] =
                    425: {
                    426: /* For MFshow and MFwidth the tos is an array with the string and font info:  */
                    427: /*     [<fontname (a string)> <fontsize> <vertical offset> <width significant?> <text string>]  */
                    428:
                    429:     "/MFshow {{dup dup 0 get findfont exch 1 get scalefont setfont\n",
                    430:     "     [ currentpoint ] exch dup 2 get 0 exch rmoveto dup 4 get show dup\n",
                    431:     "     3 get {2 get neg 0 exch rmoveto pop} {pop aload pop moveto}ifelse} forall} bind def\n",
                    432:     "/MFwidth {0 exch {dup 3 get{dup dup 0 get findfont exch 1 get scalefont setfont\n",
                    433:     "      4 get stringwidth pop add}\n",
                    434:     "    {pop} ifelse} forall} bind def\n",
                    435:
                    436: /* flush left show */
                    437:     "/MLshow { currentpoint stroke M\n",
                    438:     "  0 exch R MFshow } bind def\n",
                    439:
                    440: /* flush right show */
                    441:     "/MRshow { currentpoint stroke M\n",
                    442:     "  exch dup MFwidth neg 3 -1 roll R MFshow } def\n",
                    443:
                    444: /* centred show */
                    445:     "/MCshow { currentpoint stroke M\n",
                    446:     "  exch dup MFwidth -2 div 3 -1 roll R MFshow } def\n",
                    447:     NULL
                    448: };
                    449:
                    450: /* added to post by Matt Heffron <heffron@falstaff.css.beckman.com> */
                    451: /* moved to post.trm by drd */
                    452:
                    453: struct NEXT_FontName {
                    454:     char *name;
                    455:     struct NEXT_FontName *next;
                    456: } *NEXT_DocFonts = NULL;
                    457:
                    458: TERM_PUBLIC char *NEXT_RememberFont(fname)
                    459: char *fname;
                    460: {
                    461:     struct NEXT_FontName *fnp;
                    462:
                    463:     for (fnp = NEXT_DocFonts; fnp && strcmp(fnp->name, fname); fnp = fnp->next);
                    464:     if (fnp)
                    465:        return fnp->name;       /* we must have found it in the list */
                    466:
                    467:     if (encoding == ENCODING_ISO_8859_1) {
                    468:        NEXTPrintf("/%s reencodeISO def\n", fname);
                    469:     }
                    470:     fnp = (struct NEXT_FontName *) gp_alloc(sizeof(struct NEXT_FontName), "PostScript Font record");
                    471:     fnp->name = gp_alloc(1 + strlen(fname), "PostScript Font name");
                    472:     strcpy(fnp->name, fname);
                    473:     fnp->next = NEXT_DocFonts;
                    474:     NEXT_DocFonts = fnp;
                    475:     return fnp->name;
                    476: }
                    477:
                    478: int NEXT_pen_x, NEXT_pen_y;
                    479: int NEXT_taken;
                    480: int NEXT_linetype_last;
                    481: TBOOLEAN NEXT_relative_ok;
                    482:
                    483: TERM_PUBLIC void NEXT_options()
                    484: {
                    485:     char buf[40];
                    486:     for (; !END_OF_COMMAND; ++c_token) {
                    487:        if (almost_equals(c_token, "d$efault")) {
                    488:            NEXT_oldterminal = FALSE;
                    489:            /*NEXT_color=NEXT_colordetect(); */
                    490:            NEXT_color = FALSE;
                    491:            NEXT_solid = FALSE;
                    492:            NEXT_duplex_option = FALSE;
                    493:            strcpy(NEXT_font, "Helvetica");
                    494:            NEXT_fontsize = 14;
                    495:            term->v_char = (unsigned int) (NEXT_fontsize * NEXT_SC);
                    496:            term->h_char = (unsigned int) (NEXT_fontsize * NEXT_SC * 6 / 10);
                    497:            term->put_text = NEXT_put_text;
                    498:        } else if (almost_equals(c_token, "mono$chrome")) {
                    499:            NEXT_color = FALSE;
                    500:        } else if (almost_equals(c_token, "col$or")
                    501:                   || almost_equals(c_token, "col$our")) {
                    502:            NEXT_color = TRUE;
                    503:        }
                    504:        /*
                    505:           else if (almost_equals(c_token,"auto$detect")) {
                    506:           NEXT_color = NEXT_colordetect();
                    507:           }
                    508:         */
                    509:
                    510:        else if (almost_equals(c_token, "so$lid")) {
                    511:            NEXT_solid = TRUE;
                    512:        } else if (almost_equals(c_token, "da$shed")) {
                    513:            NEXT_solid = FALSE;
                    514:        } else if (almost_equals(c_token, "si$mplex")) {
                    515:            NEXT_duplex_state = FALSE;
                    516:            NEXT_duplex_option = TRUE;
                    517:        } else if (almost_equals(c_token, "du$plex")) {
                    518:            NEXT_duplex_state = TRUE;
                    519:            NEXT_duplex_option = TRUE;
                    520:        } else if (almost_equals(c_token, "defaultp$lex")) {
                    521:            NEXT_duplex_option = FALSE;
                    522:        } else if (isstring(c_token)) {
                    523:            quote_str(NEXT_font, c_token, MAX_LINE_LEN + 1);
                    524:
                    525:            /* We must have font size specified */
                    526:            copy_str(buf, ++c_token, 40);
                    527:            NEXT_fontsize = atoi(buf);
                    528:            term->v_char = (unsigned int) (NEXT_fontsize * NEXT_SC);
                    529:            term->h_char = (unsigned int) (NEXT_fontsize * NEXT_SC * 6 / 10);
                    530:            sprintf(default_font, "%s,%d", NEXT_font, NEXT_fontsize);
                    531:        } else if (almost_equals(c_token, "ti$tle")) {
                    532:            if (!isstring(++c_token)) {
                    533:                fprintf(stderr, "usage:  set term next title \"newtitle\"\n");
                    534:                --c_token;
                    535:            }
                    536:            quote_str(NEXT_title, c_token, MAX_LINE_LEN + 1);
                    537:        } else if (almost_equals(c_token, "old")) {
                    538:            NEXT_oldterminal = TRUE;
                    539:        } else if (almost_equals(c_token, "new")) {
                    540:            NEXT_oldterminal = FALSE;
                    541:        }
                    542:     }
                    543:
                    544:
                    545:
                    546:     sprintf(term_options, "%s %s %s %s \"%s\" %d title \"%s\"",
                    547:            NEXT_oldterminal ? "old" : "new",
                    548:            NEXT_color ? "color" : "monochrome",
                    549:            NEXT_solid ? "solid" : "dashed",
                    550:            NEXT_duplex_option ? (NEXT_duplex_state ? "duplex" : "simplex")
                    551:            : "defaultplex",
                    552:            NEXT_font,
                    553:            NEXT_fontsize,
                    554:            NEXT_title);
                    555: }
                    556:
                    557: /* store settings passed to common_init() for use in NEXT_graphics()
                    558:  * are reserved for storing the term options
                    559:  */
                    560: static int NEXT_common_uses_fonts;
                    561: static unsigned int NEXT_common_xoff, NEXT_common_yoff;
                    562:
                    563:
                    564: TERM_PUBLIC void NEXT_common_init(uses_fonts, xoff, yoff, width, height, dict)
                    565: int uses_fonts;                        /* 0 for NEXT(la)tex */
                    566: unsigned int xoff, yoff;       /* offset  - 50 for /post, 0 for NEXT(la)tex */
                    567: unsigned int width, height;    /* for bounding box */
                    568: char **dict;                   /* extra entries for the dictionary */
                    569: {
                    570:     static char GPFAR NEXTi1[] = "%%%%Creator: gnuplot\n\
                    571: %%%%DocumentFonts: %s\n";
                    572:     static char GPFAR NEXTi2[] = "%%%%EndComments\n\
                    573: /gnudict 120 dict def\ngnudict begin\n\
                    574: /Color %s def\n\
                    575: /Solid %s def\n\
                    576: /gnulinewidth %.3f def\n\
                    577: /vshift %d def\n\
                    578: /dl {%d mul} def\n\
                    579: /hpt %.1f def\n\
                    580: /vpt %.1f def\n";
                    581:     static char GPFAR *NEXT_iso_8859_1_encoding[] =
                    582:     {
                    583:        "/reencodeISO {\n",
                    584:        "dup dup findfont dup length dict begin\n",
                    585:        "{ 1 index /FID ne { def }{ pop pop } ifelse } forall\n",
                    586:        "/Encoding ISOLatin1Encoding def\n",
                    587:        "currentdict end definefont\n",
                    588:        "} def\n",
                    589:        "/ISOLatin1Encoding [\n",
                    590:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    591:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    592:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    593:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    594:        "/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright\n",
                    595:        "/parenleft/parenright/asterisk/plus/comma/minus/period/slash\n",
                    596:        "/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon\n",
                    597:        "/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N\n",
                    598:        "/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright\n",
                    599:        "/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m\n",
                    600:        "/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde\n",
                    601:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    602:        "/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef\n",
                    603:        "/.notdef/dotlessi/grave/acute/circumflex/tilde/macron/breve\n",
                    604:        "/dotaccent/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut\n",
                    605:        "/ogonek/caron/space/exclamdown/cent/sterling/currency/yen/brokenbar\n",
                    606:        "/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot\n",
                    607:        "/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior\n",
                    608:        "/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine\n",
                    609:        "/guillemotright/onequarter/onehalf/threequarters/questiondown\n",
                    610:        "/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla\n",
                    611:        "/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex\n",
                    612:        "/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis\n",
                    613:        "/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute\n",
                    614:        "/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis\n",
                    615:        "/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave\n",
                    616:        "/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex\n",
                    617:        "/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis\n",
                    618:        "/yacute/thorn/ydieresis\n",
                    619:        "] def\n",
                    620:        NULL};
                    621:
                    622:
                    623:     struct termentry *t = term;
                    624:     int i;
                    625:
                    626:     NEXT_common_uses_fonts = uses_fonts;
                    627:     NEXT_common_xoff = xoff;
                    628:     NEXT_common_yoff = yoff;
                    629:
                    630:
                    631:     NEXTPrintf("%%!NEXT-Adobe-2.0\n");
                    632:
                    633:     NEXTPrintf(NEXTi1, uses_fonts ? "(atend)" : "");
                    634:
                    635:     NEXTPrintf("%%%%BoundingBox: %d %d %d %d\n", xoff, yoff,
                    636:               (int) (xsize * width / NEXT_SC + 0.5 + xoff),
                    637:               (int) (ysize * height / NEXT_SC + 0.5 + yoff));
                    638:
                    639:     NEXTPrintf(NEXTi2,
                    640:               NEXT_color ? "true" : "false",
                    641:               NEXT_solid ? "true" : "false",
                    642:               NEXT_LW,         /* line width */
                    643:               (int) (t->v_char) / (-3),        /* shift for vertical centring */
                    644:               NEXT_SC,         /* dash length */
                    645:               NEXT_HTIC / 2.0, /* half point width */
                    646:               NEXT_VTIC / 2.0);        /* half point height */
                    647:
                    648:     if (uses_fonts && (encoding == ENCODING_ISO_8859_1)) {
                    649:        for (i = 0; NEXT_iso_8859_1_encoding[i] != NULL; i++) {
                    650:            NEXTPrintf("%s", NEXT_iso_8859_1_encoding[i]);
                    651:        }
                    652:     }
                    653:     for (i = 0; NEXT_header[i] != NULL; i++)
                    654:        NEXTPrintf("%s", NEXT_header[i]);
                    655:     if (NEXT_duplex_option)
                    656:        NEXTPrintf("statusdict begin %s setduplexmode end\n",
                    657:                   NEXT_duplex_state ? "true" : "false");
                    658:     NEXT_RememberFont(NEXT_font);
                    659:
                    660:     if (dict)
                    661:        while (*dict)
                    662:            NEXTPrintf("%s", *(dict++));
                    663:
                    664:     NEXTPrintf("end\n%%%%EndProlog\n");
                    665: }
                    666:
                    667: /* the init fn for the NeXT Terminal driver */
                    668: TERM_PUBLIC void NEXT_init()
                    669: {
                    670:
                    671:     /* Initialize output string */
                    672:     NEXTsize = DEFAULTNEXTSIZE;
                    673:     if ((NEXTBuffer = malloc(NEXTsize)) == NULL) {
                    674:        printf("Malloc error in next filter init\n");
                    675:        exit(1);
                    676:     }
                    677:     NEXTBufEnd = NEXTBuffer + NEXTsize;
                    678:     NEXTBufAt = NEXTBuffer;
                    679:
                    680:
                    681:     term->xmax = NEXT_XMAX;
                    682:     term->ymax = NEXT_YMAX;
                    683:
                    684: #ifdef NEXT_OLDTERMINAL
                    685:     if (NEXT_oldterminal)
                    686:        window_create();
                    687:     else
                    688:        gnuTermAccess =[[GnuTermDriver alloc] init];
                    689: #else
                    690:     gnuTermAccess =[[GnuTermDriver alloc] init];
                    691: #endif
                    692:
                    693:
                    694:
                    695: }
                    696:
                    697:
                    698: TERM_PUBLIC void NEXT_graphics()
                    699: {
                    700:     static char GPFAR NEXTg1[] = "0 setgray\nnewpath\n";
                    701:     struct termentry *t = term;
                    702:
                    703:     *NEXTBuffer = 0;
                    704:     NEXTBufAt = NEXTBuffer;
                    705:
                    706:     NEXT_common_init(1, NEXT_XOFF, NEXT_YOFF, term->xmax, term->ymax,
                    707:                     ENHNEXT_header);
                    708:
                    709:     NEXTPrintf("gnudict begin\ngsave\n");
                    710:     NEXTPrintf("%d %d translate\n", NEXT_common_xoff, NEXT_common_yoff);
                    711:     NEXTPrintf("%.3f %.3f scale\n", 1.0 / NEXT_SC, 1.0 / NEXT_SC);
                    712:
                    713:
                    714:     NEXTPrintf(NEXTg1);
                    715:     if (NEXT_common_uses_fonts)
                    716:        NEXTPrintf("(%s) findfont %d scalefont setfont\n", NEXT_font, (t->v_char));
                    717:     NEXT_path_count = 0;
                    718:     NEXT_relative_ok = FALSE;
                    719:     NEXT_pen_x = NEXT_pen_y = -4000;
                    720:     NEXT_taken = 0;
                    721:     NEXT_linetype_last = -1;
                    722:
                    723: #ifdef NEXT_OLDTERMINAL
                    724:     if (NEXT_oldterminal) {
                    725:        /* Fill window with white */
                    726:        NEXTPrintf("1 setgray\n");
                    727:        NEXTPrintf("0 0 %d %d rectfill\n", NEXT_XMAX, NEXT_YMAX);
                    728:        NEXTPrintf("0 setgray\n");
                    729:     }
                    730: #endif
                    731:
                    732:
                    733: }
                    734:
                    735:
                    736: TERM_PUBLIC void NEXT_text()
                    737: {
                    738:     static DPSContext d;
                    739:
                    740:     NEXT_path_count = 0;
                    741:     NEXTPrintf("stroke\ngrestore\nend\n");
                    742:
                    743:     /* Terminate string */
                    744:     *NEXTBufAt = 0;
                    745:
                    746:     if (NEXT_oldterminal) {
                    747:        d = DPSGetCurrentContext();
                    748:        DPSPrintf(d, NEXTBuffer);
                    749:        DPSFlushContext(d);
                    750:     } else {
                    751:        /* Here's the call that dumps the string to the server */
                    752:       [gnuTermAccess plot:NEXTBuffer];
                    753:
                    754:     }
                    755:
                    756: }
                    757:
                    758:
                    759: TERM_PUBLIC void NEXT_reset()
                    760: {
                    761:     NEXTPrintf("%%%%Trailer\n");
                    762:     if (!NEXT_common_uses_fonts) {
                    763:        NEXTPrintf("%%%%DocumentFonts: ");
                    764:        while (NEXT_DocFonts) {
                    765:            struct NEXT_FontName *fnp;
                    766:            fnp = NEXT_DocFonts->next;
                    767:            NEXTPrintf("%s%s", NEXT_DocFonts->name, fnp ? ", " : "\n");
                    768:            free(NEXT_DocFonts->name);
                    769:            free(NEXT_DocFonts);
                    770:            NEXT_DocFonts = fnp;
                    771:        }
                    772:     }
                    773: }
                    774:
                    775:
                    776: TERM_PUBLIC void NEXT_linetype(linetype)
                    777: int linetype;
                    778: {
                    779:     linetype = (linetype % 9) + 2;
                    780:     if (linetype < 0)
                    781:        linetype = 0;
                    782:     NEXT_relative_ok = FALSE;
                    783:     if (NEXT_linetype_last == linetype)
                    784:        return;
                    785:     NEXT_linetype_last = linetype;
                    786:     NEXTPrintf("LT%c\n", "ba012345678"[linetype]);
                    787:     NEXT_path_count = 0;
                    788: }
                    789:
                    790:
                    791: TERM_PUBLIC void NEXT_move(x, y)
                    792: unsigned int x, y;
                    793: {
                    794:     int dx, dy;
                    795:     char abso[20], rel[20];
                    796:     dx = x - NEXT_pen_x;
                    797:     dy = y - NEXT_pen_y;
                    798:     /* can't cancel all null moves--need a move after stroke'ing */
                    799:     if (dx == 0 && dy == 0 && NEXT_relative_ok)
                    800:        return;
                    801:     sprintf(abso, "%d %d M\n", x, y);
                    802:     sprintf(rel, "%d %d R\n", dx, dy);
                    803:     if (strlen(rel) < strlen(abso) && NEXT_relative_ok) {
                    804:        NEXTPrintf("%s", rel);
                    805:        NEXT_taken++;
                    806:     } else
                    807:        NEXTPrintf("%s", abso);
                    808:     NEXT_relative_ok = TRUE;
                    809:     NEXT_path_count += 1;
                    810:
                    811:     NEXT_pen_x = x;
                    812:     NEXT_pen_y = y;
                    813: }
                    814:
                    815: TERM_PUBLIC void NEXT_vector(x, y)
                    816: unsigned int x, y;
                    817: {
                    818:     int dx, dy;
                    819:     char abso[20], rel[20];
                    820:     dx = x - NEXT_pen_x;
                    821:     dy = y - NEXT_pen_y;
                    822:     if (dx == 0 && dy == 0)
                    823:        return;
                    824:     sprintf(abso, "%d %d L\n", x, y);
                    825:     sprintf(rel, "%d %d V\n", dx, dy);
                    826:     if (strlen(rel) < strlen(abso) && NEXT_relative_ok) {
                    827:        NEXTPrintf("%s", rel);
                    828:        NEXT_taken++;
                    829:     } else
                    830:        NEXTPrintf("%s", abso);
                    831:     NEXT_relative_ok = TRUE;
                    832:     NEXT_path_count += 1;
                    833:     NEXT_pen_x = x;
                    834:     NEXT_pen_y = y;
                    835:     if (NEXT_path_count >= 400) {
                    836:        NEXTPrintf("currentpoint stroke M\n");
                    837:        NEXT_path_count = 0;
                    838:     }
                    839: }
                    840:
                    841:
                    842:
                    843:
                    844: TERM_PUBLIC int NEXT_text_angle(ang)
                    845: int ang;
                    846: {
                    847:     NEXT_ang = ang;
                    848:     return TRUE;
                    849: }
                    850:
                    851:
                    852: TERM_PUBLIC int NEXT_justify_text(mode)
                    853: enum JUSTIFY mode;
                    854: {
                    855:     NEXT_justify = mode;
                    856:     return TRUE;
                    857: }
                    858:
                    859:
                    860: TERM_PUBLIC int NEXT_set_font(font) /* Entry font added by DJL */
                    861: char *font;
                    862: {
                    863:     char name[32];
                    864:     int size, sep;
                    865:
                    866:     sep = strcspn(font, ",");
                    867:     strncpy(name, font, sep);
                    868:     name[sep] = NUL;
                    869:     size = NEXT_fontsize;
                    870:     sscanf(&(font[sep + 1]), "%d", &size);
                    871:     NEXTPrintf("/%s findfont %d scalefont setfont\n", name, size * NEXT_SC);
                    872:     NEXT_RememberFont(name);
                    873:     return TRUE;
                    874: }
                    875:
                    876:
                    877: /* postscript point routines */
                    878:
                    879: TERM_PUBLIC void NEXT_set_pointsize(size)
                    880: double size;
                    881: {
                    882:     NEXTPrintf("/vpt %.1f def /hpt %.1f def /vpt2 vpt 2 mul def /hpt2 hpt 2 mul def\n",
                    883:               pointsize * NEXT_VTIC * 0.5, pointsize * NEXT_HTIC * 0.5);
                    884: }
                    885:
                    886: TERM_PUBLIC void NEXT_point(x, y, number)
                    887: unsigned int x, y;
                    888: int number;
                    889: {
                    890:     static char *pointFNS[] =
                    891:     {"Pnt", "Pls", "Crs", "Star",
                    892:      "Box", "BoxF", "Circle", "CircleF",
                    893:      "TriU", "TriUF", "TriD", "TriDF",
                    894:      "Dia", "DiaF", "Pent", "PentF",
                    895:      "C0", "C1", "C2", "C3",
                    896:      "C4", "C5", "C6", "C7",
                    897:      "C8", "C9", "C10", "C11",
                    898:      "C12", "C13", "C14", "C15",
                    899:      "S0", "S1", "S2", "S3",
                    900:      "S4", "S5", "S6", "S7",
                    901:      "S8", "S9", "S10", "S11",
                    902:      "S12", "S13", "S14", "S15",
                    903:      "D0", "D1", "D2", "D3",
                    904:      "D4", "D5", "D6", "D7",
                    905:      "D8", "D9", "D10", "D11",
                    906:      "D12", "D13", "D14", "D15"
                    907:     };
                    908:     if (number < 0)
                    909:        number = -1;            /* negative types are all 'dot' */
                    910:     else
                    911:        number %= sizeof(pointFNS) / sizeof(pointFNS[0]) - 1;
                    912:     NEXTPrintf("%d %d %s\n", x, y, pointFNS[number + 1]);
                    913:
                    914:     NEXT_relative_ok = 0;
                    915:     NEXT_path_count = 0;
                    916:     NEXT_linetype_last = -1;   /* force next linetype change */
                    917: }
                    918:
                    919:
                    920:
                    921:
                    922: /* All lifted from the enhanced postscript driver */
                    923:
                    924:
                    925:
                    926: static TBOOLEAN NEXT_opened_string;    /* try to cut out empty ()'s */
                    927:
                    928: /* used in determining height of processed text */
                    929:
                    930: static float NEXT_max_height, NEXT_min_height;
                    931:
                    932:
                    933: /* process a bit of string, and return the last character used.
                    934:  * p is start of string
                    935:  * brace is TRUE to keep processing to }, FALSE for do one character
                    936:  * fontname & fontsize are obvious
                    937:  * base is the current baseline
                    938:  * widthflag is TRUE if the width of this should count,
                    939:  *              FALSE for zero width boxes
                    940:  */
                    941:
                    942: static char *NEXT_recurse(p, brace, fontname, fontsize, base, widthflag)
                    943: char *p, *fontname;
                    944: TBOOLEAN brace, widthflag;
                    945: double fontsize, base;
                    946: {
                    947:
                    948: /* close a postscript string if it has been opened */
                    949: #define NEXT_FLUSH      \
                    950: {      if (NEXT_opened_string)  \
                    951:        {       NEXTPrintf("%s", ")]\n");   \
                    952:                NEXT_opened_string = FALSE; \
                    953:        }                         \
                    954: }
                    955:
                    956: #define NEXT_OPEN      \
                    957: {      if (!NEXT_opened_string) \
                    958:        { NEXTPrintf( "[(%s) %.1f %.1f %s (",  \
                    959:                  fontname, fontsize, base, \
                    960:                  widthflag ? "true" : "false");  \
                    961:          NEXT_opened_string = TRUE; \
                    962:        }       \
                    963: }
                    964:
                    965:
                    966:     /* Start each recursion with a clean string */
                    967:     NEXT_FLUSH
                    968:
                    969:        if (base + fontsize > NEXT_max_height) {
                    970:        NEXT_max_height = base + fontsize;
                    971:     }
                    972:     if (base < NEXT_min_height) {
                    973:        NEXT_min_height = base;
                    974:     }
                    975:     for (; *p; ++p) {
                    976:        float shift;
                    977:        float f = 0;            /* used for getting new font size */
                    978:        char *localfontname, ch;
                    979:
                    980:        switch (*p) {
                    981:        case '}':
                    982:            if (brace)
                    983:                return (p);
                    984:
                    985:            fprintf(stderr, "next driver - spurious }\n");
                    986:            break;
                    987:
                    988:        case '_':
                    989:        case '^':
                    990:            shift = (*p == '^') ? 0.5 : -0.3;
                    991:
                    992:            NEXT_FLUSH
                    993:
                    994:                p = NEXT_recurse(p + 1, FALSE, fontname, fontsize * 0.8, base + shift * fontsize, widthflag);
                    995:
                    996:            break;
                    997:
                    998:        case '{':
                    999:            /*{{{  recurse (possibly with a new font) */
                   1000:
                   1001:            if (*++p == '/') {  /* then parse a fontname, optional fontsize */
                   1002:                while (*++p == ' ');
                   1003:                localfontname = p;
                   1004:                while ((ch = *p) > ' ' && ch != '=')
                   1005:                    ++p;
                   1006:                if (ch == '=') {
                   1007:                    *p++ = '\0';
                   1008:                    /*{{{  get optional font size */
                   1009:                    f = (float) strtod(p, &p);
                   1010:
                   1011:                    if (f)
                   1012:                        f *= NEXT_SC;   /* remember the scaling */
                   1013:                    else
                   1014:                        f = fontsize;
                   1015:
                   1016:                    /*}}} */
                   1017:                } else {
                   1018:                    *p++ = '\0';
                   1019:                    f = fontsize;
                   1020:                }
                   1021:
                   1022:                while (*p == ' ')
                   1023:                    ++p;
                   1024:                if (*localfontname)
                   1025:                    localfontname = NEXT_RememberFont(localfontname);
                   1026:                else
                   1027:                    localfontname = fontname;
                   1028:            } else {
                   1029:                localfontname = fontname;
                   1030:                f = fontsize;
                   1031:            }
                   1032:            /*}}} */
                   1033:
                   1034:
                   1035:            p = NEXT_recurse(p, TRUE, localfontname, f, base, widthflag);
                   1036:
                   1037:
                   1038:            NEXT_FLUSH
                   1039:
                   1040:                break;
                   1041:
                   1042:        case '@':
                   1043:            /*{{{  phantom box - prints next 'char', then restores currentpoint */
                   1044:
                   1045:            NEXT_FLUSH
                   1046:
                   1047:                p = NEXT_recurse(++p, FALSE, fontname, fontsize, base, FALSE);
                   1048:
                   1049:            break;
                   1050:            /*}}} */
                   1051:
                   1052:        case '(':
                   1053:        case ')':
                   1054:            /* special cases */
                   1055:            NEXT_OPEN
                   1056:                NEXTPrintf("\\");
                   1057:            NEXTPrintf("%c", *p);
                   1058:            break;
                   1059:            /*}}} */
                   1060:
                   1061:        case '\\':
                   1062:            /*{{{  is it an escape */
                   1063:            /* special cases */
                   1064:
                   1065:            if (p[1] == '\\' || p[1] == '(' || p[1] == ')') {
                   1066:                NEXT_OPEN
                   1067:                    NEXTPrintf("%c", '\\');
                   1068:            } else if ((ch = p[1]) >= '0' && ch <= '7') {
                   1069:                /* up to 3 octal digits */
                   1070:                NEXT_OPEN
                   1071:                    NEXTPrintf("%c", '\\');
                   1072:                NEXTPrintf("%c", ch);
                   1073:                ++p;
                   1074:                if ((ch = p[1]) >= '0' && ch <= '7') {
                   1075:                    NEXTPrintf("%c", ch);
                   1076:                    ++p;
                   1077:                    if ((ch = p[1]) >= '0' && ch <= '7') {
                   1078:                        NEXTPrintf("%c", ch);
                   1079:                        ++p;
                   1080:                    }
                   1081:                }
                   1082:                break;
                   1083:            }
                   1084:            ++p;
                   1085:            /* just go and print it (fall into the 'default' case) */
                   1086:
                   1087:            /*}}} */
                   1088:        default:
                   1089:            NEXT_OPEN
                   1090:
                   1091:                NEXTPrintf("%c", *p);
                   1092:        }
                   1093:
                   1094:        /* like TeX, we only do one character in a recursion, unless it's
                   1095:         * in braces
                   1096:         */
                   1097:
                   1098:        if (!brace) {
                   1099:            NEXT_FLUSH
                   1100:                return (p);     /* the ++p in the outer copy will increment us */
                   1101:        }
                   1102:     }
                   1103:     NEXT_FLUSH
                   1104:        return p;
                   1105: }
                   1106:
                   1107:
                   1108: TERM_PUBLIC void NEXT_put_text(x, y, str)
                   1109: unsigned int x, y;
                   1110: char *str;
                   1111: {
                   1112:     /* flush any pending graphics (all the XShow routines do this...) */
                   1113:
                   1114:     if (!strlen(str))
                   1115:        return;
                   1116:
                   1117:     if (NEXT_path_count) {
                   1118:        NEXTPrintf(" stroke\n");
                   1119:        NEXT_path_count = 0;
                   1120:        NEXT_relative_ok = FALSE;
                   1121:     }
                   1122:     NEXT_move(x, y);
                   1123:
                   1124:     if (NEXT_ang != 0)
                   1125:        NEXTPrintf("currentpoint gsave translate %d rotate 0 0 moveto\n",
                   1126:                   NEXT_ang * 90);
                   1127:
                   1128:     NEXTPrintf("[ ");
                   1129:
                   1130:     /* set up the globals */
                   1131:
                   1132:     NEXT_opened_string = FALSE;
                   1133:     NEXT_max_height = -1000;
                   1134:     NEXT_min_height = 1000;
                   1135:
                   1136:     while (*(str = NEXT_recurse(str, TRUE, NEXT_font,
                   1137:                                (double) term->v_char,
                   1138:                                0.0, TRUE)));
                   1139:
                   1140:     NEXT_max_height += NEXT_min_height;
                   1141:
                   1142:     NEXTPrintf("] %.1f ", -NEXT_max_height / 3);
                   1143:
                   1144:     switch (NEXT_justify) {
                   1145:     case LEFT:
                   1146:        NEXTPrintf("MLshow\n");
                   1147:        break;
                   1148:     case CENTRE:
                   1149:        NEXTPrintf("MCshow\n");
                   1150:        break;
                   1151:     case RIGHT:
                   1152:        NEXTPrintf("MRshow\n");
                   1153:        break;
                   1154:     }
                   1155:
                   1156:     if (NEXT_ang != 0)
                   1157:        NEXTPrintf("grestore\n");
                   1158:     NEXT_path_count = 0;
                   1159:     NEXT_relative_ok = FALSE;
                   1160: }
                   1161:
                   1162:
                   1163:
                   1164: /*
                   1165: static TBOOLEAN NEXT_colordetect()
                   1166: {
                   1167:        NXScreen * mainscreen;
                   1168:
                   1169:        mainscreen = [Application mainScreen];
                   1170:        if (mainscreen->depth == NX_TwoBitGrayDepth) return(FALSE);
                   1171:        return(TRUE);
                   1172: }
                   1173: */
                   1174:
                   1175:        /* This just packs all the postscript into one (possibly huge) string
                   1176:         * which will be passed (as a fake pointer) via D.O. to the server
                   1177:         */
                   1178:
                   1179: void NEXTPrintf(char *fmt,...)
                   1180: {
                   1181:     va_list ap;
                   1182:     char *pb;
                   1183:     int NEXToff;
                   1184:
                   1185:     /* Process formatting instructions */
                   1186:     va_start(ap, fmt);
                   1187:     vsprintf(NEXTTmpBuf, fmt, ap);
                   1188:     va_end(ap);
                   1189:
                   1190:     /* Add to buffer */
                   1191:     for (pb = NEXTTmpBuf; (*pb != 0); ++pb, ++NEXTBufAt) {
                   1192:        /* reallocate if necessary */
                   1193:        if (NEXTBufAt >= NEXTBufEnd) {
                   1194:            NEXToff = NEXTBufAt - NEXTBuffer;
                   1195:            NEXTsize *= 2;
                   1196:            NEXTBuffer = realloc(NEXTBuffer, NEXTsize);
                   1197:            NEXTBufEnd = NEXTBuffer + NEXTsize;
                   1198:            NEXTBufAt = NEXTBuffer + NEXToff;
                   1199:        }
                   1200:        *NEXTBufAt = *pb;
                   1201:     }
                   1202:
                   1203:     return;
                   1204:
                   1205: }
                   1206:
                   1207: /*  This next section implements the GnuTermDriver object which manages
                   1208:        the D.O. connection and interface to OBjC
                   1209: */
                   1210:
                   1211:
                   1212: @protocol GnuTermServerMethods
                   1213: /*- (oneway) executePScode:(in char *)PStext termTitle:(in char *)title;*/
                   1214: - executePScode:(in char *)
                   1215: PStext termTitle:(in char *) title;
                   1216: @end
                   1217:
                   1218:
1.1.1.2 ! maekawa  1219: @implementation GnuTermDriver
1.1       maekawa  1220:
                   1221: - init
                   1222: {
                   1223:     NXConnection *myConnection;
                   1224:     char serverpath[100], *envstring;
                   1225:     int GnuTermPathSet = 0;
                   1226:
                   1227:
                   1228:     /* Ask OS for connection to server */
                   1229:   server =[NXConnection connectToName:"gnuplotServer"];
                   1230:
                   1231:     /* Server is running ready to go */
                   1232:     if (server)                        /*printf("Connected to server\n") */
                   1233:        ;
                   1234:
                   1235:     /* Server isn't running, we must fire it up */
                   1236:     else {
                   1237:        /*printf("Launching GnuTerm\n"); */
                   1238:        *serverpath = 0;
                   1239:
                   1240:        /* Check for path set in environment */
                   1241:        if ((envstring = getenv("GNUTERMPATH")) != (char *) NULL) {
                   1242:            sprintf(serverpath, "%s/GnuTerm.app/GnuTerm", envstring);
                   1243:            GnuTermPathSet = 1;
                   1244:        }
                   1245:        /* Not in environment */
                   1246:        else
                   1247:            strcpy(serverpath, "GnuTerm");
                   1248:
                   1249:        /* Try to launch application */
                   1250:       if ([[Application workspace] launchApplication:serverpath] == NO) {
                   1251:            printf("Failed to launch %s.\n", serverpath);
                   1252:            /* Offer a little advice */
                   1253:            if (GnuTermPathSet) {
                   1254:                printf("You must have setenv GNUTERMPATH to something wrong\n");
                   1255:                printf("I recommend you exit gnuplot and fix this.\n");
                   1256:            } else {
                   1257:                printf("It must be located in ~/Apps or /LocalApps\n");
                   1258:                printf("I recommend that you either\n");
                   1259:                printf("- move GnuTerm.app to one of these locations\n");
                   1260:                printf("- set GNUTERMPATH with host%%  setenv GNUTERMPATH /directory/containing_GnuTerm.app\n");
                   1261:                printf("- start GnuTerm ahead of the first plot command\n");
                   1262: #ifdef NEXT_OLDTERMINAL
                   1263:                printf("- use the old driver version (set term next old)\n");
                   1264: #endif
                   1265:            }
                   1266:        }
                   1267:        /* I wish the gnuplot terminal interface would
                   1268:           let me return an error here.
                   1269:         */
                   1270:
                   1271:        /* Application is launching */
                   1272:        else {
                   1273:            /* Wait for it to register Server methods with OS */
                   1274:            do {
                   1275:              server =[NXConnection connectToName:"gnuplotServer"];
                   1276:            } while (!server);  /* This could result in a hang,
                   1277:                                   but I've never seen it fail */
                   1278:        }
                   1279:     }
                   1280:
                   1281:
                   1282:     /* By limiting ourselves to known protocol
                   1283:      * we speed up the messaging
                   1284:      */
                   1285:   [server setProtocolForProxy:@protocol(GnuTermServerMethods)];
                   1286:
                   1287:     myConnection =[server connectionForProxy];
                   1288:
                   1289:     /* If the server dies we want to know about it */
                   1290:   [myConnection registerForInvalidationNotification:self];
                   1291:     /* In fact, we'll worry about it */
                   1292:     [NXPort worryAboutPortInvalidation];
                   1293:
                   1294:     return self;
                   1295: }
                   1296:
                   1297:
                   1298: -plot:(char *) PSstr;
                   1299: {
                   1300:     /* If server has become invalid, re-initialize */
                   1301:     if (!server)
                   1302:        [self init];
                   1303:
                   1304:     /* This is where we send the huge postscript string to the server
                   1305:        Note:
                   1306:        The D.O. system doesn't actually give this pointer to the server.
                   1307:        The pointer is dereferenced on the client side and the
                   1308:        resulting data is sent to the server. On the server side,
                   1309:        space for the data is automatically allocated, and a pointer to
                   1310:        the local data is received.
                   1311:        For details check out:
                   1312:        /NextLibrary/Documentation/NextDev/GeneralRef/06_DistributedObjects/IntroDistObjects.rtf
                   1313:      */
                   1314:
                   1315:     /*printf("Calling server..."); */
                   1316:   [server executePScode: PSstr termTitle:NEXT_title];
                   1317:     /*printf("returned\n"); */
                   1318:     *NEXT_title = 0;
                   1319:
                   1320:     return self;
                   1321: }
                   1322:
                   1323:                                                        /* This gets called by OS if server goes down */
                   1324: -senderIsInvalid:(id) sender
                   1325: {
                   1326:     server = 0;
                   1327: }
                   1328:
                   1329: @end
                   1330:
                   1331: #ifdef NEXT_OLDTERMINAL
                   1332:
                   1333: static void window_create()
                   1334: {
                   1335:     float width, height;
                   1336:
                   1337:     width = (xsize * (NEXT_XMAX) / NEXT_SC + 0.5 + NEXT_XOFF);
                   1338:     height = (ysize * (NEXT_YMAX) / NEXT_SC + 0.5 + NEXT_YOFF);
                   1339:
                   1340:     NXApp =[EpsViewer new];
                   1341:   [NXApp windowCreate: width Height:height];
                   1342: }
                   1343:
                   1344: @implementation EpsViewer
                   1345:
                   1346: - windowCreate:(NXCoord)
                   1347: width Height:(NXCoord) height
                   1348: {
                   1349:
                   1350:     /* create the new window, in a good place */
                   1351:     theNewWin =[Window
                   1352:   newContent: [self nextRectForWidth: width Height:height]
                   1353:   style:       NX_TITLEDSTYLE
                   1354:   backing:     NX_RETAINED
                   1355:   buttonMask:  (NX_CLOSEBUTTONMASK | NX_MINIATURIZEBUTTONMASK)
                   1356:   defer:       NO];
                   1357:     /* we need to receive windowDidBecomeMain: and windowDidResignMain: */
                   1358:   [theNewWin setDelegate:self];
                   1359:     /*
                   1360:      * create a new View, make it the contentView of our new window,
                   1361:      * and destroy the window's old contentView
                   1362:      */
                   1363:   [[theNewWin setContentView:[[View alloc] init]] free];
                   1364:     /* display the window, and bring it forth */
                   1365:     [theNewWin display];
                   1366:   [theNewWin makeKeyAndOrderFront:self];
                   1367: /*     [theNewWin orderBack:self];                     */
                   1368:     /* show the frame */
                   1369:     return self;
                   1370: }
                   1371:
                   1372: /***************************************************************************/
                   1373: /* nextRectForWidth:Height: - return the next good content rectangle       */
                   1374: /*  from Carl F. Sutter's wonderful ViewGif2 'Controller' method...        */
                   1375: /***************************************************************************/
                   1376: /* nextTopLeft - return the next good top left window position            */
                   1377: /***************************************************************************/
                   1378:
                   1379: -(NXRect *) nextRectForWidth:(NXCoord)
                   1380: width Height:(NXCoord) height
                   1381: {
                   1382: #define OFFSET 10.0
                   1383: #define MAX_STEPS 20
                   1384: #define INITIAL_X 356.0
                   1385: #define INITIAL_Y 241.0
                   1386:     NXPoint nxpTopLeft;
                   1387:     NXRect nxrTemp;            /* used to find window height    */
                   1388:     NXRect nxrWinHeight;       /* bounds of enclosing window    */
                   1389:     NXSize nxsScreen;          /* size of screen                */
                   1390:     static NXRect nxrResult;   /* the Answer!                   */
                   1391:     static int nCurStep = 0;
                   1392:
                   1393:     /* find a good top-left coord */
                   1394:     nxpTopLeft.x = INITIAL_X + nCurStep * OFFSET;
                   1395:     nxpTopLeft.y = INITIAL_Y + nCurStep * OFFSET;
                   1396:     if (++nCurStep > MAX_STEPS)
                   1397:        nCurStep = 0;
                   1398:     /* find window height using nxrTemp */
                   1399:     nxrTemp.size.width = width;
                   1400:     nxrTemp.size.height = height;
                   1401:     nxrTemp.origin.x = nxrTemp.origin.y = 0;
                   1402:   [Window getFrameRect: &nxrWinHeight forContentRect:&nxrTemp
                   1403:   style:NX_TITLEDSTYLE];
                   1404:   [NXApp getScreenSize:&nxsScreen];
                   1405:     /* find the lower-left coord */
                   1406:     nxrResult.origin.x = nxpTopLeft.x;
                   1407:     nxrResult.origin.y = nxsScreen.height - nxrWinHeight.size.height - nxpTopLeft.y;
                   1408:     nxrResult.size.width = width;
                   1409:     nxrResult.size.height = height;
                   1410:     return (&nxrResult);
                   1411: }
                   1412:
                   1413: @end
                   1414: #endif /* NEXT_OLDTERMINAL */
                   1415:
                   1416:
                   1417: #endif /* TERM_BODY */
                   1418:
                   1419: #ifdef TERM_TABLE
                   1420:
                   1421:
                   1422: TERM_TABLE_START(next_driver)
                   1423:     "next",
                   1424:     "Interface to GnuTerm.app under NeXTstep",
                   1425:     NEXT_XMAX, NEXT_YMAX, NEXT_VCHAR, NEXT_HCHAR,
                   1426:     NEXT_VTIC, NEXT_HTIC, NEXT_options, NEXT_init, NEXT_reset,
                   1427:     NEXT_text, null_scale, NEXT_graphics, NEXT_move, NEXT_vector,
                   1428:     NEXT_linetype, NEXT_put_text, NEXT_text_angle,
                   1429:     NEXT_justify_text, NEXT_point, do_arrow, NEXT_set_font,
                   1430:     NEXT_set_pointsize
                   1431: TERM_TABLE_END(next_driver)
                   1432:
                   1433: #undef LAST_TERM
                   1434: #define LAST_TERM next_driver
                   1435:
                   1436: #endif /* TERM_TABLE */
                   1437: #endif /* TERM_PROTO_ONLY */
                   1438:
                   1439:
                   1440:
                   1441: #ifdef TERM_HELP
                   1442: START_HELP(next)
                   1443: "1 next",
                   1444: "?commands set terminal next",
                   1445: "?set terminal next",
                   1446: "?set term next",
                   1447: "?terminal next",
                   1448: "?term next",
                   1449: "?next",
                   1450: "?NeXT",
                   1451: " Several options may be set in the next driver.",
                   1452: "",
                   1453: " Syntax:",
                   1454: "       set terminal next {<mode>} {<type> } {<color>} {<dashed>}",
                   1455: "                  {\"<fontname>\"} {<fontsize>} title {\"<newtitle>\"}",
                   1456: "",
                   1457: " where <mode> is  `default`, which sets all options to their defaults;",
                   1458: " <type> is either `new` or `old`, where `old` invokes the old single window;",
                   1459: " <color> is either `color` or `monochrome`;",
                   1460: " <dashed> is either `solid` or `dashed`;",
                   1461: " \"<fontname>\" is the name of a valid PostScript font;",
                   1462: " <fontsize> is the size of the font in PostScript points; and",
                   1463: " <title> is the title for the GnuTerm window.",
                   1464: " Defaults are  `new`, `monochrome`, `dashed`, \"Helvetica\", 14pt.",
                   1465: "",
                   1466: " Examples:",
                   1467: "       set term next default",
                   1468: "       set term next 22",
                   1469: "       set term next color \"Times-Roman\" 14",
                   1470: "       set term next color \"Helvetica\" 12 title \"MyPlot\"",
                   1471: "       set term next old",
                   1472: "",
                   1473: " Pointsizes may be changed with `set linestyle`."
                   1474: END_HELP(next)
                   1475: #endif /* TERM_HELP */

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