/* * $Id: t410x.trm,v 1.7 1998/11/26 19:02:59 lhecking Exp $ * */ /* GNUPLOT - t410x.trm */ /*[ * Copyright 1990 - 1993, 1998 * * 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: Tektronix 410x and 420x series terminals * * AUTHORS * Colin Kelley, Thomas Williams * * send your comments or suggestions to (info-gnuplot@dartmouth.edu). * */ /* Tektronix 410X and 420X driver written by Cary D. Renzema. * email address: caryr@mxim.com * * I've tested this driver on the following terminals: 4106, 4107A, 4109 * and 4207. It should work, without editing, on other terminals in the * 410x and 420x families. It will probably need to be changed to work * on a 4105 (screen size and character rotation are two guesses). This * file can also be used as a start for a 411x driver. * * Cary R. * April 5, 1990 */ /* * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995) */ #include "driver.h" #ifdef TERM_REGISTER register_term(tek410x) #endif #ifdef TERM_PROTO TERM_PUBLIC void T410X_init __PROTO((void)); TERM_PUBLIC void T410X_reset __PROTO((void)); TERM_PUBLIC void T410X_graphics __PROTO((void)); TERM_PUBLIC void T410X_text __PROTO((void)); TERM_PUBLIC void T410X_move __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void T410X_vector __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void T410X_point __PROTO((unsigned int x, unsigned int y, int number)); TERM_PUBLIC void T410X_linetype __PROTO((int linetype)); TERM_PUBLIC void T410X_put_text __PROTO((unsigned int x, unsigned int y, char str[])); TERM_PUBLIC int T410X_text_angle __PROTO((int ang)); #define T410XXMAX 4095 #define T410XYMAX 3131 #define T410XVCHAR 71 #define T410XHCHAR 51 #define T410XVTIC 36 #define T410XHTIC 36 #endif /* TERM_PROTO */ #ifndef TERM_PROTO_ONLY #ifdef TERM_BODY void T410X_encode_x_y __PROTO((unsigned int x, unsigned int y)); void T410X_encode_int __PROTO((int number)); static int T410X_angle = 0; TERM_PUBLIC void T410X_init() { fputs("\033%%!0\033MN0\033MCB7C;\033MQ1\033MT1", gpoutfile); fputs("\033MG1\033RK!\033SK!\033LZ\033%%!1", gpoutfile); /* 1. set tek mode 2. set character path to 0 (characters placed equal to rotation) 3. set character size to 59 height 4. set character precision to string 5. set character text index to 1 6. set character write mode to overstrike 7. clear the view 8. clear the segments 9. clear the dialog buffer 10. set ansi mode */ (void) fflush(gpoutfile); } TERM_PUBLIC void T410X_reset() { fputs("\033%%!0\033LZ\033%%!1", gpoutfile); /* 1. set tek mode 2. clear the dialog buffer 3. set ansi mode */ (void) fflush(gpoutfile); } TERM_PUBLIC void T410X_graphics() { fputs("\033%%!0\033\014\033LV0", gpoutfile); /* 1. set tek mode 2. clear the screen 3. set dialog area invisible */ (void) fflush(gpoutfile); } TERM_PUBLIC void T410X_text() { fputs("\033LV1\033%%!1", gpoutfile); /* 1. set dialog area visible 2. set ansi mode */ (void) fflush(gpoutfile); } TERM_PUBLIC void T410X_move(x, y) unsigned int x, y; { fputs("\033LF", gpoutfile); (void) T410X_encode_x_y(x, y); (void) fflush(gpoutfile); } TERM_PUBLIC void T410X_vector(x, y) unsigned int x, y; { fputs("\033LG", gpoutfile); (void) T410X_encode_x_y(x, y); (void) fflush(gpoutfile); } TERM_PUBLIC void T410X_point(x, y, number) unsigned int x, y; int number; { fputs("\033MM", gpoutfile); (void) T410X_encode_int(GPMAX(number, 0) % 11); fputs("\033LH", gpoutfile); (void) T410X_encode_x_y(x, y); (void) fflush(gpoutfile); } TERM_PUBLIC void T410X_linetype(linetype) int linetype; { switch (linetype) { case -1: fputs("\033ML5", gpoutfile); break; case -2: fputs("\033ML?", gpoutfile); break; default: fputs("\033ML", gpoutfile); (void) T410X_encode_int(linetype % 14 + 2); break; } fputs("\033MV", gpoutfile); (void) T410X_encode_int(GPMAX(linetype, 0) % 8); (void) fflush(gpoutfile); } TERM_PUBLIC void T410X_put_text(x, y, str) unsigned int x, y; char str[]; { if (T410X_angle == 0) { (void) T410X_move(x, y - T410XVCHAR / 2 + 6); fputs("\033MR00", gpoutfile); } else { (void) T410X_move(x + T410XHCHAR / 2 - 6, y); fputs("\033MRE:0", gpoutfile); } (void) fputs("\033LT", gpoutfile); (void) T410X_encode_int(strlen(str)); (void) fputs(str, gpoutfile); (void) fflush(gpoutfile); } TERM_PUBLIC int T410X_text_angle(ang) int ang; { T410X_angle = ang; return (TRUE); } /* These last two routines are based on fortran code found in the * 4106/4107/4109/CX PROGRAMMERS manual. */ void T410X_encode_x_y(x, y) unsigned int x, y; { static char chix = 0, chiy = 0, cloy = 0, ceb = 0; register unsigned int hix, lox, hiy, loy, eb, lx, ly; lx = (x <= T410XXMAX) ? x : T410XXMAX; ly = (y <= T410XYMAX) ? y : T410XYMAX; hix = lx / 128 + 32; lox = (lx / 4) % 32 + 64; hiy = ly / 128 + 32; loy = (ly / 4) % 32 + 96; eb = (ly % 4) * 4 + lx % 4 + 96; if (chiy != hiy) (void) putc(hiy, gpoutfile); if (ceb != eb) (void) putc(eb, gpoutfile); if ((cloy != loy) || (ceb != eb) || (chix != hix)) (void) putc(loy, gpoutfile); if (chix != hix) (void) putc(hix, gpoutfile); (void) putc(lox, gpoutfile); chix = hix; chiy = hiy; cloy = loy; ceb = eb; } void T410X_encode_int(number) int number; { register unsigned int mag, hi1, hi2, lo; mag = ABS(number); hi1 = mag / 1024 + 64; hi2 = (mag / 16) % 64 + 64; lo = mag % 16 + 32; if (number >= 0) lo += 16; if (hi1 != 64) (void) putc(hi1, gpoutfile); if ((hi2 != 64) || (hi1 != 64)) (void) putc(hi2, gpoutfile); (void) putc(lo, gpoutfile); } #endif /* TERM_BODY */ #ifdef TERM_TABLE TERM_TABLE_START(tek410x_driver) "tek410x", "Tektronix 4106, 4107, 4109 and 420X terminals", T410XXMAX, T410XYMAX, T410XVCHAR, T410XHCHAR, T410XVTIC, T410XHTIC, options_null, T410X_init, T410X_reset, T410X_text, null_scale, T410X_graphics, T410X_move, T410X_vector, T410X_linetype, T410X_put_text, T410X_text_angle, null_justify_text, T410X_point, do_arrow, set_font_null TERM_TABLE_END(tek410x_driver) #undef LAST_TERM #define LAST_TERM tek410x_driver #endif /* TERM_TABLE */ #endif /* TERM_PROTO_ONLY */ #ifdef TERM_HELP START_HELP(tek410x) "1 tek410x", "?commands set terminal tek410x", "?set terminal tek410x", "?set term tek410x", "?terminal tek410x", "?term tek410x", "?tek410x", " The `tek410x` terminal driver supports the 410x and 420x family of Tektronix", " terminals. It has no options." END_HELP(tek410x) #endif