⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vesa.h

📁 这个版本修正了已知的Bug,同时添加了部分函数
💻 H
📖 第 1 页 / 共 2 页
字号:
     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 + -