home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / GNU / GNUPLOTsrc.lha / term / pc.trm < prev    next >
Encoding:
Text File  |  1996-01-22  |  8.8 KB  |  338 lines

  1. /*
  2.  * $Id: pc.trm,v 1.11 1995/12/20 21:48:04 drd Exp $
  3.  *
  4.  */
  5.  
  6. /* GNUPLOT - pc.trm */
  7. /*
  8.  * Copyright (C) 1990 - 1993
  9.  *
  10.  * Permission to use, copy, and distribute this software and its
  11.  * documentation for any purpose with or without fee is hereby granted,
  12.  * provided that the above copyright notice appear in all copies and
  13.  * that both that copyright notice and this permission notice appear
  14.  * in supporting documentation.
  15.  *
  16.  * Permission to modify the software is granted, but not the right to
  17.  * distribute the modified code.  Modifications are to be distributed
  18.  * as patches to released version.
  19.  *
  20.  * This software  is provided "as is" without express or implied warranty.
  21.  *
  22.  * This file is included by ../term.c.
  23.  *
  24.  * This terminal driver supports:
  25.  *  Under Microsoft C
  26.  *      cga, egabios, egalib, vgabios, hercules, corona325, att
  27.  *  Under Turboc C
  28.  *      cga, ega/vga, vgamono, svga, mcga, hercules, att
  29.  *
  30.  * AUTHORS
  31.  *  Colin Kelley, Thomas Williams, William Wilson, Russell Lang
  32.  *  modified by David J. Liu (liu@csb.yale.edu) for version 3.6
  33.  *
  34.  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
  35.  *
  36.  * Because only one compiler is used to generate gnuplot.exe
  37.  * and the type of the single graphics board is auto-detected,
  38.  * we can combine all these parts into one terminal type: PC
  39.  * and let the computer take care of the rest.  -- DJL
  40.  *
  41.  * Since I don't have MicroSoft C, I assume it would define MSC.
  42.  * Please correct it if you are using MS C.  Thank you.  -- DJL
  43.  *
  44.  */
  45.  
  46. /*
  47.  * adapted to the new terminal layout by Stefan Bodewig (Dec. 1995)
  48.  */
  49.  
  50. #ifndef GOT_DRIVER_H
  51. #include "driver.h"
  52. #endif
  53.  
  54. #ifdef TERM_REGISTER
  55. register_term(pc)
  56. #endif
  57.  
  58. #ifdef TERM_PROTO
  59. TERM_PUBLIC void PC_text __P((void));
  60. TERM_PUBLIC void PC_reset __P((void));
  61. TERM_PUBLIC void PC_init __P((void));
  62. TERM_PUBLIC void PC_graphics __P((void));
  63. TERM_PUBLIC void PC_linetype __P((int linetype));
  64. TERM_PUBLIC void PC_move __P((int x, int y));
  65. TERM_PUBLIC void PC_vector __P((int x, int y));
  66. TERM_PUBLIC void PC_put_text __P((int x, int y, char *str));
  67. TERM_PUBLIC int PC_text_angle __P((int ang));
  68.  
  69. #define PC_HCHAR FNT5X9_HCHAR
  70. #define PC_VCHAR FNT5X9_VCHAR
  71. #define PC_HTIC 5
  72. #define PC_VTIC 4
  73. #define PC_XMAX 100 /* These two entries are just place holders. */
  74. #define PC_YMAX 100 /* The actual values will be found in init.  */
  75. #endif /* TERM_PROTO */
  76.  
  77. #ifndef TERM_PROTO_ONLY
  78. #ifdef TERM_BODY
  79.  
  80. #ifdef __TURBOC__
  81. static int huge detect_svga __P((void));
  82. #endif /* __TURBOC__ */
  83.  
  84. #include <string.h>
  85. #include <stdlib.h>
  86. #ifdef __TURBOC__
  87. #include <graphics.h>
  88. #include <conio.h>
  89. #include <dos.h>
  90. #endif /* __TURBOC__ */
  91. #ifdef MSC
  92. #include "mcega.h"
  93. #endif /* MSC */
  94.  
  95. static int pattern[] = {0xffff, 0x0f0f, 0xffff, 0xaaaa, 0x3333, 0x3f3f, 0x0f0f};
  96. static int vga_color[] = {7,8,2,3,4,5,9,14,12,15,13,10,11,1,6};
  97.  
  98. static int pc_driver, pc_mode;
  99. static int graphics_on = FALSE, pc_graphics = FALSE;
  100. static int startx, starty, pc_lastx, pc_lasty, pc_colors;
  101. static int pc_angle, pc_text_size, pc_text_dir, pc_corscreen = -1;
  102.  
  103.  
  104. #ifdef __TURBOC__
  105. extern int far _Cdecl SVGA_driver_far[] ;
  106. #endif /* __TURBOC__ */
  107.  
  108. static int huge detect_svga(void)
  109. {
  110.   return 0; /* the default mode, just a place holder */
  111. }
  112.  
  113. void PC_setup() /* called from the beginning of main() */
  114. {
  115.   int i,t,x,y;
  116.   char pc_modename[9];
  117.  
  118. /* First link all BRI dribers, then detect the display card. */
  119. /* If environment PCTRM is set, try initiate the card/mode.  */
  120.  
  121.   strncpy(pc_modename,getenv("PCTRM"),8); /* special instruction on mode */
  122.  
  123. #ifdef __TURBOC__
  124. /* Some of this code including BGI drivers are copyright Borland Intl. */
  125.   registerfarbgidriver(EGAVGA_driver_far);
  126.   registerfarbgidriver(CGA_driver_far);
  127.   registerfarbgidriver(Herc_driver_far);
  128.   registerfarbgidriver(ATT_driver_far);
  129.   registerfarbgidriver(PC3270_driver_far);
  130.   pc_driver=DETECT; detectgraph(&pc_driver,&pc_mode);
  131.   if (graphresult())
  132.     { fprintf(stderr,"Unable to initialize graphics.\n"); return; }
  133. #ifdef BGI_NAME
  134. #define LAST_BGI 10 /* the highest standard pc_driver value, see graphics.h */
  135. #define LAST_SVGA_MODE 6 /* the last mode of the SVGA.BGI */
  136.   if ((pc_driver==VGA)&&(pc_modename[0]=='S')) /* test SVGA if we have VGA */
  137.     {
  138.       installuserdriver(BGI_NAME,&detect_svga) ;
  139.       registerfarbgidriver(SVGA_driver_far) ;
  140.       pc_driver=DETECT ; initgraph(&pc_driver,&pc_mode,"") ;
  141. /* The following code, which is independent of the actual SVGA.BGI used, */
  142. /* tries to find a mode of width defined in the environment variable PCTRM */
  143.       if (pc_driver>LAST_BGI) /* success */
  144.         {
  145.           sscanf(pc_modename,"S%d",&t);
  146.           switch(t) {
  147.             case 800  : break; /* S800  */
  148.             case 1024 : break; /* S1024 */
  149.             case 1280 : break; /* S1280 */
  150.             default: t = 640;  /* 640x480 */
  151.           }
  152.           for (i=0;i<=LAST_SVGA_MODE;i++)
  153.             {
  154.               setgraphmode(i);
  155.               if ((getmaxx()+1==t)&&(getmaxcolor()>14)) pc_mode=i;
  156.             }
  157.           setgraphmode(pc_mode) ;
  158.           if (graphresult()) /* error, go back to VGA */
  159.             { pc_driver = VGA; pc_mode = 4; }
  160.         }
  161.     } /* SVGA tested */
  162.   if (pc_driver<=LAST_BGI)
  163. #endif /* BGI_NAME */
  164.     initgraph(&pc_driver,&pc_mode,"");
  165.   pc_colors = getmaxcolor()+1;
  166.   pc_lastx = getmaxx(); pc_lasty = getmaxy();
  167.   restorecrtmode();
  168.   clrscr();
  169. #endif /* __TURBOC__ */
  170.   x = pc_lastx+1 ; y = pc_lasty+1 ;
  171.   fprintf(stderr,"\tScreen of %d x %d pixels and %d colors.\n",x,y,pc_colors);
  172.   pc_graphics = TRUE;
  173. }
  174.  
  175. TERM_PUBLIC void PC_init()
  176. {
  177.   char *pathp;
  178.  
  179.   if(!pc_graphics) {
  180.     fprintf(stderr,"Unable to initialize graphics.\n");
  181.     term=0; return;
  182.   }
  183.   pc_text_size = (pc_lasty>590)?2:1; /* Double the tic/font sizes. */
  184.   term_tbl[term].h_char = PC_HCHAR;
  185.   term_tbl[term].v_char = PC_VCHAR;
  186.   term_tbl[term].h_tic  = PC_HTIC*pc_text_size;
  187.   term_tbl[term].v_tic  = PC_VTIC*pc_text_size;
  188.   term_tbl[term].xmax = pc_lastx+1;
  189.   term_tbl[term].ymax = pc_lasty+1;
  190. #ifdef __TURBOC__
  191.   setgraphmode(pc_mode);
  192.   settextstyle(DEFAULT_FONT,HORIZ_DIR,pc_text_size);
  193.   term_tbl[term].h_char = textheight("X"); /* overriding the default */
  194.   term_tbl[term].v_char = textwidth("X");  /* overriding the default */
  195. #endif /* __TURBOC__ */
  196. #ifdef MSC
  197. #endif /* MSC */
  198. }
  199.  
  200. TERM_PUBLIC void PC_graphics()
  201. {
  202.   graphics_on = TRUE;
  203. #ifdef __TURBOC__
  204.   setgraphmode(pc_mode);
  205. #endif /* __TURBOC__ */
  206. #ifdef MSC
  207.   if (pc_corscreen==-1) Vmode(18); /* VGA */
  208.   else { grinit(corscreen); grandtx(); } /* corolla */
  209. #endif /* MSC */
  210. }
  211.  
  212. TERM_PUBLIC void PC_linetype(linetype)
  213. {
  214.   if (pc_colors>14) /* 16 or more colors */
  215.     {
  216.       if (linetype >= 13) linetype %= 13;
  217. #ifdef __TURBOC__
  218.       setcolor(vga_color[linetype+2]);
  219. #endif /* __TURBOC__ */
  220. #ifdef MSC
  221. #endif /* MSC */
  222.     }
  223.   else /* MONO */
  224.     {
  225.       if (linetype >= 5)  linetype %= 5;
  226. #ifdef __TURBOC__
  227.       setlinestyle(4,pattern[linetype+2],1);
  228. #endif /* __TURBOC__ */
  229. #ifdef MSC
  230.   if (pc_corscreen!=-1) Cor_mask(pattern[linetype+2]);
  231. #endif /* MSC */
  232.     }
  233. }
  234.  
  235. TERM_PUBLIC void PC_move(x,y)
  236.   int x,y;
  237. {
  238. #ifdef __TURBOC__
  239.   moveto(x,pc_lasty-y);
  240. #endif /* __TURBOC__ */
  241. #ifdef MSC
  242. #endif /* MSC */
  243.   startx = x;
  244.   starty = y;
  245. }
  246.  
  247. TERM_PUBLIC void PC_vector(x,y)
  248.   int x,y;
  249. {
  250. #ifdef __TURBOC__
  251.   lineto(x,pc_lasty-y);
  252. #endif /* __TURBOC__ */
  253. #ifdef MSC
  254.   if (pc_corscreen!=-1) Cor_line(startx,COR_YLAST-starty,x,COR_YLAST-y);
  255. #endif /* MSC */
  256.   startx = x;
  257.   starty = y;
  258. }
  259.  
  260. TERM_PUBLIC void PC_reset()
  261. {
  262.   graphics_on = FALSE;
  263. #ifdef __TURBOC__
  264.   restorecrtmode();
  265.   clrscr();
  266. #endif /* __TURBOC__ */
  267. #ifdef MSC
  268.   Vmode(3);
  269. #endif /* MSC */
  270. }
  271.  
  272. TERM_PUBLIC void PC_text()
  273. {
  274.   if (graphics_on) {
  275.     graphics_on = FALSE;
  276.     (void)getch();
  277. #ifdef __TURBOC__
  278.   restorecrtmode();
  279.   clrscr();
  280. #endif /* __TURBOC__ */
  281. #ifdef MSC
  282.   if (pc_corscreen!=-1) { grreset(); txonly(); }
  283.   Vmode(3);
  284. #endif /* MSC */
  285.   }
  286. }
  287.  
  288. TERM_PUBLIC int PC_text_angle(ang)
  289. int ang;
  290. {
  291.   switch(ang) {
  292.     case 0 : pc_text_dir = HORIZ_DIR; break;
  293.     case 1 : pc_text_dir =  VERT_DIR; break;
  294.   }
  295.   return TRUE;
  296. }
  297.  
  298. TERM_PUBLIC void PC_put_text(x,y,str)
  299.   int x, y;
  300.   char *str;
  301. {
  302. #ifdef __TURBOC__
  303.   settextstyle(DEFAULT_FONT,pc_text_dir,pc_text_size);
  304.   outtextxy(x,pc_lasty-y-(pc_text_dir?textwidth(str):(textheight(str)/2)),str);
  305. #endif /* __TURBOC__ */
  306. #ifdef MSC
  307. #endif /* MSC */
  308. }
  309.  
  310. #endif /* TERM_BODY */
  311.  
  312. #ifdef TERM_TABLE
  313.  
  314. TERM_TABLE_START(pc_driver)
  315.     "pc", "IBM PC/Clone running DOS",
  316.        PC_XMAX, PC_YMAX, PC_VCHAR, PC_HCHAR,
  317.        PC_VTIC, PC_HTIC, options_null, PC_init, PC_reset,
  318.        PC_text, null_scale, PC_graphics, PC_move, PC_vector,
  319.        PC_linetype, PC_put_text, PC_text_angle,
  320.        null_justify_text, line_and_point, do_arrow, set_font_null
  321. TERM_TABLE_END(pc_driver)
  322.  
  323. #undef LAST_TERM
  324. #define LAST_TERM pc_driver
  325.  
  326. #endif /* TERM_TABLE */
  327. #endif /* TERM_PROTO_ONLY */
  328.  
  329. /*
  330.  * NAME: pc
  331.  *
  332.  * OPTIONS: none 
  333.  *
  334.  * SUPPORTS: PC with arbitrary graphics board (autodetected)
  335.  *
  336.  * Further Info: Only defined if not compiled with gcc or Zortec C/C++.
  337.  *
  338.  */