/* Hello, Emacs, this is -*-C-*- * $Id: tek.trm,v 1.18.2.1 2009/08/14 01:23:06 sfeam Exp $ * */ /* GNUPLOT - tek.trm */ /*[ * Copyright 1990 - 1993, 1998, 2004 * * Permission to use, copy, and distribute this software and its * documentation for any purpose with or without fee is hereby granted, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. * * Permission to modify the software is granted, but not the right to * distribute the complete modified source code. Modifications are to * be distributed as patches to the released version. Permission to * distribute binaries produced by compiling modified sources is granted, * provided you * 1. distribute the corresponding source modifications from the * released version in the form of a patch file along with the binaries, * 2. add special version identification to distinguish your version * in addition to the base release version number, * 3. provide your name and address as the primary contact for the * support of your modified version, and * 4. retain our contact information in regard to use of the base * software. * Permission to distribute the released version of the source code along * with corresponding source modifications in the form of a patch file is * granted with same provisions 2 through 4 for binary distributions. * * This software is provided "as is" without express or implied warranty * to the extent permitted by applicable law. ]*/ /* * This file is included by ../term.c. * * This terminal driver supports: * tek40xx, bitgraph, kermit_color_tek40xx, kermit_mono_tek40xx, selanar * ln03plus, xterm * * AUTHORS * Colin Kelley, Thomas Williams, Russell Lang * * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net). * */ /* * Modified June 1995 Ian MacPhedran to support newterm format */ #define TEK #define CTEK #define VTTEK #define KERMIT #define SELANAR #define BITGRAPH #define XTERM #include "driver.h" #ifdef TERM_REGISTER register_term(tek40) #ifdef VTTEK register_term(vttek) #endif #ifdef KERMIT register_term(kc_tek40) register_term(km_tek40) #endif #ifdef SELANAR register_term(selanar) #endif #ifdef BITGRAPH register_term(bitgraph) #endif #ifdef XTERM register_term(xterm) #endif #endif /* TERM_REGISTER */ #ifdef TERM_PROTO TERM_PUBLIC void TEK40init __PROTO((void)); TERM_PUBLIC void TEK40graphics __PROTO((void)); TERM_PUBLIC void TEK40text __PROTO((void)); TERM_PUBLIC void TEK40linetype __PROTO((int linetype)); TERM_PUBLIC void TEK40move __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void TEK40vector __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void TEK40put_text __PROTO((unsigned int x, unsigned int y, const char str[])); TERM_PUBLIC void TEK40reset __PROTO((void)); TERM_PUBLIC void BG_text __PROTO((void)); TERM_PUBLIC void BG_put_text __PROTO((unsigned int x, unsigned int y, const char str[])); TERM_PUBLIC void KTEK40graphics __PROTO((void)); TERM_PUBLIC void KTEK40Ctext __PROTO((void)); TERM_PUBLIC void KTEK40Clinetype __PROTO((int linetype)); TERM_PUBLIC void KTEK40Mlinetype __PROTO((int linetype)); TERM_PUBLIC void KTEK40reset __PROTO((void)); TERM_PUBLIC void SEL_init __PROTO((void)); TERM_PUBLIC void SEL_graphics __PROTO((void)); TERM_PUBLIC void SEL_text __PROTO((void)); TERM_PUBLIC void SEL_reset __PROTO((void)); TERM_PUBLIC void VTTEK40init __PROTO((void)); TERM_PUBLIC void VTTEK40reset __PROTO((void)); TERM_PUBLIC void VTTEK40linetype __PROTO((int linetype)); TERM_PUBLIC void VTTEK40put_text __PROTO((unsigned int x, unsigned int y, const char str[])); TERM_PUBLIC void CTEK_linetype __PROTO((int linetype)); TERM_PUBLIC void CTEK_move __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void CTEK_vector __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void XTERM_graphics __PROTO((void)); TERM_PUBLIC void XTERM_resume __PROTO((void)); TERM_PUBLIC void XTERM_text __PROTO((void)); TERM_PUBLIC int XTERM_set_font __PROTO((const char * fontname)); #endif /* TERM_PROTO */ #ifndef TERM_PROTO_ONLY #ifdef TERM_BODY #ifdef TEK #define TEK40XMAX 1024 #define TEK40YMAX 780 #define TEK40XLAST (TEK40XMAX - 1) #define TEK40YLAST (TEK40YMAX - 1) #define TEK40VCHAR 25 #define TEK40HCHAR 14 #define TEK40VTIC 11 #define TEK40HTIC 11 #define HX 0x20 /* bit pattern to OR over 5-bit data */ #define HY 0x20 #define LX 0x40 #define LY 0x60 #define LOWER5 31 #define UPPER5 (31<<5) TERM_PUBLIC void TEK40init() { } TERM_PUBLIC void TEK40graphics() { #ifdef VMS term_pasthru(); #endif /* VMS */ fputs("\033\014", gpoutfile); /* 1 1. clear screen */ (void) fflush(gpoutfile); sleep(1); /* sleep 1 second to allow screen time to clear on real tektronix terminals */ } TERM_PUBLIC void TEK40text() { #ifdef VMS (void) fflush(gpoutfile); /* finish the graphics */ #endif TEK40move(0, 12); fputs("\037", gpoutfile); /* 1 1. into alphanumerics */ #ifdef VMS term_nopasthru(); #endif /* VMS */ } TERM_PUBLIC void TEK40linetype(int linetype) { (void) linetype; } TERM_PUBLIC void TEK40move(unsigned int x, unsigned int y) { (void) putc('\035', gpoutfile); /* into graphics */ TEK40vector(x, y); } TERM_PUBLIC void TEK40vector(unsigned int x, unsigned int y) { (void) putc((HY | (y & UPPER5) >> 5), gpoutfile); (void) putc((LY | (y & LOWER5)), gpoutfile); (void) putc((HX | (x & UPPER5) >> 5), gpoutfile); (void) putc((LX | (x & LOWER5)), gpoutfile); } TERM_PUBLIC void TEK40put_text(unsigned int x, unsigned int y, const char str[]) { TEK40move(x, y - 11); fprintf(gpoutfile, "\037%s\n", str); } TERM_PUBLIC void TEK40reset() { } #endif /* TEK */ /* thanks to dukecdu!evs (Ed Simpson) for the BBN BitGraph driver */ #ifdef BITGRAPH #define BG_XMAX 768 /* width of plot area */ #define BG_YMAX 768 /* height of plot area */ #define BG_SCREEN_HEIGHT 1024 /* full screen height */ #define BG_XLAST (BG_XMAX - 1) #define BG_YLAST (BG_YMAX - 1) #define BG_VCHAR 16 #define BG_HCHAR 9 #define BG_VTIC 8 #define BG_HTIC 8 #define BG_init TEK40init #define BG_graphics TEK40graphics #define BG_linetype TEK40linetype #define BG_move TEK40move #define BG_vector TEK40vector TERM_PUBLIC void BG_text() { #ifdef VMS (void) fflush(gpoutfile); /* finish the graphics */ #endif BG_move(0, BG_SCREEN_HEIGHT - 2 * BG_VCHAR); fputs("\037", gpoutfile); /* 1 1. into alphanumerics */ } TERM_PUBLIC void BG_put_text(unsigned int x, unsigned int y, const char str[]) { BG_move(x, y - 11); fprintf(gpoutfile, "\037%s\n", str); } #define BG_reset TEK40reset #endif /* BITGRAPH */ /* Color and Monochrome specials for the MS-DOS Kermit Tektronix Emulator by Russell Lang, eln272v@monu1.cc.monash.oz */ #ifdef KERMIT #define KTEK40HCHAR 13 TERM_PUBLIC void KTEK40graphics() { #ifdef VMS term_mode_tek(); term_pasthru(); #endif /* VMS */ fputs("\033\014", gpoutfile); /* 1 1. clear screen */ /* kermit tektronix emulation doesn't need to wait */ } TERM_PUBLIC void KTEK40Ctext() { TEK40text(); KTEK40Clinetype(0); /* change to green */ #ifdef VMS term_nopasthru(); #endif /* VMS */ } /* special color linetypes for MS-DOS Kermit v2.31 tektronix emulator */ /* 0 = normal, 1 = bright foreground color (30-37) = 30 + colors where colors are 1=red, 2=green, 4=blue */ static const char *kermit_color[15] = {"\033[0;37m", "\033[1;30m", "\033[0;32m", "\033[0;36m", "\033[0;31m", "\033[0;35m", "\033[1;34m", "\033[1;33m", "\033[1;31m", "\033[1;37m", "\033[1;35m", "\033[1;32m", "\033[1;36m", "\033[0;34m", "\033[0;33m"}; TERM_PUBLIC void KTEK40Clinetype(int linetype) { if (linetype < -2) linetype = LT_BLACK; if (linetype >= 13) linetype %= 13; fprintf(gpoutfile, "%s", kermit_color[linetype + 2]); } /* linetypes for MS-DOS Kermit v2.30 tektronix emulator */ /* `=solid, a=fine dots, b=short dashes, c=dash dot, d=long dash dot, e=dash dot dot */ static const char *kerm_linetype = "`a`abcde"; TERM_PUBLIC void KTEK40Mlinetype(int linetype) { if (linetype < -2) linetype = LT_BLACK; if (linetype >= 6) linetype %= 6; fprintf(gpoutfile, "\033%c", kerm_linetype[linetype + 2]); } TERM_PUBLIC void KTEK40reset() { fputs("\030\n", gpoutfile); /* turn off Tek emulation */ #ifdef VMS term_mode_native(); #endif /* VMS */ } #endif /* KERMIT */ /* thanks to sask!macphed (Geoff Coleman and Ian Macphedran) for the Selanar driver */ #ifdef SELANAR TERM_PUBLIC void SEL_init() { fputs("\033\062", gpoutfile); /* 1 1. set to ansi mode */ } TERM_PUBLIC void SEL_graphics() { fputs("\033[H\033[J\033\061\033\014", gpoutfile); /* 1 2 3 1. clear ANSI screen 2. set to TEK mode 3. clear screen */ #ifdef VMS term_pasthru(); #endif /* VMS */ } TERM_PUBLIC void SEL_text() { #ifdef VMS (void) fflush(gpoutfile); /* finish the graphics */ #endif TEK40move(0, 12); fputs("\033\062", gpoutfile); /* 1 1. into ANSI mode */ #ifdef VMS term_nopasthru(); #endif /* VMS */ } TERM_PUBLIC void SEL_reset() { fputs("\033\061\033\012\033\062\033[H\033[J", gpoutfile); /* 1 2 3 4 1 set tek mode 2 clear screen 3 set ansi mode 4 clear screen */ } #endif /* SELANAR */ #ifdef VTTEK TERM_PUBLIC void VTTEK40init() { fputs("\033[?38h", gpoutfile); fflush(gpoutfile); sleep(1); /* sleep 1 second to allow screen time to clear on some terminals */ #ifdef VMS term_mode_tek(); #endif /* VMS */ } TERM_PUBLIC void VTTEK40reset() { fputs("\033[?38l", gpoutfile); fflush(gpoutfile); sleep(1); /* sleep 1 second to allow screen time to clear on some terminals */ #ifdef VMS term_mode_native(); #endif /* VMS */ } /* linetypes for VT-type terminals in tektronix emulator mode */ /* `=solid, a=fine dots, b=short dashes, c=dash dot, d=long dash dot, h=bold solid, i=bold fine dots, j=bold short dashes, k=bold dash dot, l=bold long dash dot */ static const char *vt_linetype = "`a`abcdhijkl"; static int last_vt_linetype = 0; TERM_PUBLIC void VTTEK40linetype(int linetype) { if (linetype < -2) linetype = LT_BLACK; if (linetype >= 10) linetype %= 10; fprintf(gpoutfile, "\033%c", vt_linetype[linetype + 2]); last_vt_linetype = linetype; } TERM_PUBLIC void VTTEK40put_text(unsigned int x, unsigned int y, const char str[]) { int linetype; linetype = last_vt_linetype; VTTEK40linetype(0); TEK40put_text(x, y, str); VTTEK40linetype(linetype); } #endif /* VTTEK */ #ifdef LN03P TERM_PUBLIC void LN03Pinit() { fputs("\033[?38h", gpoutfile); } TERM_PUBLIC void LN03Preset() { fputs("\033[?38l", gpoutfile); } #endif /* LN03P */ /* tek40xx (monochrome) with linetype support by Jay I. Choe */ #ifdef CTEK /*#define ABS(A) (((A)>=0)? (A):-(A))*/ #define SIGN(A) (((A) >= 0)? 1:-1) static void CT_solid_vector __PROTO((int x, int y)); static void CT_draw_vpoint __PROTO((int x, int y, int last)); static void CT_pattern_vector __PROTO((int x1, int y1)); /* CT_lines are line types defined as bit pattern */ static unsigned long CT_lines[] = {~(unsigned long)0, /* solid line */ 0x000fffff, /* long dash */ 0x00ff00ff, /* short dash */ 0x00f00fff, /* dash-dot */ 0x00f07fff, /* long dash - dot */ 0x07070707, 0x07ff07ff, 0x070707ff}; /* current line pattern */ static unsigned long *CT_pattern = &CT_lines[0]; /* we need to keep track of tek cursor location */ static int CT_last_linetype = 0, CT_last_x, CT_last_y; TERM_PUBLIC void CTEK_linetype(int linetype) { if (linetype < 0) linetype = 0; linetype %= (sizeof(CT_lines) / sizeof(unsigned long)); CT_pattern = &CT_lines[linetype]; CT_last_linetype = linetype; } TERM_PUBLIC void CTEK_move(unsigned int x, unsigned int y) { TEK40move(x, y); CT_last_x = x; CT_last_y = y; } static void CT_solid_vector(int x, int y) { TEK40vector(x, y); CT_last_x = x; CT_last_y = y; } /* simulate pixel draw using tek vector draw. delays actual line drawing until maximum line segment is determined (or first/last point is defined) */ static int CT_penon = 0; /* is Pen on? */ static void CT_draw_vpoint(int x, int y, int last) { static int xx0, yy0, xx1, yy1; if ((*CT_pattern) & 1) { if (CT_penon) { /* This point is a continuation of current line */ xx1 = x; yy1 = y; } else { /* beginning of new line */ xx0 = xx1 = x; yy0 = yy1 = y; CT_penon = 1; } *CT_pattern = ((*CT_pattern) >> 1) | ((unsigned long)1 << 31); /* rotate the pattern */ if (last) { /* draw the line anyway if this is the last point */ TEK40move(xx0, yy0); TEK40vector(xx1, yy1); CT_penon = 0; } } else { /* do not draw this pixel */ if (CT_penon) { /* last line segment ended at the previous pixel. */ /* draw the line */ TEK40move(xx0, yy0); TEK40vector(xx1, yy1); CT_penon = 0; } *CT_pattern = (*CT_pattern) >> 1; /* rotate the current pattern */ } } /* draw vector line with pattern */ static void CT_pattern_vector(int x1, int y1) { int op; /* order parameter */ int x0 = CT_last_x; int y0 = CT_last_y; int dx = x1 - x0; int dy = y1 - y0; int ax = ABS(dx) << 1; int ay = ABS(dy) << 1; int sx = SIGN(dx); int sy = SIGN(dy); if (ax >= ay) { for (op = ay - (ax >> 1); x0 != x1; x0 += sx, op += ay) { CT_draw_vpoint(x0, y0, 0); if (op > 0 || (op == 0 && sx == 1)) { op -= ax; y0 += sy; } } } else { /* ax < ay */ for (op = ax - (ay >> 1); y0 != y1; y0 += sy, op += ax) { CT_draw_vpoint(x0, y0, 0); if (op > 0 || (op == 0 && sy == 1)) { op -= ay; x0 += sx; } } } CT_draw_vpoint(x0, y0, 1); /* last point */ CT_last_x = x1; CT_last_y = y1; } TERM_PUBLIC void CTEK_vector(unsigned int x, unsigned int y) { if (CT_last_linetype <= 0) CT_solid_vector(x, y); else CT_pattern_vector(x, y); } #endif /* CTEK */ #ifdef XTERM #define XT_TEK_ESC "\033" #define XT_TEK_GFX XT_TEK_ESC "[?38h" #define XT_TEK_ANSI XT_TEK_ESC "\003" #define XT_TEK_CLR XT_TEK_ESC "\014" #define XT_TEK_ALPHA "\037" static const char *xt_tek_fontsize = "89:;"; TERM_PUBLIC void XTERM_graphics() { XTERM_resume(); fputs(XT_TEK_CLR, gpoutfile); } TERM_PUBLIC void XTERM_resume() { fputs(XT_TEK_GFX, gpoutfile); } TERM_PUBLIC void XTERM_text() { fputs(XT_TEK_ALPHA XT_TEK_ANSI, gpoutfile); } TERM_PUBLIC int XTERM_set_font(const char *fontname) { char size = 0; if (fontname) { size_t lp = strlen(fontname); if (lp>0) size = fontname[lp-1]-'1'; } fprintf(gpoutfile, XT_TEK_ESC "%c", xt_tek_fontsize[size>0&&size<4?size:0]); return(TRUE); } #endif /* XTERM */ #endif /* TERM_BODY */ #ifdef TERM_TABLE TERM_TABLE_START(tek40_driver) #ifndef CTEK "tek40xx", "Tektronix 4010 and others; most TEK emulators", TEK40XMAX, TEK40YMAX, TEK40VCHAR, TEK40HCHAR, TEK40VTIC, TEK40HTIC, options_null, TEK40init, TEK40reset, TEK40text, null_scale, TEK40graphics, TEK40move, TEK40vector, TEK40linetype, TEK40put_text, null_text_angle, null_justify_text, line_and_point, do_arrow, set_font_null #else "tek40xx", "Tektronix 4010 and others; most TEK emulators", TEK40XMAX, TEK40YMAX, TEK40VCHAR, TEK40HCHAR, TEK40VTIC, TEK40HTIC, options_null, TEK40init, TEK40reset, TEK40text, null_scale, TEK40graphics, CTEK_move, CTEK_vector, CTEK_linetype, TEK40put_text, null_text_angle, null_justify_text, line_and_point, do_arrow, set_font_null #endif /* CTEK */ TERM_TABLE_END(tek40_driver) #undef LAST_TERM #define LAST_TERM tek40_driver #ifdef VTTEK TERM_TABLE_START(vttek_driver) "vttek", "VT-like tek40xx terminal emulator", TEK40XMAX, TEK40YMAX, TEK40VCHAR, TEK40HCHAR, TEK40VTIC, TEK40HTIC, options_null, VTTEK40init, VTTEK40reset, TEK40text, null_scale, TEK40graphics, TEK40move, TEK40vector, VTTEK40linetype, VTTEK40put_text, null_text_angle, null_justify_text, line_and_point, do_arrow, set_font_null TERM_TABLE_END(vttek_driver) #undef LAST_TERM #define LAST_TERM vttek_driver #endif /* VTTEK */ #ifdef KERMIT TERM_TABLE_START(kc_tek40_driver) "kc_tek40xx", "MS-DOS Kermit Tek4010 terminal emulator - color", TEK40XMAX, TEK40YMAX, TEK40VCHAR, KTEK40HCHAR, TEK40VTIC, TEK40HTIC, options_null, TEK40init, KTEK40reset, KTEK40Ctext, null_scale, KTEK40graphics, TEK40move, TEK40vector, KTEK40Clinetype, TEK40put_text, null_text_angle, null_justify_text, do_point, do_arrow, set_font_null TERM_TABLE_END(kc_tek40_driver) #undef LAST_TERM #define LAST_TERM kc_tek40_driver TERM_TABLE_START(km_tek40_driver) "km_tek40xx", "MS-DOS Kermit Tek4010 terminal emulator - monochrome", TEK40XMAX, TEK40YMAX, TEK40VCHAR, KTEK40HCHAR, TEK40VTIC, TEK40HTIC, options_null, TEK40init, KTEK40reset, TEK40text, null_scale, KTEK40graphics, TEK40move, TEK40vector, KTEK40Mlinetype, TEK40put_text, null_text_angle, null_justify_text, line_and_point, do_arrow, set_font_null TERM_TABLE_END(km_tek40_driver) #undef LAST_TERM #define LAST_TERM km_tek40_driver #endif /* KERMIT */ #ifdef SELANAR TERM_TABLE_START(selanar_driver) "selanar", "Selanar", TEK40XMAX, TEK40YMAX, TEK40VCHAR, TEK40HCHAR, TEK40VTIC, TEK40HTIC, options_null, SEL_init, SEL_reset, SEL_text, null_scale, SEL_graphics, TEK40move, TEK40vector, TEK40linetype, TEK40put_text, null_text_angle, null_justify_text, line_and_point, do_arrow, set_font_null TERM_TABLE_END(selanar_driver) #undef LAST_TERM #define LAST_TERM selanar_driver #endif /* SELANAR */ #ifdef BITGRAPH TERM_TABLE_START(bitgraph_driver) "bitgraph", "BBN Bitgraph Terminal", BG_XMAX, BG_YMAX, BG_VCHAR, BG_HCHAR, BG_VTIC, BG_HTIC, options_null, BG_init, BG_reset, BG_text, null_scale, BG_graphics, BG_move, BG_vector, BG_linetype, BG_put_text, null_text_angle, null_justify_text, line_and_point, do_arrow, set_font_null TERM_TABLE_END(bitgraph_driver) #undef LAST_TERM #define LAST_TERM bitgraph_driver #endif /* BITGRAPH */ #ifdef XTERM TERM_TABLE_START(xterm_driver) "xterm", "Xterm Tektronix 4014 Mode", TEK40XMAX, TEK40YMAX, TEK40VCHAR, TEK40HCHAR, TEK40VTIC, TEK40HTIC, options_null, TEK40init, TEK40reset, XTERM_text, null_scale, XTERM_graphics, TEK40move, TEK40vector, VTTEK40linetype, VTTEK40put_text, null_text_angle, null_justify_text, line_and_point, do_arrow, XTERM_set_font, 0, TERM_CAN_MULTIPLOT|TERM_NO_OUTPUTFILE, XTERM_text, XTERM_resume TERM_TABLE_END(xterm_driver) #undef LAST_TERM #define LAST_TERM xterm_driver #endif /* XTERM */ #endif /* TERM_TABLE */ #endif /* TERM_PROTO_ONLY */ #ifdef TERM_HELP START_HELP(tek40) "1 tek40", "?commands set terminal tek40xx", "?set terminal tek40xx", "?set term tek40xx", "?terminal tek40xx", "?term tek40xx", "?tek40", "?commands set terminal vttek", "?set terminal vttek", "?set term vttek", "?terminal vttek", "?term vttek", "?vttek", "?commands set terminal kc-tek40xx", "?set terminal kc-tek40xx", "?set term kc-tek40xx", "?terminal kc-tek40xx", "?term kc-tek40xx", "?kc-tek40xx", "?commands set terminal km-tek40xx", "?set terminal km-tek40xx", "?set term km-tek40xx", "?terminal km-tek40xx", "?term km-tek40xx", "?km-tek40xx", "?commands set terminal selanar", "?set terminal selanar", "?set term selanar", "?terminal selanar", "?term selanar", "?selanar", "?commands set terminal bitgraph", "?set terminal bitgraph", "?set term bitgraph", "?terminal bitgraph", "?term bitgraph", "?bitgraph", "?commands set terminal xterm", "?set terminal xterm", "?set term xterm", "?terminal xterm", "?term xterm", "?xterm", " This family of terminal drivers supports a variety of VT-like terminals.", " `tek40xx` supports Tektronix 4010 and others as well as most TEK emulators;", " `vttek` supports VT-like tek40xx terminal emulators; `kc-tek40xx` supports", " MS-DOS Kermit Tek4010 terminal emulators in color: `km-tek40xx` supports them", " in monochrome; `selanar` supports Selanar graphics; and `bitgraph` supports", " BBN Bitgraph terminals. None have any options." END_HELP(tek40) #endif /* TERM_HELP */