Annotation of OpenXM_contrib/gnuplot/term/pc.trm, Revision 1.1
1.1 ! maekawa 1: /*
! 2: * $Id: pc.trm,v 1.20 1998/06/18 14:59:22 ddenholm Exp $
! 3: *
! 4: */
! 5:
! 6: /* GNUPLOT - pc.trm */
! 7:
! 8: /*[
! 9: * Copyright 1990 - 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.
! 40: *
! 41: * This terminal driver supports:
! 42: * Under Microsoft C
! 43: * cga, egabios, egalib, vgabios, hercules, corona325, att
! 44: * Under Turboc C
! 45: * cga, ega/vga, vgamono, svga, mcga, hercules, att
! 46: * Under Watcom C
! 47: * cga, ega/vga, vgamono, svga, mcga, hercules, ???
! 48: *
! 49: * AUTHORS
! 50: * Colin Kelley, Thomas Williams, William Wilson, Russell Lang
! 51: * modified by David J. Liu (liu@csb.yale.edu) for version 3.6
! 52: *
! 53: * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
! 54: *
! 55: * Because only one compiler is used to generate gnuplot.exe
! 56: * and the type of the single graphics board is auto-detected,
! 57: * we can combine all these parts into one terminal type: PC
! 58: * and let the computer take care of the rest. -- DJL
! 59: *
! 60: * Since I don't have MicroSoft C, I assume it would define MSC.
! 61: * Please correct it if you are using MS C. Thank you. -- DJL
! 62: *
! 63: */
! 64:
! 65: /*
! 66: * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
! 67: */
! 68:
! 69: #include "driver.h"
! 70:
! 71: #ifdef TERM_REGISTER
! 72: register_term(dospc)
! 73: #endif
! 74:
! 75: #ifdef TERM_PROTO
! 76: TERM_PUBLIC void PC_text __PROTO((void));
! 77: TERM_PUBLIC void PC_reset __PROTO((void));
! 78: TERM_PUBLIC void PC_init __PROTO((void));
! 79: TERM_PUBLIC void PC_graphics __PROTO((void));
! 80: TERM_PUBLIC void PC_linetype __PROTO((int linetype));
! 81: TERM_PUBLIC void PC_move __PROTO((int x, int y));
! 82: TERM_PUBLIC void PC_vector __PROTO((int x, int y));
! 83: TERM_PUBLIC void PC_put_text __PROTO((int x, int y, char *str));
! 84: TERM_PUBLIC int PC_text_angle __PROTO((int ang));
! 85: TERM_PUBLIC int PC_justify_text __PROTO((enum JUSTIFY ang));
! 86:
! 87: #define PC_HCHAR FNT5X9_HCHAR
! 88: #define PC_VCHAR FNT5X9_VCHAR
! 89: #define PC_HTIC 5
! 90: #define PC_VTIC 4
! 91: #define PC_XMAX 100 /* These two entries are just place holders. */
! 92: #define PC_YMAX 100 /* The actual values will be found in init. */
! 93: #endif /* TERM_PROTO */
! 94:
! 95: #ifndef TERM_PROTO_ONLY
! 96: #ifdef TERM_BODY
! 97:
! 98: #ifdef __TURBOC__
! 99: static int huge detect_svga __PROTO((void));
! 100: #endif /* __TURBOC__ */
! 101:
! 102: #include <string.h>
! 103: #include <stdlib.h>
! 104: #ifdef __TURBOC__
! 105: #include <graphics.h>
! 106: #include <conio.h>
! 107: #include <dos.h>
! 108: #endif /* __TURBOC__ */
! 109: #ifdef __WATCOMC__
! 110: #include <graph.h>
! 111: #endif /* WATCOMC */
! 112: #ifdef MSC
! 113: #include "mcega.h"
! 114: #endif /* MSC */
! 115:
! 116: static int pattern[] ={ 0xffff, 0x0f0f, 0xffff, 0xaaaa, 0x3333, 0x3f3f, 0x0f0f };
! 117: static int vga_color[] ={ 7, 8, 2, 3, 4, 5, 9, 14, 12, 15, 13, 10, 11, 1, 6 };
! 118:
! 119: static int pc_driver, pc_mode;
! 120: static int graphics_on = FALSE, pc_graphics = FALSE;
! 121: static int startx, starty, pc_lastx, pc_lasty, pc_colors;
! 122: static int pc_angle, pc_hjustify, pc_vjustify, pc_text_size, pc_text_dir, pc_corscreen = -1;
! 123:
! 124:
! 125: #ifdef __TURBOC__
! 126: extern int far _Cdecl SVGA_driver_far[];
! 127: #endif /* __TURBOC__ */
! 128:
! 129: #ifdef __WATCOMC__
! 130: enum {
! 131: HORIZ_DIR, VERT_DIR
! 132: };
! 133: static void _settextang(ang)
! 134: int ang;
! 135: {
! 136: if (ang == HORIZ_DIR) {
! 137: _settextorient(1, 0);
! 138: } else {
! 139: _settextorient(0, 1);
! 140: }
! 141: }
! 142: #endif /* WATCOMC */
! 143:
! 144: static int huge detect_svga(void)
! 145: {
! 146: return 0; /* the default mode, just a place holder */
! 147: }
! 148:
! 149: void PC_setup()
! 150: { /* called from the beginning of main() */
! 151: int i, t, x, y;
! 152: char pc_modename[9];
! 153: #ifdef __WATCOMC__
! 154: struct videoconfig VC;
! 155: #endif /* WATCOMC */
! 156:
! 157: /* First link all BRI dribers, then detect the display card. */
! 158: /* If environment PCTRM is set, try initiate the card/mode. */
! 159:
! 160: /* special instruction on mode */
! 161: safe_strncpy(pc_modename, getenv("PCTRM"), 8);
! 162:
! 163: #ifdef __TURBOC__
! 164: /* Some of this code including BGI drivers are copyright Borland Intl. */
! 165: registerfarbgidriver(EGAVGA_driver_far);
! 166: registerfarbgidriver(CGA_driver_far);
! 167: registerfarbgidriver(Herc_driver_far);
! 168: registerfarbgidriver(ATT_driver_far);
! 169: registerfarbgidriver(PC3270_driver_far);
! 170: pc_driver = DETECT;
! 171: detectgraph(&pc_driver, &pc_mode);
! 172: if (graphresult()) {
! 173: fputs("Unable to initialize graphics.\n", stderr);
! 174: return;
! 175: }
! 176: #ifdef BGI_NAME
! 177: /* the highest standard pc_driver value, see graphics.h */
! 178: #define LAST_BGI 10
! 179: /* the last mode of the SVGA.BGI */
! 180: #define LAST_SVGA_MODE 6
! 181: /* test SVGA if we have VGA */
! 182: if ((pc_driver == VGA) && (pc_modename[0] == 'S')) {
! 183: installuserdriver(BGI_NAME, &detect_svga);
! 184: registerfarbgidriver(SVGA_driver_far);
! 185: pc_driver = DETECT;
! 186: initgraph(&pc_driver, &pc_mode, "");
! 187: /* The following code, which is independent of the actual SVGA.BGI
! 188: * used, tries to find a mode of width defined in the environment
! 189: * variable PCTRM */
! 190: if (pc_driver > LAST_BGI) { /* success */
! 191: sscanf(pc_modename, "S%d", &t);
! 192: switch (t) {
! 193: case 800:
! 194: break; /* S800 */
! 195: case 1024:
! 196: break; /* S1024 */
! 197: case 1280:
! 198: break; /* S1280 */
! 199: default:
! 200: t = 640; /* 640x480 */
! 201: }
! 202: for (i = 0; i <= LAST_SVGA_MODE; i++) {
! 203: setgraphmode(i);
! 204: if ((getmaxx() + 1 == t) && (getmaxcolor() > 14))
! 205: pc_mode = i;
! 206: }
! 207: setgraphmode(pc_mode);
! 208: if (graphresult()) { /* error, go back to VGA */
! 209: pc_driver = VGA;
! 210: pc_mode = 4;
! 211: }
! 212: }
! 213: } /* SVGA tested */
! 214: if (pc_driver <= LAST_BGI)
! 215: #endif /* BGI_NAME */
! 216: initgraph(&pc_driver, &pc_mode, "");
! 217: pc_colors = getmaxcolor() + 1;
! 218: pc_lastx = getmaxx();
! 219: pc_lasty = getmaxy();
! 220: restorecrtmode();
! 221: clrscr();
! 222: #endif /* __TURBOC__ */
! 223: #ifdef __WATCOMC__
! 224: _getvideoconfig(&VC);
! 225: if ((pc_driver = VC.adapter) == 0) {
! 226: fprintf(stderr, "Unable to initialize graphics.\n");
! 227: return;
! 228: }
! 229: switch (pc_driver = VC.adapter) {
! 230: case _HERCULES:
! 231: pc_mode = _HERCMONO;
! 232: break;
! 233: case _CGA:
! 234: pc_mode = _HRESBW;
! 235: break;
! 236: case _MCGA:
! 237: pc_mode = _MRES256COLOR;
! 238: break;
! 239: case _EGA:
! 240: pc_mode = (VC.monitor == _MONO ? _ERESCOLOR : _ERESNOCOLOR);
! 241: break;
! 242: case _VGA:
! 243: pc_mode = _VRES16COLOR;
! 244: break;
! 245: case _SVGA:
! 246: if (pc_modename[0] == 'S') { /* test SVGA resolution */
! 247: sscanf(pc_modename, "S%d", &t);
! 248: switch (t) {
! 249: case 800:
! 250: pc_mode = _SVRES256COLOR;
! 251: break; /* S800 */
! 252: case 1024:
! 253: pc_mode = _XRES256COLOR;
! 254: break; /* S1024 */
! 255: case 1280:
! 256: pc_mode = _XRES256COLOR + 2;
! 257: break; /* S1280 */
! 258: /* Someone help me, who knows, how a newer Watcom calls that */
! 259: default:
! 260: t = 640;
! 261: pc_mode = _VRES256COLOR; /* 640x480 */
! 262: }
! 263: while (_setvideomode(pc_mode) == 0)
! 264: pc_mode--;
! 265: }
! 266: break;
! 267: default:
! 268: fputs("Unable to initialize graphics.\n", stderr);
! 269: return;
! 270: }
! 271: _setvideomode(pc_mode);
! 272: _getvideoconfig(&VC);
! 273: pc_lastx = VC.numxpixels - 1;
! 274: pc_lasty = VC.numypixels - 1;
! 275: pc_colors = VC.numcolors;
! 276: _setvideomode(_DEFAULTMODE);
! 277: #endif /* WATCOMC */
! 278: x = pc_lastx + 1;
! 279: y = pc_lasty + 1;
! 280: fprintf(stderr, "\tScreen of %d x %d pixels and %d colors.\n",
! 281: x, y, pc_colors);
! 282: pc_graphics = TRUE;
! 283: }
! 284:
! 285: TERM_PUBLIC void PC_init()
! 286: {
! 287: char *pathp;
! 288: #ifdef __WATCOMC__
! 289: struct _fontinfo fi;
! 290: #endif
! 291:
! 292: if (!pc_graphics) {
! 293: fputs("Unable to initialize graphics.\n", stderr);
! 294: term = 0;
! 295: return;
! 296: }
! 297: /* Double the tic/font sizes. */
! 298: pc_text_size = (pc_lasty > 590) ? 2 : 1;
! 299: term->h_char = PC_HCHAR;
! 300: term->v_char = PC_VCHAR;
! 301: term->h_tic = PC_HTIC * pc_text_size;
! 302: term->v_tic = PC_VTIC * pc_text_size;
! 303: term->xmax = pc_lastx + 1;
! 304: term->ymax = pc_lasty + 1;
! 305: #ifdef __TURBOC__
! 306: setgraphmode(pc_mode);
! 307: settextstyle(DEFAULT_FONT, HORIZ_DIR, pc_text_size);
! 308: settextjustify(pc_hjustify, pc_vjustify);
! 309: term->h_char = textheight("X"); /* overriding the default */
! 310: term->v_char = textwidth("X"); /* overriding the default */
! 311: #endif /* __TURBOC__ */
! 312: #ifdef __WATCOMC__
! 313: _setvideomode(pc_mode);
! 314: _settextang(HORIZ_DIR);
! 315: _settextalign(pc_hjustify, pc_vjustify);
! 316: _setcharsize(pc_text_size * PC_HCHAR, pc_text_size * PC_VCHAR);
! 317: _getfontinfo(&fi);
! 318: term->h_char = fi.avgwidth;
! 319: term->v_char = fi.pixheight * 1.5;
! 320: #endif /* WATCOMC */
! 321: #ifdef MSC
! 322: #endif /* MSC */
! 323: }
! 324:
! 325: TERM_PUBLIC void PC_graphics()
! 326: {
! 327: graphics_on = TRUE;
! 328: #ifdef __TURBOC__
! 329: setgraphmode(pc_mode);
! 330: #endif /* __TURBOC__ */
! 331: #ifdef __WATCOMC__
! 332: _setvideomode(pc_mode);
! 333: #endif /* WATCOMC */
! 334: #ifdef MSC
! 335: if (pc_corscreen == -1)
! 336: Vmode(18); /* VGA */
! 337: else {
! 338: grinit(corscreen);
! 339: grandtx();
! 340: } /* corolla */
! 341: #endif /* MSC */
! 342: }
! 343:
! 344: TERM_PUBLIC void PC_linetype(linetype)
! 345: {
! 346: if (pc_colors > 14) { /* 16 or more colors */
! 347: if (linetype >= 13)
! 348: linetype %= 13;
! 349: #ifdef __TURBOC__
! 350: setcolor(vga_color[linetype + 2]);
! 351: #endif /* __TURBOC__ */
! 352: #ifdef __WATCOMC__
! 353: _setcolor(vga_color[linetype + 2]);
! 354: #endif /* WATCOMC */
! 355: #ifdef MSC
! 356: #endif /* MSC */
! 357: } else { /* MONO */
! 358: if (linetype >= 5)
! 359: linetype %= 5;
! 360: #ifdef __TURBOC__
! 361: setlinestyle(4, pattern[linetype + 2], 1);
! 362: #endif /* __TURBOC__ */
! 363: #ifdef __WATCOMC__
! 364: _setlinestyle(pattern[linetype + 2]);
! 365: #endif /* WATCOMC */
! 366: #ifdef MSC
! 367: if (pc_corscreen != -1)
! 368: Cor_mask(pattern[linetype + 2]);
! 369: #endif /* MSC */
! 370: }
! 371: }
! 372:
! 373: TERM_PUBLIC void PC_move(x, y)
! 374: int x, y;
! 375: {
! 376: #ifdef __TURBOC__
! 377: moveto(x, pc_lasty - y);
! 378: #endif /* __TURBOC__ */
! 379: #ifdef __WATCOMC__
! 380: _moveto(x, pc_lasty - y);
! 381: #endif /* WATCOMC */
! 382: #ifdef MSC
! 383: #endif /* MSC */
! 384: startx = x;
! 385: starty = y;
! 386: }
! 387:
! 388: TERM_PUBLIC void PC_vector(x, y)
! 389: int x, y;
! 390: {
! 391: #ifdef __TURBOC__
! 392: lineto(x, pc_lasty - y);
! 393: #endif /* __TURBOC__ */
! 394: #ifdef __WATCOMC__
! 395: _lineto(x, pc_lasty - y);
! 396: #endif /* WATCOMC */
! 397: #ifdef MSC
! 398: if (pc_corscreen != -1)
! 399: Cor_line(startx, COR_YLAST - starty, x, COR_YLAST - y);
! 400: #endif /* MSC */
! 401: startx = x;
! 402: starty = y;
! 403: }
! 404:
! 405: TERM_PUBLIC void PC_reset()
! 406: {
! 407: graphics_on = FALSE;
! 408: #ifdef __TURBOC__
! 409: restorecrtmode();
! 410: clrscr();
! 411: #endif /* __TURBOC__ */
! 412: #ifdef __WATCOMC__
! 413: _setvideomode(_DEFAULTMODE);
! 414: #endif /* WATCOMC */
! 415: #ifdef MSC
! 416: Vmode(3);
! 417: #endif /* MSC */
! 418: }
! 419:
! 420: TERM_PUBLIC void PC_text()
! 421: {
! 422: if (graphics_on) {
! 423: graphics_on = FALSE;
! 424: (void) getch();
! 425: #ifdef __TURBOC__
! 426: restorecrtmode();
! 427: clrscr();
! 428: #endif /* __TURBOC__ */
! 429: #ifdef __WATCOMC__
! 430: _setvideomode(_DEFAULTMODE);
! 431: #endif /* WATCOMC */
! 432: #ifdef MSC
! 433: if (pc_corscreen != -1) {
! 434: grreset();
! 435: txonly();
! 436: }
! 437: Vmode(3);
! 438: #endif /* MSC */
! 439: }
! 440: }
! 441:
! 442: TERM_PUBLIC int PC_text_angle(ang)
! 443: int ang;
! 444: {
! 445: switch (ang) {
! 446: case 0:
! 447: pc_text_dir = HORIZ_DIR;
! 448: break;
! 449: case 1:
! 450: pc_text_dir = VERT_DIR;
! 451: break;
! 452: }
! 453: return TRUE;
! 454: }
! 455:
! 456: TERM_PUBLIC int PC_justify_text(just)
! 457: enum JUSTIFY just;
! 458: {
! 459: #if defined(__TURBOC__)
! 460: switch (just) {
! 461: case LEFT:
! 462: pc_hjustify = LEFT_TEXT;
! 463: pc_vjustify = CENTER_TEXT;
! 464: break;
! 465: case CENTRE:
! 466: pc_hjustify = CENTER_TEXT;
! 467: pc_vjustify = CENTER_TEXT;
! 468: break;
! 469: case RIGHT:
! 470: pc_hjustify = RIGHT_TEXT;
! 471: pc_vjustify = CENTER_TEXT;
! 472: break;
! 473: }
! 474: settextjustify(pc_hjustify, pc_vjustify);
! 475: return 1;
! 476: #elif defined(__WATCOMC__)
! 477: switch (just) {
! 478: case LEFT:
! 479: pc_hjustify = _LEFT;
! 480: pc_vjustify = _HALF;
! 481: break;
! 482: case CENTRE:
! 483: pc_hjustify = _CENTER;
! 484: pc_vjustify = _HALF;
! 485: break;
! 486: case RIGHT:
! 487: pc_hjustify = _RIGHT;
! 488: pc_vjustify = _HALF;
! 489: break;
! 490: }
! 491: _settextalign(pc_hjustify, pc_vjustify);
! 492: return 1;
! 493: #else
! 494: return (just == LEFT);
! 495: #endif
! 496: }
! 497:
! 498: TERM_PUBLIC void PC_put_text(x, y, str)
! 499: int x, y;
! 500: char *str;
! 501: {
! 502: #ifdef __TURBOC__
! 503: settextstyle(DEFAULT_FONT, pc_text_dir, pc_text_size);
! 504: settextjustify(pc_hjustify, pc_vjustify);
! 505: outtextxy(x, pc_lasty - y, str);
! 506: #endif /* __TURBOC__ */
! 507: #ifdef __WATCOMC__
! 508: _setcharsize(pc_text_size * PC_VCHAR, pc_text_size * PC_HCHAR);
! 509: _settextang(pc_text_dir);
! 510: _settextalign(pc_hjustify, pc_vjustify);
! 511: _grtext(x, pc_lasty - y, str);
! 512: #endif /* WATCOMC */
! 513: #ifdef MSC
! 514: #endif /* MSC */
! 515: }
! 516:
! 517: #endif /* TERM_BODY */
! 518:
! 519: #ifdef TERM_TABLE
! 520:
! 521: TERM_TABLE_START(dospc_driver)
! 522: "dospc", "IBM PC/Clone running DOS",
! 523: PC_XMAX, PC_YMAX, PC_VCHAR, PC_HCHAR,
! 524: PC_VTIC, PC_HTIC, options_null, PC_init, PC_reset,
! 525: PC_text, null_scale, PC_graphics, PC_move, PC_vector,
! 526: PC_linetype, PC_put_text, PC_text_angle,
! 527: PC_justify_text, line_and_point, do_arrow, set_font_null
! 528: TERM_TABLE_END(pc_driver)
! 529:
! 530: #undef LAST_TERM
! 531: #define LAST_TERM dospc_driver
! 532:
! 533: #endif /* TERM_TABLE */
! 534: #endif /* TERM_PROTO_ONLY */
! 535:
! 536: #ifdef TERM_HELP
! 537: START_HELP(dospc)
! 538: "1 dospc",
! 539: "?commands set terminal dospc",
! 540: "?set terminal dospc",
! 541: "?set term dospc",
! 542: "?terminal dospc",
! 543: "?term dospc",
! 544: "?dospc",
! 545: " The `dospc` terminal driver supports PCs with arbitrary graphics boards, which",
! 546: " will be automatically detected. It should be used only if you are not using",
! 547: " the gcc or Zortec C/C++ compilers."
! 548: END_HELP(dospc)
! 549: #endif /* TERM_HELP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>