home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / DRV256 / FX3DKIT.C < prev    next >
C/C++ Source or Header  |  1992-12-30  |  11KB  |  411 lines

  1. extern void far load_color(int color);
  2. extern void far xprintc(int c);
  3. extern void far xrprintc(int c);
  4.  
  5. extern void far vsync();                /* pause till vert. retrace */
  6.  
  7. extern void far set_vmode(int mode);    /* set video mode */
  8. extern void far set_vpage(int page);    /* set video page */
  9.  
  10. void far set_clip_rect(int l, int t, int r, int b);  /* only affects lines */
  11.  
  12. #define PUT 0        /* defines of VGA write modes */
  13. #define AND 1           /* for use with setup_hdwe()  */
  14. #define OR  2
  15. #define XOR 3
  16.  
  17. extern void far setup_hdwe(int mode);  /* setup VGA for bunch of line */
  18.                        /* or poly draws: once per set */
  19.  
  20. extern void far reset_hdwe();  /* reset VGA to BIOS state after drawing */
  21.  
  22.              /* clear video page to solid color: 10 mS */
  23.              /* returns -1 if bad page #         */
  24. extern int far clr_page(int page, int color);
  25.  
  26.             /* copy one page to another for use as */
  27.             /* background: 21 mS per call          */
  28.             /* returns -1 if bad page #            */
  29. extern int far copy_page(int source, int dest);
  30.  
  31.             /* fast VGA line draw: about 15600 24-pixel */
  32.             /* vectors/sec (horizontal much faster)     */
  33. extern void far vgaline(int x1, int y1, int x2, int y2, int color);
  34.  
  35.             /* does C-S clipping and draws line   */
  36. extern void far clipline(int x1, int y1, int x2, int y2, int color);
  37.  
  38. void far set_gmode();              /* enters 320x200x16 mode, clears screen */
  39. void far exit_gmode();             /* exits to text mode */
  40.  
  41. int far set_drawpage(int page);        /* set page for drawing on (0-7)   */
  42.  
  43.              /* set displayed page: uses BIOS   */
  44.              /* call, so DON'T use in interrupt */
  45.              /* routines! If WAIT is 1, will    */
  46.              /* sync with vert. retrace (pause) */
  47. int far set_vidpage(int page, int wait);
  48.  
  49. void far rest_8x8(int buffer, int address);
  50. int  far save_8x8(int x, int y, int buffer);
  51.  
  52.             /* print text in foreground only-- */
  53.             /* reversed = 1 for right-to-left  */
  54.             /* with x now right side of text   */
  55. void far printxyr(int x, int y, int color, char far *pstring, int reversed);
  56.  
  57.             /* draw "+" cursor on screen      */
  58.             /* save s screen under cursor       */
  59. void far draw_cursor(int x, int y, int color, int savebuff);
  60.  
  61.                  /* restores 8x8 area saved when   */
  62. void far erase_cursor(int savebuff); /* cursor was drawn               */
  63.  
  64.             /* copy any byte-aligned rectangle  */
  65.             /* this is evey 4 pixels for Y mode */
  66.             /* but every 8 for 16-color mode    */
  67.             /* x coords (left) are truncated to */
  68.             /* left byte boundary: x size is    */
  69.             /* bumped up to next full byte count */
  70. extern int far copy_block(int spage, int sx, int sy,  /* source */
  71.               int dpage, int dx, int dy,  /* dest   */
  72.               int xs, int ys);            /* # lines, pixels */
  73.  
  74.             /* clear any byte-aligned block       */
  75.             /* 15-30% slower than full page clear */
  76.             /* left edge rounded down, right edge */
  77.             /* rounded up to nearest byte boundary */
  78. extern int far clear_block(int left, int top, int right, int bottom,
  79.                int page, int color);
  80.  
  81. unsigned int dpaddr = 0;        /* video write base */
  82.  
  83. unsigned long l_hold, r_hold;   /* used to hold old x data for edge */
  84.  
  85. int x1clipl, x2clipl, y1clipl, y2clipl;
  86.  
  87. int xcpline = 0;                  /* line 0 to 199     */
  88. int xcpcol = 0;                   /* column 0 to 39 (char width) */
  89.  
  90. int l_clip = 0;           /* clipping rectangle for polys and lines */
  91. int r_clip = 319;         /* max. 0,319,0,199              */
  92. int t_clip = 0;
  93. int b_clip = 199;
  94.  
  95. struct Screeninfo {
  96.     int xmin, ymin, xmax, ymax, xcent, ycent, colors, pages, bw;
  97.     long aspect;
  98.     char id[80];
  99. } scrdat = {
  100.     0, 0, 319, 200, 160, 100, 256, 4, 0,
  101.     65536L/1.25,
  102.     "REND386 320x200 Y-mode Driver"
  103. };
  104.  
  105. struct Screeninfo far * far screen_data();
  106.  
  107.  
  108. /************* GRAPHICS MODE CONTROL SUPPORT **************/
  109.  
  110. struct Screeninfo far * far screen_data()
  111. {
  112.  return (struct Screeninfo far *)&scrdat;
  113. }
  114.  
  115. void far set_gmode()        /* enters 320x200x256 mode, clears screen */
  116. {                               /* may take arg in ext. VGA modes */
  117.  set_vmode(0x14);
  118. }
  119.  
  120. void far exit_gmode()        /* exits to text mode */
  121. {
  122.  set_vmode(0x03);
  123. }
  124.  
  125.  
  126. int far set_drawpage(int page)      /* set page for drawing */
  127. {
  128.  if(page>3) return(-1);
  129.  dpaddr = 16000*page;
  130.  return(0);
  131. }
  132.  
  133.  
  134. int far set_vidpage(int page, int wait)  /* set visible page, wait for vsync */
  135. {
  136.  if(page>3) return(-1);
  137.  set_vpage(page);
  138.  if(wait) vsync();
  139.  return 0;
  140. }
  141.  
  142.  
  143. /******************* LINE DRAWING SUPPORT ***************/
  144.  
  145. void far set_clip_rect(int l, int t, int r, int b)
  146. {
  147.  l_clip = l;
  148.  r_clip = r;
  149.  t_clip = t;
  150.  b_clip = b;
  151. }
  152.  
  153.  
  154. void far clipline(int x1, int y1, int x2, int y2, int color)
  155. {
  156.  x1clipl = x1;
  157.  x2clipl = x2;
  158.  y1clipl = y1;
  159.  y2clipl = y2;
  160.  
  161.  if (clipper()==-1) return;
  162.  vgaline(x1, y1, x2, y2, color);
  163.  return;
  164. }
  165.  
  166.  
  167. /********************* g-MODE TEXT PRINT SUPPORT ***************/
  168.  
  169. void fxprints(char far *pstring)
  170. {
  171.  int i,c;
  172.  
  173.  c = 1;
  174.  i = 0;
  175.  
  176.  while(c != 0)
  177.   {
  178.    c = pstring[i];
  179.    i++;
  180.    switch (c)
  181.     {
  182.      case 0: break;
  183.  
  184.      case '\n' :
  185.       {
  186.        if(xcpline<192) xcpline++;
  187.     xcpcol = 0;
  188.        if(xcpline>192) xcpline = 192;
  189.       }
  190.  
  191.      case '\r':
  192.       {
  193.        xcpcol = 0;
  194.        break;
  195.       }
  196.  
  197.      case '\t':
  198.       {
  199.        if((xcpcol&56)==0)
  200.     {
  201.      fxprints("        ");
  202.     }
  203.        while((xcpcol&56)!=0)
  204.     {
  205.      fxprints(" ");
  206.     }
  207.        break;
  208.       }
  209.  
  210.      default:
  211.       {
  212.        xprintc(c);
  213.        xcpcol+=8;
  214.        if(xcpcol>312) fxprints("\n");
  215.        break;
  216.       }
  217.     }
  218.    if(xcpcol>312) fxprints("\n");
  219.   }
  220. }
  221.  
  222. /***************** MIRROR TEXT PRINT SUPPORT ***************/
  223.  
  224. void rxprints(char far *pstring)
  225. {
  226.  int i,c;
  227.  
  228.  c = 1;
  229.  i = 0;
  230.  
  231.  while(c != 0)
  232.   {
  233.    c = pstring[i];
  234.    i++;
  235.    switch (c)
  236.     {
  237.      case 0: break;
  238.  
  239.      case '\n' :
  240.       {
  241.        if(xcpline<192) xcpline++;
  242.     xcpcol = 319;
  243.        if(xcpline>192) xcpline = 192;
  244.       }
  245.  
  246.      case '\r':
  247.       {
  248.        xcpcol = 319;
  249.        break;
  250.       }
  251.  
  252.      case '\t':
  253.       {
  254.        if((xcpcol&56)==0)
  255.     {
  256.      rxprints("        ");
  257.     }
  258.        while((xcpcol&56)!=0)
  259.     {
  260.      rxprints(" ");
  261.     }
  262.        break;
  263.       }
  264.  
  265.      default:
  266.       {
  267.        xrprintc(c);
  268.        xcpcol-=8;
  269.        if(xcpcol<7) rxprints("\n");
  270.        break;
  271.       }
  272.     }
  273.    if(xcpcol<7) rxprints("\n");
  274.   }
  275. }
  276.  
  277.  
  278.  
  279. void far printxyr(int x, int y, int color, char far *pstring, int reversed)
  280. {
  281.  setup_hdwe(0);
  282.  xcpline = y;
  283.  xcpcol = x;
  284.  load_color(color);
  285.  if(reversed) rxprints(pstring); else fxprints(pstring);
  286.  reset_hdwe();
  287. }
  288.  
  289.  
  290. /*************** CURSOR STUFF ************/
  291.  
  292. int savadr[8];
  293.  
  294. void far draw_cursor(int x, int y, int color, int savebuff)
  295. {
  296.  int xx = x-3;
  297.  int yy = y-3;
  298.  
  299.  if(xx<0)xx = 0;
  300.  if(yy<0)yy = 0;
  301.  
  302.  setup_hdwe(0);
  303.  savadr[savebuff] = save_8x8(xx,yy,savebuff);
  304.  vgaline(xx,y,x+3,y,color);
  305.  vgaline(x,yy,x,y+3,color);
  306.  reset_hdwe(0);
  307. }
  308.  
  309.  
  310. void far erase_cursor(int savebuff)
  311. {
  312.  setup_hdwe(0);
  313.  rest_8x8(savebuff, savadr[savebuff]);
  314.  reset_hdwe();
  315. }
  316.  
  317.  
  318. char default_palette[768] =
  319.                                                 {
  320. 0, 0, 0, 0, 0, 42, 0, 42, 0, 0, 42, 42,
  321. 42, 0, 0, 42, 0, 42, 42, 21, 0, 42, 42, 42,
  322. 21, 21, 21, 21, 21, 63, 21, 63, 21, 21, 63, 63,
  323. 63, 21, 21, 63, 21, 63, 63, 63, 21, 63, 63, 63,
  324. 5, 0, 0, 8, 0, 0, 10, 0, 0, 12, 0, 0,
  325. 15, 0, 0, 17, 0, 0, 20, 0, 0, 23, 0, 0,
  326. 26, 0, 0, 30, 0, 0, 34, 0, 0, 38, 0, 0,
  327. 43, 0, 0, 49, 0, 0, 56, 0, 0, 63, 0, 0,
  328. 5, 2, 0, 8, 4, 0, 10, 4, 0, 12, 6, 0,
  329. 15, 7, 0, 17, 8, 0, 20, 10, 0, 23, 11, 0,
  330. 26, 13, 0, 30, 14, 0, 34, 16, 0, 38, 18, 0,
  331. 43, 21, 0, 49, 24, 0, 56, 27, 0, 63, 31, 0,
  332. 5, 2, 2, 8, 4, 4, 10, 4, 4, 12, 6, 6,
  333. 15, 7, 7, 17, 8, 8, 20, 10, 10, 23, 11, 11,
  334. 26, 13, 13, 30, 14, 14, 34, 16, 16, 38, 18, 18,
  335. 43, 21, 21, 49, 24, 24, 56, 27, 27, 63, 31, 31,
  336. 5, 3, 2, 8, 6, 4, 10, 7, 4, 12, 9, 6,
  337. 15, 11, 7, 17, 13, 8, 20, 15, 10, 23, 17, 11,
  338. 26, 19, 13, 30, 22, 14, 34, 25, 16, 38, 28, 18,
  339. 43, 32, 21, 49, 37, 24, 56, 41, 27, 63, 47, 31,
  340. 5, 5, 2, 8, 8, 4, 10, 10, 4, 12, 12, 6,
  341. 15, 15, 7, 17, 17, 8, 20, 20, 10, 23, 23, 11,
  342. 26, 26, 13, 30, 30, 14, 34, 34, 16, 38, 38, 18,
  343. 43, 43, 21, 49, 49, 24, 56, 56, 27, 63, 63, 31,
  344. 5, 5, 0, 8, 8, 0, 10, 10, 0, 12, 12, 0,
  345. 15, 15, 0, 17, 17, 0, 20, 20, 0, 23, 23, 0,
  346. 26, 26, 0, 30, 30, 0, 34, 34, 0, 38, 38, 0,
  347. 43, 43, 0, 49, 49, 0, 56, 56, 0, 63, 63, 0,
  348. 0, 5, 2, 0, 8, 4, 0, 10, 4, 0, 12, 6,
  349. 0, 15, 7, 0, 17, 8, 0, 20, 10, 0, 23, 11,
  350. 0, 26, 13, 0, 30, 14, 0, 34, 16, 0, 38, 18,
  351. 0, 43, 21, 0, 49, 24, 0, 56, 27, 0, 63, 31,
  352. 0, 5, 0, 0, 8, 0, 0, 10, 0, 0, 12, 0,
  353. 0, 15, 0, 0, 17, 0, 0, 20, 0, 0, 23, 0,
  354. 0, 26, 0, 0, 30, 0, 0, 34, 0, 0, 38, 0,
  355. 0, 43, 0, 0, 49, 0, 0, 56, 0, 0, 63, 0, 
  356. 0, 5, 3, 0, 8, 6, 0, 10, 7, 0, 12, 9, 
  357. 0, 15, 11, 0, 17, 13, 0, 20, 15, 0, 23, 17, 
  358. 0, 26, 19, 0, 30, 22, 0, 34, 25, 0, 38, 28, 
  359. 0, 43, 32, 0, 49, 37, 0, 56, 41, 0, 63, 47,
  360. 0, 3, 5, 0, 6, 8, 0, 7, 10, 0, 9, 12, 
  361. 0, 11, 15, 0, 13, 17, 0, 15, 20, 0, 17, 23, 
  362. 0, 19, 26, 0, 22, 30, 0, 25, 34, 0, 28, 38, 
  363. 0, 32, 43, 0, 37, 49, 0, 41, 56, 0, 47, 63, 
  364. 0, 0, 5, 0, 0, 8, 0, 0, 10, 0, 0, 12, 
  365. 0, 0, 15, 0, 0, 17, 0, 0, 20, 0, 0, 23,
  366. 0, 0, 26, 0, 0, 30, 0, 0, 34, 0, 0, 38, 
  367. 0, 0, 43, 0, 0, 49, 0, 0, 56, 0, 0, 63, 
  368. 5, 0, 5, 8, 0, 8, 10, 0, 10, 12, 0, 12, 
  369. 15, 0, 15, 17, 0, 17, 20, 0, 20, 23, 0, 23, 
  370. 26, 0, 26, 30, 0, 30, 34, 0, 34, 38, 0, 38,
  371. 43, 0, 43, 49, 0, 49, 56, 0, 56, 63, 0, 63, 
  372. 5, 0, 3, 8, 0, 6, 10, 0, 7, 12, 0, 9, 
  373. 15, 0, 11, 17, 0, 13, 20, 0, 15, 23, 0, 17,
  374. 26, 0, 19, 30, 0, 22, 34, 0, 25, 38, 0, 28,
  375. 43, 0, 32, 49, 0, 37, 56, 0, 41, 63, 0, 47, 
  376. 2, 2, 2, 4, 4, 4, 5, 5, 5, 6, 6, 6, 
  377. 7, 7, 7, 8, 8, 8, 10, 10, 10, 11, 11, 11,
  378. 13, 13, 13, 15, 15, 15, 17, 17, 17, 19, 19, 19, 
  379. 22, 22, 22, 25, 25, 25, 28, 28, 28, 32, 32, 32, 
  380. 5, 5, 5, 8, 8, 8, 10, 10, 10, 12, 12, 12,
  381. 15, 15, 15, 17, 17, 17, 20, 20, 20, 23, 23, 23, 
  382. 26, 26, 26, 30, 30, 30, 34, 34, 34, 38, 38, 38,
  383. 43, 43, 43, 49, 49, 49, 56, 56, 56, 63, 63, 63
  384.                                  };
  385.  
  386.  
  387. void far load_DAC(char far *pal, int n);
  388. void far load_DAC_colors( char far *pal, int n, int bw)
  389. {
  390.  int i;
  391.  
  392.  if(pal==0) pal = &default_palette[0];
  393.  if(bw)
  394.   {
  395.    for(i=0;i<n;i++)
  396.    pal[i+i+i] = pal[i+i+i+1] = pal[i+i+i+2] =
  397.        ((pal[i+i+i]*3)+(pal[i+i+i+1]*8)+(pal[i+i+i+2]*5))/16;
  398.   }
  399.  load_DAC(pal, n);
  400. }
  401.  
  402. void far read_DAC(char far *pal, int n);
  403. void far read_DAC_colors( char far *pal, int n)
  404. {
  405.  int i;
  406.  
  407.  if(n>scrdat.colors) n = scrdat.colors;
  408.  read_DAC(pal, n);
  409. }
  410.  
  411.