📄 vesa.h
字号:
for(j=0;j<256;j++)
Source[j][i]=0;
for(k=0;k<64;k++)
{delay(time);
for(j=0;j<256;j++)
{
outp(0x3c8,j);
for(i=0;i<3;i++)
{if(Source[j][i]<ColorTable[j][i])
Source[j][i]++;
outp(0x3c9,Source[j][i]);
}
}
}
}
void set_palette(char *file)
{
FILE *fp;
register unsigned char i,j;
if((fp=fopen(file,"rb"))==NULL)
{grp_exit();
printf("Error Cannot open PAL is filename %s ",file);
exit(0);}
else
{fseek(fp,-768L,SEEK_END);
fread(ColorTable,1,768,fp);
fclose(fp);
}
for(i=0;i<255;i++)
{outp(0x3c8,i);
for(j=0;j<3;j++)
{
ColorTable[i][j]>>=2;
outp(0x3c9,ColorTable[i][j]);
}
SystemPal[i].r=ColorTable[i][0];
SystemPal[i].g=ColorTable[i][1];
SystemPal[i].b=ColorTable[i][2];
}
WHITE=get_color(63,63,63);
BLACK=get_color(0,0,0);
CYAN=get_color(48,48,48);
BLUE=get_color(0,63,63);
RED=get_color(63,0,0);
_COLOR=WHITE;
screen->Alph=WHITE;
fclose(fp);
}
void set_pallete(PALETTE pal)
{ register int i;
for(i=0;i<256;i++)
{outp(0x3c8,i);
outp(0x3c9,pal[i].r);
outp(0x3c9,pal[i].g);
outp(0x3c9,pal[i].b);
SystemPal[i].r=pal[i].r;
SystemPal[i].g=pal[i].g;
SystemPal[i].b=pal[i].b;
}
WHITE=get_color(63,63,63);
BLACK=get_color(0,0,0);
CYAN=get_color(48,48,48);
BLUE=get_color(0,63,63);
RED=get_color(63,0,0);
}
void setstyleline(unsigned char mode)
{ LineWriteMode.StyLine=mode;}
void line(BITMAP *bitmap,int left,int top,int right,int bottom,unsigned char color)
{ register int t,dis;
int x=0,y=0,delta_x,delta_y,incx,incy;
unsigned mask=0x80,line_count=0;
delta_x=right-left;
delta_y=bottom-top;
if(delta_x>0)incx=1;
else if(delta_x==0)incx=0;
else {delta_x=-delta_x;incx=-1;}
if(delta_y>0)incy=1;
else if(delta_y==0)incy=0;
else {delta_y=-delta_y;incy=-1;}
if(delta_x>delta_y)
dis=delta_x;
else
dis=delta_y;
for(t=0;t<dis+2;t++)
{if(LineWriteMode.StyLine&mask)putpixel(bitmap,left,top,color);
x+=delta_x;
y+=delta_y;
if(line_count>=7){mask=0x80;line_count=0;}
mask>>=1;
line_count++;
if(x>dis)
{x-=dis;
left+=incx;
}
if(y>dis)
{y-=dis;
top+=incy;
}
}
}
//建立BITMAP数据
//MskCol 透明色的值,默认为黑色
BITMAP *create_bitmap(int width,int height,unsigned char MskCol)
{ int count=(int)(width*height+1);
BITMAP *bitmap;
bitmap=(BITMAP*)malloc(sizeof(BITMAP)+(sizeof(char *)*height));
if(!bitmap)return FALSE;
bitmap->dat=new unsigned char[count];
if(!bitmap->dat){free(bitmap);return FALSE;}
bitmap->x=bitmap->y =0;
bitmap->ct=bitmap->cl=0;
bitmap->w=bitmap->cr=width;
bitmap->h=bitmap->cb=height;
bitmap->MskCol=MskCol;
bitmap->Alph =WHITE;
bitmap->clip=FALSE;
memset(bitmap->dat,MskCol,count);
bitmap->line[0]=bitmap->dat;
for(int i=1;i<height;i++)
bitmap->line[i]=bitmap->line[i-1]+width;
return bitmap;
}
void destroy_bitmap(BITMAP *bitmap)
{ if(!bitmap->dat)
delete [] bitmap->dat;
bitmap->dat=NULL;
if(!bitmap)free(bitmap);
}
void getimage(BITMAP *bitmap1,int x,int y,int x1,int y1,BITMAP *bitmap)
{ int width,j;
unsigned char *_bak1,*_bak2;
unsigned int offset_d,offset_s;
_bak1=bitmap1->dat;
_bak2=bitmap->dat;
width=x1-x;
offset_d=bitmap->x+bitmap->y*bitmap->w;
offset_s=x+y*bitmap1->w;
for(j=y;j<y1;j++)
{
movedata(FP_SEG(_bak1+offset_s),(unsigned)(_bak1+offset_s),
FP_SEG(_bak2+offset_d),(unsigned)(_bak2+offset_d),width);
_bak1+=bitmap1->w;
_bak2+=bitmap->w;
}
}
void putimage(BITMAP *destbitmap,int x,int y,BITMAP *surbitmap)
{ register int i,j,k=0;unsigned char *_bakbuf;
_bakbuf=surbitmap->dat;
for(j=y;j<surbitmap->h+y;j++)
for(i=x;i<surbitmap->w+x;i++)
if((*_bakbuf++)!=surbitmap->MskCol)putpixel(destbitmap,i,j,*_bakbuf);
}
inline short getbit(unsigned char c,short n)
{
return((c>>n)&1);
}
//填充封闭的多边形,但有些问题
void floodfill(BITMAP *bitmap,int x,int y,char col,char col1)
{ register int i=0,j,k;
j=x;
k=y;
i=getpixel(bitmap,j,k);
while(i!=col){
while(i!=col){
putpixel(bitmap,j,k,col1);j++;
i=getpixel(bitmap,j,k);}
j=x-1;
i=getpixel(bitmap,j,k);
while(i!=col){
putpixel(bitmap,j,k,col1);j--;
i=getpixel(bitmap,j,k);
}
j=x;k++;
i=getpixel(bitmap,j,k);}
k=y-1;j=x;
i=getpixel(bitmap,j,k);
while(i!=col){
while(i!=col){
putpixel(bitmap,j,k,col1);j++;
i=getpixel(bitmap,j,k);}
j=x-1;
i=getpixel(bitmap,j,k);
while(i!=col){
putpixel(bitmap,j,k,col1);j--;
i=getpixel(bitmap,j,k);}
j=x;k--;
i=getpixel(bitmap,j,k);
}
}
//将bitmap1中的局部数据写入bitmap(默认为屏幕)
void VRputimage(BITMAP *bitmap1,int x,int y,int top,int bom,BITMAP *bitmap)
{ int width,j;
unsigned char *_bak1,*_bak2;
_bak1=bitmap1->dat+bitmap->x+bitmap->y*bitmap1->w;
_bak2=bitmap->dat+x+y*bitmap->w;
width=top-x;
for(j=y;j<bom;j++)
{
blit8(FP_SEG(_bak1),FP_SEG(_bak2),_bak1,_bak2,width);
_bak1+=bitmap1->w;
_bak2+=bitmap->w;
}
}
//显示屏幕缓冲中的图像(不过虑透明色)
void Refresh()
{
movedata(FP_SEG(screen->dat),(unsigned)screen->dat,
FP_SEG(_Display->dat),(unsigned)_Display->dat,screen_videomem);
}
void set_time(short time)
{
short tt,ttt;
tt=time&0x00ff;
ttt=(time>>8)&0x00ff;
outp(0x43,0x3c);
outp(0x40,tt);
outp(0x40,ttt);
}
unsigned short readclock()
{unsigned short *clock=(unsigned short *)0x046c;
return *clock;
}
void Clearkey()
{ char *p1=(char*)1050;
char *p2=(char*)1052;
if(*p1!=*p2)
*p1=*p2;
}
char checkWin()
{union REGS r;
r.w.ax=0x1600;
int386(0x2f,&r,&r);
if((r.h.al==0x80)||(r.h.al==0x00))
return FALSE;
else return TRUE;
}
void Show_Err()
{if(screen_write==-1)return;
int W=SCREEN_W/2-100,
H=SCREEN_H/2-50;
rectfill(screen,W,H,W+250,H+100,CYAN);
rectfill(screen,W+2 ,H+2,W+250-2,H+20,BLUE);
textout(screen,"Grp System Error!!!",W+4,H+4,RED);
textout(screen,grp_err,W+20,H+30,WHITE);
rectfill(screen,W+10,H+70,W+80,H+90,CYAN-2);
rectfill(screen,W+110,H+70,W+180,H+90,CYAN-2);
textout(screen,"(Q)uit",W+15,H+75,WHITE);
textout(screen,"(C)ont..",W+115,H+75,WHITE);
short key=0;
while(1)
{Clearkey();
key=inp(0x60);
switch(key)
{case 16:
grp_exit();printf("Grp System Error!!!");exit(0);break;
case 46: return;
default: continue;
}
}
}
void LightLow(unsigned char light,unsigned char time)
{ register int i,j,k;
unsigned char Source[256][3];
if(light>63||light<0)light=63;
for(j=0;j<3;j++)
for(i=0;i<256;i++)
Source[i][j]=ColorTable[i][j];
for(j=0;j<light;j++)
{delay(time);
for(i=0;i<256;i++)
{
outp(0x3c8,i);
for(k=0;k<3;k++)
{if(Source[i][k]>0)Source[i][k]--;
outp(0x3c9,Source[i][k]);
}
}
}
}
void LightUp(unsigned char light,unsigned char time)
{ register int i,j,k;
unsigned char Source[256][3];
if(light>63||light<0)light=63;
for(i=0;i<3;i++)
for(j=0;j<256;j++)
Source[j][i]=0;
for(k=0;k<light;k++)
{delay(time);
for(j=0;j<256;j++)
{
outp(0x3c8,j);
for(i=0;i<3;i++)
{if(Source[j][i]<ColorTable[j][i])
Source[j][i]++;
outp(0x3c9,Source[j][i]);
}
}
}
}
int random(int x)
{ unsigned long t,time;
_disable();
outp(0x43,0); t=inp(0x40);
t+=(inp(0x40)<<8); t=0xffff^t;
_enable(); // (not t) + (clock()<<16)
time=(clock()<<16)+t;
return (time%x);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -