在VGA上实现灰度显示的程序实例
在VGA上实现灰度显示的程序实例
#include"stdio.h"
#include"dos.h"
#include<conio.h>
#include<math.h>
#include<math.h>
#include<graphics.h>
unsigned long pre_cale_y2[480];
typedef unsigned char byte;
union REGS reg;
struct SREGS inreg;
typedef struct
{
byte red;
byte grn;
byte blu;
}
rgb;
typedef rgb palette_Register[256];
void set_palette(palette_Register hue)
{
reg.x.ax=0x1012;
segread(&inreg);
inreg.es=inreg.ds;
reg.x.bx=0;
reg.x.cx=256;
reg.x.dx=(int)&hue[0];
int86x(0x10,®,®,&inreg);
}
void init_palette_2(palette_Register color)
{
int i;
for(i=0;i<36;i++)
{
color[i].red=0;
color[i].grn=0;
color[i].blu=(int)(1.8*i+0.5);
}
for(i=36;i<72;i++)
{
color[i].red=0;
color[i].grn=(int)(1.8*(i-36)+0.5);
color[i].blu=0;
}
for(i=72;i<108;i++)
{
color[i].red=0;
color[i].grn=(int)(1.8*(i-72)+0.5);
color[i].blu=(int)(1.8*(i-72)+0.5);
}
for(i=108;i<144;i++)
{
color[i].red=(int)(1.8*(i-108)+0.5);
color[i].grn=0;
color[i].blu=0;
}
for(i=144;i<180;i++)
{
color[i].red=(int)(1.8*(i-144)+0.5);
color[i].grn=0;
color[i].blu=(int)(1.8*(i-144)+0.5);
}
for(i=180;i<216;i++)
{
color[i].red=(int)(1.8*(i-180)+0.5);
color[i].grn=(int)(1.8*(i-180)+0.5);
color[i].blu=0;
}
for(i=216;i<252;i++)
{
color[i].red=(int)(1.8*(i-216)+0.5);
color[i].grn=(int)(1.8*(i-216)+0.5);
color[i].blu=(int)(1.8*(i-216)+0.5);
}
}
void precale()
{
unsigned int j;
for(j=0;j<480;j++)
{
pre_cale_y2[j]=640*j;
}
}
void plot(int x,int y,char color)
{
long L_offset;
int offset,page;
char far *address;
precale();
if((x<640)&&(y<480))
{
L_offset=pre_cale_y2[y]+x;
page=(L_offset>>16);
offset=L_offset&65535;
outportb(0x3c4,0xe);
outportb(0x3c5,(page&0xf)^0x2);
address=(char far *)(0xa0000000L+offset);
*address=color;
}
}
void put_pix(int x,int y,char color,char inten)
{
char col;
col=((35+1)*(color-1)+inten)&255;
plot(x,y,col);
}
main()
{
int i,j;
palette_Register color;
precale();
reg.h.ah=0;
reg.h.al=0x13;
int86(0x10,®,®);
init_palette_2(color);
set_palette(color);
for(i=0;i<300;i++)
for(j=0;j<35;j++)
put_pix(i,j,3,j);
getchar();
closegraph();
}