home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_C / VGAGRAPH.ZIP / GRAPH.C < prev    next >
C/C++ Source or Header  |  1994-02-26  |  8KB  |  295 lines

  1. //*************************************************************
  2. //           Ivan Kostenko 1992
  3. //*************************************************************
  4.  
  5. #include <dos.h>
  6. #include <mem.h>
  7. #include <string.h>
  8. #include "allproc.h"
  9.  
  10.  
  11.  
  12. void (*setscrline)(unsigned int);
  13. void (*putpixel)(int,int,char);
  14. char (*getpixel)(int,int);
  15. void (*clearscr)(char);
  16. void (*line)(int,int,int,int,char);
  17. void (*bar)(int,int,int,int,int);
  18. void (*bars)(int,int,int,int,char);
  19. void (*barpat)(int,int,int,int,char,char);
  20. void (*displaychar)(int,int,char,char,char,char);
  21. void (*lineh)(int,int,int,char,char);
  22. void (*linev)(int,int,int,char,char);
  23. void (*barpats)(int,int,int,int,char,char);
  24. void (*setcol)(char,char,unsigned int);
  25. void (*fasttext)(int,int,char *);
  26. void (*windowshadow)(int,int,int,int);
  27. void (*screentoscreen)(int,int,int,int,int,int);
  28. char (*getimage)(unsigned int,unsigned int,unsigned int,unsigned int,Image *);
  29. void (*putimage)(unsigned int,unsigned int,Image,char);
  30.  
  31. char byte_tabXL[4] = {0x0F,0x0E,0x0C,0x08};
  32. char byte_tabXR[4] = {0x00,0x01,0x03,0x07};
  33. char char_tab[16] = {0,8,4,12,2,10,6,14,1,9,5,13,3,11,7,15};
  34. char byte_tab[8] = {0x0FF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01};
  35. char pln_tab[4] = { 1 , 2 , 4 , 8 };
  36.  
  37. unsigned int BytesPerLine,FastPlace,MaxX,MaxY;
  38.  
  39. void Init10()
  40. {
  41.        setscrline=setscrline10;
  42.        putpixel=putpixel10;
  43.        getpixel=getpixel10;
  44.        clearscr=clearscr10;
  45.        line=line10;
  46.        bar=bar10;
  47.        bars=bars10;
  48.        barpat=barpat10;
  49.        displaychar=displaychar10;
  50.        lineh=lineh10;
  51.        linev=linev10;
  52.        barpats=barpats10;
  53.        setcol=setcol10;
  54.        fasttext=fasttext10;
  55.        windowshadow=windowshadow10;
  56.        screentoscreen=screentoscreen10;
  57.        getimage=getimage10;
  58.        putimage=putimage10;
  59. }
  60. void InitX()
  61. {
  62.        setscrline=setscrlinex;
  63.        putpixel=putpixelx;
  64.        getpixel=getpixelx;
  65.        clearscr=clearscrx;
  66.        line=linex;
  67.        bar=barx;
  68.        bars=barsx;
  69.        barpat=barpatx;
  70.        displaychar=displaycharx;
  71.        setcol=setcolx;
  72.        fasttext=fasttextx;
  73.        screentoscreen=screentoscreenx;
  74.        getimage=getimagex;
  75.        putimage=putimagex;
  76. }
  77. void SetMode(char mode)
  78. {
  79.     asm {
  80.      mov ah,0
  81.      mov al,mode
  82.      int 10h
  83.     }
  84. }
  85. char VGA320x240()
  86. {
  87. int     data[10]={0x0D06,0x3E07,0x4109,0xEA10,0xAC11,
  88.           0xDF12,0x0014,0xE715,0x0616,0xE317};
  89. char     j;
  90. void far *Screen;
  91.  
  92.     SetMode(0x13);
  93.     if (peekb(0x0,0x0449)!=0x13) return(1);
  94.     outport(0x03C4,0x0604);
  95.     outport(0x03C4,0x0100);
  96.     outportb(0x03C2,0xE3);
  97.     outport(0x03C4,0x0300);
  98.     outportb(0x03D4,0x11);outportb(0x03D5,inportb(0x03D5) & 0x7F);
  99.     Screen=MK_FP(0xA000, 0);
  100.     setmem(Screen,0xFFFF,0);
  101.     for (j=0;j<10;j++) outport(0x03D4,data[j]);
  102.     BytesPerLine=80;
  103.     MaxX=319;
  104.     MaxY=239;
  105.     InitX();
  106.     return(0);
  107. }
  108. char VGA320x400()
  109. {
  110. void far *Screen;
  111.  
  112.     SetMode(0x13);
  113.     if (peekb(0x0,0x0449)!=0x13) return(1);
  114.     outportb(0x03C4,0x04);outportb(0x03C5,(inportb(0x03C5) & 0xF7) | 0x04);
  115.     outportb(0x03CE,0x05);outportb(0x03CF,inportb(0x03CF) & 0xEF);
  116.     outportb(0x03CE,0x06);outportb(0x03CF,inportb(0x03CF) & 0xFD);
  117.     outportb(0x03C4,0x02);outportb(0x03C5,0x0F);
  118.     Screen=MK_FP(0xA000, 0);
  119.     setmem(Screen,0xFFFF,0);
  120.     outportb(0x03D4,0x09);outportb(0x03D5,inportb(0x03D5) & 0xE0);
  121.     outportb(0x03D4,0x14);outportb(0x03D5,inportb(0x03D5) & 0xBF);
  122.     outportb(0x03D4,0x17);outportb(0x03D5,inportb(0x03D5) | 0x40);
  123.     BytesPerLine=80;
  124.     MaxX=319;
  125.     MaxY=399;
  126.     InitX();
  127.     return(0);
  128. }
  129. char VGA320x480()
  130. {
  131. int     data[10]={0x0D06,0x3E07,0x4009,0xE010,0xAC11,
  132.          0xDF12,0x0014,0xE715,0x0616,0xE317};
  133.  
  134. char     j;
  135. void far *Screen;
  136.  
  137.     SetMode(0x13);
  138.     if (peekb(0x0,0x0449)!=0x13) return(1);
  139.     outport(0x03C4,0x0604);
  140.     outport(0x03C4,0x0100);
  141.     outportb(0x03C2,0xE3);
  142.     outport(0x03C4,0x0300);
  143.     outportb(0x03D4,0x11);outportb(0x03D5,inportb(0x03D5) & 0x7F);
  144.     Screen=MK_FP(0xA000, 0);
  145.     setmem(Screen,0xFFFF,0);
  146.     for (j=0;j<10;j++) outport(0x03D4,data[j]);
  147.     BytesPerLine=80;
  148.     MaxX=319;
  149.     MaxY=479;
  150.     InitX();
  151.     return(0);
  152. }
  153. char VGA360x480()
  154. {
  155. int     data[17]={0x6B00,0x5901,0x5A02,0x8E03,0x5E04,
  156.           0x8A05,0x0D06,0x3E07,0x4009,0xEA10,
  157.           0xAC11,0xDF12,0x2D13,0x0014,0xE715,
  158.           0x0616,0xE317};
  159.  
  160. char     j;
  161. void far *Screen;
  162.  
  163.     SetMode(0x13);
  164.     if (peekb(0x0,0x0449)!=0x13) return(1);
  165.     outport(0x03C4,0x0604);
  166.     outport(0x03C4,0x0100);
  167.     outportb(0x03C2,0xE7);
  168.     outport(0x03C4,0x0300);
  169.     outportb(0x03D4,0x11);outportb(0x03D5,inportb(0x03D5) & 0x7F);
  170.     Screen=MK_FP(0xA000, 0);
  171.     setmem(Screen,0xFFFF,0);
  172.     for (j=0;j<17;j++) outport(0x03D4,data[j]);
  173.     BytesPerLine=90;
  174.     MaxX=359;
  175.     MaxY=479;
  176.     InitX();
  177.     return(0);
  178. }
  179. char EGA320x200()
  180. {
  181.     SetMode(0x0D);
  182.     if (peekb(0x0,0x0449)!=0x0D) return(1);
  183.     BytesPerLine=40;
  184.     MaxX=319;
  185.     MaxY=199;
  186.     Init10();
  187.     return(0);
  188. }
  189. char EGA640x200()
  190. {
  191.     SetMode(0x0E);
  192.     if (peekb(0x0,0x0449)!=0x0E) return(1);
  193.     BytesPerLine=80;
  194.     MaxX=639;
  195.     MaxY=199;
  196.     Init10();
  197.     return(0);
  198. }
  199. char EGA640x350()
  200. {
  201.     SetMode(0x10);
  202.     if (peekb(0x0,0x0449)!=0x10) return(1);
  203.     BytesPerLine=80;
  204.     MaxX=639;
  205.     MaxY=349;
  206.     Init10();
  207.     return(0);
  208. }
  209. char EGA640x480()
  210. {
  211.     SetMode(0x12);
  212.     if (peekb(0x0,0x0449)!=0x12) return(1);
  213.     BytesPerLine=80;
  214.     MaxX=639;
  215.     MaxY=479;
  216.     Init10();
  217.     return(0);
  218. }
  219. void TextMode()
  220. {
  221.     SetMode(3);
  222. }
  223.  
  224. void bar3d(int x,int y,int dx,int dy,int n,int col)
  225. {
  226. int i;
  227.  
  228.       bars(x,y,dx,dy,col);
  229.       x=x+n;
  230.       dx=dx-(n*2);
  231.       y=y+n;
  232.       dy=dy-(n*2);
  233.       if (col<8)
  234.       {
  235.       for (i=0;i<=(n-1);i++) lineh(x-i,y-i-1,dx+(i << 1)-1,15,col+8);
  236.       for (i=0;i<=(n-1);i++) linev(x-i-1,y-i-1,dy+(i << 1)+1,15,col);
  237.       for (i=0;i<=(n-1);i++) lineh(x-i-1,y+dy+i+1,dx+(i << 1),0,col);
  238.       for (i=0;i<=(n-1);i++) linev(x+dx+i+1,y-i-1,dy+(i << 1)+2,8,col);
  239.       }
  240.       else
  241.       {
  242.       for (i=0;i<=(n-1);i++) lineh(x-i,y-i-1,dx+(i << 1)-1,7,col);
  243.       for (i=0;i<=(n-1);i++) linev(x-i-1,y-i-1,dy+(i << 1)+1,8,col);
  244.       for (i=0;i<=(n-1);i++) lineh(x-i-1,y+dy+i+1,dx+(i << 1),0,col);
  245.       for (i=0;i<=(n-1);i++) linev(x+dx+i+1,y-i-1,dy+(i << 1)+2,8,col);
  246.       }
  247. }
  248. void bar3dz(int x,int y,int dx,int dy,int n,int col)
  249. {
  250. int i;
  251.  
  252.       bars(x,y,dx,dy,col);
  253.       x=x+n;
  254.       dx=dx-(n*2);
  255.       y=y+n;
  256.       dy=dy-(n*2);
  257.       if (col<8)
  258.       {
  259.       for (i=0;i<=(n-1);i++) lineh(x-i,y-i-1,dx+(i << 1)-1,0,col);
  260.       for (i=0;i<=(n-1);i++) linev(x-i-1,y-i-1,dy+(i << 1)+1,8,col);
  261.       for (i=0;i<=(n-1);i++) lineh(x-i-1,y+dy+i+1,dx+(i << 1),15,col+8);
  262.       for (i=0;i<=(n-1);i++) linev(x+dx+i+1,y-i-1,dy+(i << 1)+2,15,col);
  263.       }
  264.       else
  265.       {
  266.       for (i=0;i<=(n-1);i++) lineh(x-i,y-i-1,dx+(i << 1)-1,0,col);
  267.       for (i=0;i<=(n-1);i++) linev(x-i-1,y-i-1,dy+(i << 1)+1,8,col);
  268.       for (i=0;i<=(n-1);i++) lineh(x-i-1,y+dy+i+1,dx+(i << 1),7,col);
  269.       for (i=0;i<=(n-1);i++) linev(x+dx+i+1,y-i-1,dy+(i << 1)+2,8,col);
  270.       }
  271. }
  272. void displaystring(int x,int y,char *s,char colorf,char colorb,char flag)
  273. {
  274. char i;
  275.        for (i=0;i<strlen(s);i++)
  276.        {
  277.        displaychar(x,y,s[i],colorf,colorb,flag);
  278.        x+=8;
  279.        }
  280. }
  281. void teletext(int x,int y,char *s,char colorf,char colorb)
  282. {
  283.        displaystring(x,y,s,colorf,colorb,1);
  284. }
  285. void xortext(int x,int y,char *s,char colorb)
  286. {
  287.        displaystring(x,y,s,colorb,colorb,0);
  288. }
  289. void rectangle(int x,int y, int dx, int dy,char col)
  290. {
  291.      line(x,y,x+dx,y,col);
  292.      line(x,y,x,y+dy,col);
  293.      line(x+dx,y+dy,x+dx,y,col);
  294.      line(x,y+dy,x+dx,y+dy,col);
  295. }