/* Hello, Emacs, this is -*-C-*- * $Id: pc.trm,v 1.24 2017/05/18 21:19:16 sfeam Exp $ * */ /* GNUPLOT - pc.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: * Under Microsoft C * cga, egabios, egalib, vgabios, hercules, corona325, att * Under Turboc C * cga, ega/vga, vgamono, svga, mcga, hercules, att * Under Watcom C * cga, ega/vga, vgamono, svga, mcga, hercules, ??? * * AUTHORS * Colin Kelley, Thomas Williams, William Wilson, Russell Lang * modified by David J. Liu (liu@csb.yale.edu) for version 3.6 * * send your comments or suggestions to (gnuplot-info@lists.sourceforge.net). * * Because only one compiler is used to generate gnuplot.exe * and the type of the single graphics board is auto-detected, * we can combine all these parts into one terminal type: PC * and let the computer take care of the rest. -- DJL * * Since I don't have MicroSoft C, I assume it would define MSC. * Please correct it if you are using MS C. Thank you. -- DJL * */ /* * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995) */ #include "driver.h" #ifdef TERM_REGISTER register_term(dospc) #endif #ifdef TERM_PROTO TERM_PUBLIC void PC_text __PROTO((void)); TERM_PUBLIC void PC_reset __PROTO((void)); TERM_PUBLIC void PC_init __PROTO((void)); TERM_PUBLIC void PC_graphics __PROTO((void)); TERM_PUBLIC void PC_linetype __PROTO((int linetype)); TERM_PUBLIC void PC_move __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void PC_vector __PROTO((unsigned int x, unsigned int y)); TERM_PUBLIC void PC_put_text __PROTO((unsigned int x, unsigned int y, const char *str)); TERM_PUBLIC int PC_text_angle __PROTO((int ang)); TERM_PUBLIC int PC_justify_text __PROTO((enum JUSTIFY ang)); #define PC_HCHAR FNT5X9_HCHAR #define PC_VCHAR FNT5X9_VCHAR #define PC_HTIC 5 #define PC_VTIC 4 #define PC_XMAX 100 /* These two entries are just place holders. */ #define PC_YMAX 100 /* The actual values will be found in init. */ #endif /* TERM_PROTO */ #ifndef TERM_PROTO_ONLY #ifdef TERM_BODY #ifdef __TURBOC__ static int huge detect_svga __PROTO((void)); #endif /* __TURBOC__ */ #include #include #ifdef __TURBOC__ #include #include #include #endif /* __TURBOC__ */ #ifdef __WATCOMC__ # include /* for getch() */ # include #endif /* WATCOMC */ #ifdef MSC #include "mcega.h" #endif /* MSC */ static unsigned int pattern[] ={ 0xffff, 0x0f0f, 0xffff, 0xaaaa, 0x3333, 0x3f3f, 0x0f0f }; static int vga_color[] ={ 7, 8, 2, 3, 4, 5, 9, 14, 12, 15, 13, 10, 11, 1, 6 }; static int pc_driver, pc_mode; static int graphics_on = FALSE, pc_graphics = FALSE; static int startx, starty, pc_lastx, pc_lasty, pc_colors; static int pc_angle, pc_hjustify, pc_vjustify, pc_text_size, pc_text_dir, pc_corscreen = -1; #ifdef __TURBOC__ extern int far _Cdecl SVGA_driver_far[]; #endif /* __TURBOC__ */ #ifdef __WATCOMC__ enum { HORIZ_DIR, VERT_DIR }; static void _settextang(int ang) { if (ang == HORIZ_DIR) { _settextorient(1, 0); } else { _settextorient(0, 1); } } #endif /* WATCOMC */ static int huge detect_svga() { return 0; /* the default mode, just a place holder */ } void PC_setup() { /* called from the beginning of main() */ int i, t, x, y; char pc_modename[9]; #ifdef __WATCOMC__ struct videoconfig VC; #endif /* WATCOMC */ /* First link all BRI dribers, then detect the display card. */ /* If environment PCTRM is set, try initiate the card/mode. */ /* special instruction on mode */ safe_strncpy(pc_modename, getenv("PCTRM"), 8); #ifdef __TURBOC__ /* Some of this code including BGI drivers are copyright Borland Intl. */ registerfarbgidriver(EGAVGA_driver_far); registerfarbgidriver(CGA_driver_far); registerfarbgidriver(Herc_driver_far); registerfarbgidriver(ATT_driver_far); registerfarbgidriver(PC3270_driver_far); pc_driver = DETECT; detectgraph(&pc_driver, &pc_mode); if (graphresult()) { fputs("Unable to initialize graphics.\n", stderr); return; } #ifdef BGI_NAME /* the highest standard pc_driver value, see graphics.h */ #define LAST_BGI 10 /* the last mode of the SVGA.BGI */ #define LAST_SVGA_MODE 6 /* test SVGA if we have VGA */ if ((pc_driver == VGA) && (pc_modename[0] == 'S')) { installuserdriver(BGI_NAME, &detect_svga); registerfarbgidriver(SVGA_driver_far); pc_driver = DETECT; initgraph(&pc_driver, &pc_mode, ""); /* The following code, which is independent of the actual SVGA.BGI * used, tries to find a mode of width defined in the environment * variable PCTRM */ if (pc_driver > LAST_BGI) { /* success */ sscanf(pc_modename, "S%d", &t); switch (t) { case 800: break; /* S800 */ case 1024: break; /* S1024 */ case 1280: break; /* S1280 */ default: t = 640; /* 640x480 */ } for (i = 0; i <= LAST_SVGA_MODE; i++) { setgraphmode(i); if ((getmaxx() + 1 == t) && (getmaxcolor() > 14)) pc_mode = i; } setgraphmode(pc_mode); if (graphresult()) { /* error, go back to VGA */ pc_driver = VGA; pc_mode = 4; } } } /* SVGA tested */ if (pc_driver <= LAST_BGI) #endif /* BGI_NAME */ initgraph(&pc_driver, &pc_mode, ""); pc_colors = getmaxcolor() + 1; pc_lastx = getmaxx(); pc_lasty = getmaxy(); restorecrtmode(); clrscr(); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _getvideoconfig(&VC); if ((pc_driver = VC.adapter) == 0) { fprintf(stderr, "Unable to initialize graphics.\n"); return; } switch (pc_driver = VC.adapter) { case _HERCULES: pc_mode = _HERCMONO; break; case _CGA: pc_mode = _HRESBW; break; case _MCGA: pc_mode = _MRES256COLOR; break; case _EGA: pc_mode = (VC.monitor == _MONO ? _ERESCOLOR : _ERESNOCOLOR); break; case _VGA: pc_mode = _VRES16COLOR; break; case _SVGA: if (pc_modename[0] == 'S') { /* test SVGA resolution */ sscanf(pc_modename, "S%d", &t); switch (t) { case 800: pc_mode = _SVRES256COLOR; break; /* S800 */ case 1024: pc_mode = _XRES256COLOR; break; /* S1024 */ case 1280: pc_mode = _XRES256COLOR + 2; break; /* S1280 */ /* Someone help me, who knows, how a newer Watcom calls that */ default: t = 640; pc_mode = _VRES256COLOR; /* 640x480 */ } while (_setvideomode(pc_mode) == 0) pc_mode--; } break; default: fputs("Unable to initialize graphics.\n", stderr); return; } _setvideomode(pc_mode); _getvideoconfig(&VC); pc_lastx = VC.numxpixels - 1; pc_lasty = VC.numypixels - 1; pc_colors = VC.numcolors; _setvideomode(_DEFAULTMODE); #endif /* WATCOMC */ x = pc_lastx + 1; y = pc_lasty + 1; fprintf(stderr, "\tScreen of %d x %d pixels and %d colors.\n", x, y, pc_colors); pc_graphics = TRUE; } TERM_PUBLIC void PC_init() { char *pathp; #ifdef __WATCOMC__ struct _fontinfo fi; #endif if (!pc_graphics) { fputs("Unable to initialize graphics.\n", stderr); term = 0; return; } /* Double the tic/font sizes. */ pc_text_size = (pc_lasty > 590) ? 2 : 1; term->h_char = PC_HCHAR; term->v_char = PC_VCHAR; term->h_tic = PC_HTIC * pc_text_size; term->v_tic = PC_VTIC * pc_text_size; term->xmax = pc_lastx + 1; term->ymax = pc_lasty + 1; #ifdef __TURBOC__ setgraphmode(pc_mode); settextstyle(DEFAULT_FONT, HORIZ_DIR, pc_text_size); settextjustify(pc_hjustify, pc_vjustify); term->h_char = textheight("X"); /* overriding the default */ term->v_char = textwidth("X"); /* overriding the default */ #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _setvideomode(pc_mode); _settextang(HORIZ_DIR); _settextalign(pc_hjustify, pc_vjustify); _setcharsize(pc_text_size * PC_HCHAR, pc_text_size * PC_VCHAR); _getfontinfo(&fi); term->h_char = fi.avgwidth; term->v_char = fi.pixheight * 1.5; #endif /* WATCOMC */ #ifdef MSC #endif /* MSC */ } TERM_PUBLIC void PC_graphics() { graphics_on = TRUE; #ifdef __TURBOC__ setgraphmode(pc_mode); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _setvideomode(pc_mode); #endif /* WATCOMC */ #ifdef MSC if (pc_corscreen == -1) Vmode(18); /* VGA */ else { grinit(corscreen); grandtx(); } /* corolla */ #endif /* MSC */ } TERM_PUBLIC void PC_linetype(int linetype) { if (linetype < -2) linetype = LT_BLACK; if (pc_colors > 14) { /* 16 or more colors */ if (linetype >= 13) linetype %= 13; #ifdef __TURBOC__ setcolor(vga_color[linetype + 2]); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _setcolor(vga_color[linetype + 2]); #endif /* WATCOMC */ #ifdef MSC #endif /* MSC */ } else { /* MONO */ if (linetype >= 5) linetype %= 5; #ifdef __TURBOC__ setlinestyle(4, pattern[linetype + 2], 1); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _setlinestyle(pattern[linetype + 2]); #endif /* WATCOMC */ #ifdef MSC if (pc_corscreen != -1) Cor_mask(pattern[linetype + 2]); #endif /* MSC */ } } TERM_PUBLIC void PC_move(unsigned int x, unsigned int y) { #ifdef __TURBOC__ moveto(x, pc_lasty - y); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _moveto(x, pc_lasty - y); #endif /* WATCOMC */ #ifdef MSC #endif /* MSC */ startx = x; starty = y; } TERM_PUBLIC void PC_vector(unsigned int x, unsigned int y) { #ifdef __TURBOC__ lineto(x, pc_lasty - y); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _lineto(x, pc_lasty - y); #endif /* WATCOMC */ #ifdef MSC if (pc_corscreen != -1) Cor_line(startx, COR_YLAST - starty, x, COR_YLAST - y); #endif /* MSC */ startx = x; starty = y; } TERM_PUBLIC void PC_reset() { graphics_on = FALSE; #ifdef __TURBOC__ restorecrtmode(); clrscr(); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _setvideomode(_DEFAULTMODE); #endif /* WATCOMC */ #ifdef MSC Vmode(3); #endif /* MSC */ } TERM_PUBLIC void PC_text() { if (graphics_on) { graphics_on = FALSE; (void) getch(); #ifdef __TURBOC__ restorecrtmode(); clrscr(); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _setvideomode(_DEFAULTMODE); #endif /* WATCOMC */ #ifdef MSC if (pc_corscreen != -1) { grreset(); txonly(); } Vmode(3); #endif /* MSC */ } } TERM_PUBLIC int PC_text_angle(int ang) { switch (ang) { case 0: pc_text_dir = HORIZ_DIR; break; default: case 1: pc_text_dir = VERT_DIR; break; } return TRUE; } TERM_PUBLIC int PC_justify_text(enum JUSTIFY just) { #if defined(__TURBOC__) switch (just) { case LEFT: pc_hjustify = LEFT_TEXT; pc_vjustify = CENTER_TEXT; break; case CENTRE: pc_hjustify = CENTER_TEXT; pc_vjustify = CENTER_TEXT; break; case RIGHT: pc_hjustify = RIGHT_TEXT; pc_vjustify = CENTER_TEXT; break; } settextjustify(pc_hjustify, pc_vjustify); return 1; #elif defined(__WATCOMC__) switch (just) { case LEFT: pc_hjustify = _LEFT; pc_vjustify = _HALF; break; case CENTRE: pc_hjustify = _CENTER; pc_vjustify = _HALF; break; case RIGHT: pc_hjustify = _RIGHT; pc_vjustify = _HALF; break; } _settextalign(pc_hjustify, pc_vjustify); return 1; #else return (just == LEFT); #endif } TERM_PUBLIC void PC_put_text(unsigned int x, unsigned int y, const char *str) { #ifdef __TURBOC__ settextstyle(DEFAULT_FONT, pc_text_dir, pc_text_size); settextjustify(pc_hjustify, pc_vjustify); outtextxy(x, pc_lasty - y, str); #endif /* __TURBOC__ */ #ifdef __WATCOMC__ _setcharsize(pc_text_size * PC_VCHAR, pc_text_size * PC_HCHAR); _settextang(pc_text_dir); _settextalign(pc_hjustify, pc_vjustify); _grtext(x, pc_lasty - y, str); #endif /* WATCOMC */ #ifdef MSC #endif /* MSC */ } #endif /* TERM_BODY */ #ifdef TERM_TABLE TERM_TABLE_START(dospc_driver) "dospc", "IBM PC/Clone running DOS", PC_XMAX, PC_YMAX, PC_VCHAR, PC_HCHAR, PC_VTIC, PC_HTIC, options_null, PC_init, PC_reset, PC_text, null_scale, PC_graphics, PC_move, PC_vector, PC_linetype, PC_put_text, PC_text_angle, PC_justify_text, line_and_point, do_arrow, set_font_null TERM_TABLE_END(dospc_driver) #undef LAST_TERM #define LAST_TERM dospc_driver #endif /* TERM_TABLE */ #endif /* TERM_PROTO_ONLY */ #ifdef TERM_HELP START_HELP(dospc) "1 dospc", "?commands set terminal dospc", "?set terminal dospc", "?set term dospc", "?terminal dospc", "?term dospc", "?dospc", " Note: legacy terminal.", " The `dospc` terminal driver supports PCs with arbitrary graphics boards,", " which will be automatically detected. It should be used only if you are", " not using the gcc or Zortec C/C++ compilers." END_HELP(dospc) #endif /* TERM_HELP */