home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / hensa / maths / plplot / plplot_2 / drivers / linuxvga.c < prev    next >
C/C++ Source or Header  |  1994-07-19  |  7KB  |  303 lines

  1. /* $Id: linuxvga.c,v 1.5 1994/07/19 22:30:19 mjl Exp $
  2.  * $Log: linuxvga.c,v $
  3.  * Revision 1.5  1994/07/19  22:30:19  mjl
  4.  * All device drivers: enabling macro renamed to PLD_<driver>, where <driver>
  5.  * is xwin, ps, etc.  See plDevs.h for more detail.
  6.  *
  7.  * Revision 1.4  1994/05/25  09:36:54  mjl
  8.  * All VGA driver function names now end with "_vga", a nice simplification.
  9.  * Since all are compiler-dependent and mutually exclusive, this should pose
  10.  * no problem.  Also HP pen plotter driver were consolidated.  Both
  11.  * contributions by Mark Olesen (olesen@weber.me.queensu.ca).
  12.  *
  13.  * Revision 1.3  1994/04/08  11:35:58  mjl
  14.  * Put nopause support back into the drivers where it is better off.
  15.  * I don't know WHAT I was thinking.
  16.  *
  17.  * Revision 1.2  1994/03/23  06:34:27  mjl
  18.  * All drivers: cleaned up by eliminating extraneous includes (stdio.h and
  19.  * stdlib.h now included automatically by plplotP.h), extraneous clears
  20.  * of pls->fileset, pls->page, and pls->OutFile = NULL (now handled in
  21.  * driver interface or driver initialization as appropriate).  Special
  22.  * handling for malloc includes eliminated (no longer needed) and malloc
  23.  * prototypes fixed as necessary.
  24.  *
  25.  * Revision 1.1  1993/08/03  03:21:54  mjl
  26.  * Added contributions from Sergio Fanchiotti for use under Linux.
  27. */
  28.  
  29. /*
  30.     linuxvga.c
  31.     S. Fanchiotti (Using gnusvga.c by Geoffrey Furnish)
  32.     4 May 1993
  33.     
  34.     This file constitutes the driver for an VGA display under Linux
  35.     using the GNU CC compiler and vgalib 1.2 library by T. Fradsen
  36.  
  37.     Things to note: NEEDS vgalib to compile!!!!!
  38.  
  39. */
  40. #include "plDevs.h"
  41.  
  42. #ifdef PLD_linuxvga        /* Only compile for Linux + Vgalib 1.2 */
  43.  
  44. #include "plplotP.h"
  45. #include "drivers.h"
  46. #include <vga.h>
  47.  
  48. /* Function prototypes */
  49. /* INDENT OFF */
  50.  
  51. static void lxvga_text    (PLStream *pls);
  52. static void lxvga_graph    (PLStream *pls);
  53. static void pause    (PLStream *pls);
  54.  
  55. /* INDENT ON */
  56.  
  57. static PLINT vgax = 639;
  58. static PLINT vgay = 479;
  59.  
  60. /* A flag to tell us whether we are in text or graphics mode */
  61.  
  62. #define TEXT_MODE 0
  63. #define GRAPHICS_MODE 1
  64.  
  65. /* gmf; should probably query this on start up... Maybe later. */
  66. /* sf; Will set them dynamically! */
  67.  
  68. static int mode = TEXT_MODE;
  69. static int col = 1;
  70. static int totcol = 16;
  71.  
  72. #define CLEAN 0
  73. #define DIRTY 1
  74.  
  75. static page_state;
  76.  
  77. /*----------------------------------------------------------------------*\
  78. * plD_init_vga()
  79. *
  80. * Initialize device.
  81. \*----------------------------------------------------------------------*/
  82.  
  83. void
  84. plD_init_vga(PLStream *pls)
  85. {
  86.     pls->termin = 1;        /* is an interactive terminal */
  87.     pls->icol0 = 1;
  88.     pls->width = 1;
  89.     pls->bytecnt = 0;
  90.     pls->page = 0;
  91.     pls->graphx = TEXT_MODE;
  92.  
  93.     if (!pls->colorset)
  94.     pls->color = 1;
  95.  
  96. /* What kind of VGA mode one wants is set up here.
  97.    It can be easyly made interactive! */
  98.     mode = G640x480x16;        /* See <vga.h> for a list */
  99.     if (vga_hasmode(mode))
  100.     vga_setmode(mode);
  101.     else {
  102.     printf("Error: Video mode not supported by graphics card\n");
  103.     exit(-1);
  104.     }
  105.  
  106.     /* If all is fine we get the dimensions and # of colors */
  107.     vgax = vga_getxdim() - 1;
  108.     vgay = vga_getydim() - 1;
  109.  
  110.     totcol = vga_getcolors();
  111.  
  112.     setpxl(2.5, 2.5);        /* My best guess.  Seems to work okay. */
  113.  
  114.     setphy(0, vgax, 0, vgay);
  115. }
  116.  
  117. /*----------------------------------------------------------------------*\
  118. * plD_line_vga()
  119. *
  120. * Draw a line in the current color from (x1,y1) to (x2,y2).
  121. \*----------------------------------------------------------------------*/
  122.  
  123. void
  124. plD_line_vga(PLStream *pls, short x1a, short y1a, short x2a, short y2a)
  125. {
  126.     int x1 = x1a, y1 = y1a, x2 = x2a, y2 = y2a;
  127.  
  128.     y1 = vgay - y1;
  129.     y2 = vgay - y2;
  130.  
  131.     vga_drawline(x1, y1, x2, y2);
  132.  
  133.     page_state = DIRTY;
  134. }
  135.  
  136. /*----------------------------------------------------------------------*\
  137. * plD_polyline_vga()
  138. *
  139. * Draw a polyline in the current color.
  140. \*----------------------------------------------------------------------*/
  141.  
  142. void
  143. plD_polyline_vga(PLStream *pls, short *xa, short *ya, PLINT npts)
  144. {
  145.     PLINT i;
  146.  
  147.     for (i = 0; i < npts - 1; i++)
  148.     plD_line_vga(pls, xa[i], ya[i], xa[i + 1], ya[i + 1]);
  149. }
  150.  
  151. /*----------------------------------------------------------------------*\
  152. * plD_eop_vga()
  153. *
  154. * End of page.
  155. \*----------------------------------------------------------------------*/
  156.  
  157. void
  158. plD_eop_vga(PLStream *pls)
  159. {
  160.     if (page_state == DIRTY)
  161.     pause(pls);
  162.  
  163.     /* vga_setmode(mode); */
  164.     vga_clear();        /* just clean it */
  165.  
  166.     page_state = CLEAN;
  167. }
  168.  
  169. /*----------------------------------------------------------------------*\
  170. * plD_bop_vga()
  171. *
  172. * Set up for the next page.
  173. * Advance to next family file if necessary (file output).
  174. \*----------------------------------------------------------------------*/
  175.  
  176. void
  177. plD_bop_vga(PLStream *pls)
  178. {
  179.     pls->page++;
  180.     plD_eop_vga(pls);
  181. }
  182.  
  183. /*----------------------------------------------------------------------*\
  184. * plD_tidy_vga()
  185. *
  186. * Close graphics file or otherwise clean up.
  187. \*----------------------------------------------------------------------*/
  188.  
  189. void
  190. plD_tidy_vga(PLStream *pls)
  191. {
  192.     lxvga_text(pls);
  193. }
  194.  
  195. /*----------------------------------------------------------------------*\
  196. * plD_state_vga()
  197. *
  198. * Handle change in PLStream state (color, pen width, fill attribute, etc).
  199. \*----------------------------------------------------------------------*/
  200.  
  201. void
  202. plD_state_vga(PLStream *pls, PLINT op)
  203. {
  204.     switch (op) {
  205.  
  206.       case PLSTATE_WIDTH:
  207.     break;
  208.  
  209.       case PLSTATE_COLOR0:
  210.     if (pls->color) {
  211.  
  212.         /* Maybe it would be wiser to use a set of 16 relevant colors only
  213.            and just fix it to black if col is exceeded 16.        */
  214.  
  215.         col = (pls->icol0) % totcol;    /* Color modulo # of colors
  216.                            avail */
  217.         vga_setcolor(col);
  218.     }
  219.     break;
  220.  
  221.       case PLSTATE_COLOR1:
  222.     break;
  223.     }
  224. }
  225.  
  226. /*----------------------------------------------------------------------*\
  227. * plD_esc_vga()
  228. *
  229. * Escape function.
  230. \*----------------------------------------------------------------------*/
  231.  
  232. void
  233. plD_esc_vga(PLStream *pls, PLINT op, void *ptr)
  234. {
  235.     switch (op) {
  236.  
  237.       case PLESC_TEXT:
  238.     lxvga_text(pls);
  239.     break;
  240.  
  241.       case PLESC_GRAPH:
  242.     lxvga_graph(pls);
  243.     break;
  244.     }
  245. }
  246.  
  247. /*----------------------------------------------------------------------*\
  248. * lxvga_text()
  249. *
  250. * Switch to text mode.
  251. \*----------------------------------------------------------------------*/
  252.  
  253. static void
  254. lxvga_text(PLStream *pls)
  255. {
  256.     if (pls->graphx == GRAPHICS_MODE) {
  257.     if (page_state == DIRTY)
  258.         pause(pls);
  259.     vga_setmode(TEXT);
  260.     pls->graphx = TEXT_MODE;
  261.     }
  262. }
  263.  
  264. /*----------------------------------------------------------------------*\
  265. * lxvga_graph()
  266. *
  267. * Switch to graphics mode.
  268. \*----------------------------------------------------------------------*/
  269.  
  270. static void
  271. lxvga_graph(PLStream *pls)
  272. {
  273.     if (pls->graphx == TEXT_MODE) {
  274.     vga_setmode(mode);    /* mode should be set right or ... */
  275.     pls->graphx = GRAPHICS_MODE;
  276.     page_state = CLEAN;
  277.     }
  278. }
  279.  
  280. /*----------------------------------------------------------------------*\
  281. * pause()
  282. *
  283. * Wait for a keystroke.
  284. \*----------------------------------------------------------------------*/
  285.  
  286. static void
  287. pause(PLStream *pls)
  288. {
  289.     if (pls->nopause) 
  290.     return;
  291.  
  292.     vga_getch();
  293. }
  294.  
  295. #else
  296. int
  297. pldummy_vga()
  298. {
  299.     return 0;
  300. }
  301.  
  302. #endif                /* PLD_linuxvga */
  303.