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

📄 bkpic.c

📁 DOS下SVGA图像编程实例,支持汉字。
💻 C
📖 第 1 页 / 共 2 页
字号:
void PutPoint(int x,int y,unsigned long color)
{
     long bytesperline=1024*4;
     int  bank,curbank;
     char far *scr;
     unsigned char far *ScreenPtr = (unsigned char far *)0xA0000000;
     long addr;

     addr=(long)y*bytesperline+x*4;
     scr=ScreenPtr+(unsigned)addr;

     if((bank=addr>>16)!=curbank)
          selectpage(curbank=bank);

     *scr++=color;
     *scr++=color>>8;
     *scr=color>>16;
}


unsigned long getpixel(int x,int y)
{
     long bytesperline=1024*4;
     int bank;
     int curbank;
     unsigned char far *scr;
     long addr;
     unsigned long color;
     unsigned char far *ScreenPtr = (unsigned char far *)0xA0000000;
     addr=(long)(y*bytesperline+x*4);
     scr=ScreenPtr+(unsigned)addr;

     if((bank=addr>>16)!=curbank)
          selectpage(curbank=bank);

     color=*scr++;   //R
     color+=(unsigned)*scr++<<8;   //G
     color+=(unsigned long)*scr<<16;  //B

     return(color);
}



void getline(int x,int y)
{
     int i,n;
     int x_min=24,x_max=823,y_min=100,y_max=699;

     for(i=x_min,n=0;i<=x_max;i++,n++)
     {
          colorx[n]=getpixel(i,y);
     }

     for(i=y_min,n=0;i<=y_max;i++,n++)
     {
          colory[n]=getpixel(x,i);
     }
}



void putline(int x,int y,unsigned long color)
{
     long oldcolor;
     long VRAMStartY=0,VRAMStartX=0;
     long bytesperline=1024*4;
     int x_min=24,x_max=823,y_min=100,y_max=699;
     int curbank,bank;
     int i;
     char far *scr;
     unsigned char far *ScreenPtr = (unsigned char far *)0xA0000000;
     long addr[1000];

     for(i=x_min;i<=x_max;i++)
     {
          addr[i]=(long)(y+VRAMStartY)*bytesperline+(i+VRAMStartX)*4;
          scr=ScreenPtr+(unsigned)addr[i];

          if((bank=addr[i]>>16)!=curbank)
                selectpage(curbank=bank);

          *scr++=color;
          *scr++=color>>8;
          *scr=color>>16;
     }

     for(i=y_min;i<=y_max;i++)
     {
          addr[i]=(long)(i+VRAMStartY)*bytesperline+(x+VRAMStartX)*4;
          scr=ScreenPtr+(unsigned)addr[i];

          if((bank=addr[i]>>16)!=curbank)
                selectpage(curbank=bank);

          *scr++=color;
          *scr++=color>>8;
          *scr=color>>16;
     }
}



void hideline(int x,int y)
{
     long VRAMStartY=0,VRAMStartX=0;
     long bytesperline=1024*4;
     int x_min=24,x_max=823,y_min=100,y_max=699;
     int curbank,bank;
     int i,n;
     char far *scr;
     unsigned char far *ScreenPtr = (unsigned char far *)0xA0000000;
     long addr[1000];

     for(i=x_min,n=0;i<=x_max;i++,n++)
     {
          addr[i]=(long)(y+VRAMStartY)*bytesperline+(i+VRAMStartX)*4;
          scr=ScreenPtr+(unsigned)addr[i];

          if((bank=addr[i]>>16)!=curbank)
                selectpage(curbank=bank);

          *scr++=colorx[n];               /*向显存中写入颜色值*/
          *scr++=colorx[n]>>8;
          *scr=colorx[n]>>16;
     }

     for(i=y_min,n=0;i<=y_max;i++,n++)
     {
          addr[i]=(long)(i+VRAMStartY)*bytesperline+(x+VRAMStartX)*4;
          scr=ScreenPtr+(unsigned)addr[i];

          if((bank=addr[i]>>16)!=curbank)
                selectpage(curbank=bank);

          *scr++=colory[n];
          *scr++=colory[n]>>8;
          *scr=colory[n]>>16;
     }
}



//x position, y position, character height, character width, character space, colour, string
void hanzi16(int xp,int yp,int charh,int charw,int charsp,unsigned long clo,char *sl)
{
     int x, y, ascii, flag;
     char *s=sl, cha1;
     FILE *fp;
     char buffen[16], *p;    //16Byte buffen用来储存一个英文字符
     char buffer[32];    //32Byte,buffer用来存储一个汉字
     register m,n,i,j,k;
     unsigned char qh,wh;
     unsigned long offset;

     if ((fp=fopen("d:\\svga\\hzk16","rb"))==NULL)/* 打开汉字库,该字库可以在ucdos中找到  */
          {printf("Can't open haz16,Please add it");getch();exit(0);}

     x=xp; y=yp; //显示位置设置
     flag=1;     //标志是否是第一个字,若是flag=1

     while(*s!=0)
     {
          cha1=*s;

          if(0x80&(int)cha1)
          {
                qh=*(s)-0xa0;  //汉字区位码
                wh=*(s+1)-0xa0;
                offset=(94*(qh-1)+(wh-1))*32L; //计算该汉字在字库中偏移量 , L表示长整型(偏移量可能比较大)
                fseek(fp,offset,SEEK_SET);
                fread(buffer,32,1,fp); //取出汉字32字节的点阵字模存入buffer中(一个汉字)

                x+=charsp;
                if(flag==1)
                	 x-=charsp;
                for(i=0;i<16;i++)//i行,将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字
                     for(n=0;n<charh;n++)
                          for(j=0;j<2;j++)//i行的第j个字节
                                for(k=0;k<8;k++)//每个字节中的第k位
                                	 for(m=0;m<charw;m++)
                                          if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
                                                PutPoint(x+8*j*charw+k*charw+m,y+i*charh+n,clo);
                						else
                                                PutPoint(x+8*j*charw+k*charw+m,y+i*charh+n,0X000000);

                s+=2;//因为一个汉字内码占用两个字节,所以s必须加2
            	flag=0;
          }
          else
          {
                ascii=(int)cha1;
                p=Asc_Font + (ascii-0x20)*16;
                memcpy(buffen,p,16);
                x+=(charsp/2);
                if(flag==1)
                     x-=(charsp/2);
                for(i=0;i<16;i++)
                     for(n=0;n<charh;n++)
                          for(k=0;k<8;k++)//每个字节中的第k位
                            	for(m=0;m<charw;m++)
                                     if (((buffen[i]>>(7-k))&0x1)!=NULL)
                                          PutPoint(x+8*charw+k*charw+m,y+i*charh+n,clo);
            					else
                                          PutPoint(x+8*charw+k*charw+m,y+i*charh+n,0X000000);

            	s+=1;
            	flag=0;
          }
     }
}


void hanzi24(int x,int y,char *s,unsigned long colour)
{
     FILE *fp;
     char buffer[24][3];
     register i,j,k;
     unsigned char qh,wh;
     unsigned long location;

     if((fp=fopen("d:\\svga\\hzk24","rb"))==NULL)
     {printf("can't open hzk24");getch();exit(0);}

     while(*s)
     {
          qh=*s-0xa0;
          wh=*(s+1)-0xa0;
          location=(94*(qh-1)+(wh-1))*72L;

          fseek(fp,location,SEEK_SET);
          fread(buffer,72,1,fp);

          for(i=0;i<24;i++)
                for(j=0;j<24;j++)
                     if(buffer[j][i/8]&(0x80>>i%8))
                          PutPoint(x+i,y+j,colour);
          s+=2;
          x+=24;
     }
     fclose(fp);
}


void cleararea(int x0, int y0, int width, int height, unsigned long colour)
{
     int i,j;
     for(j=0;j<height;j++)
          for(i=0;i<width;i++)
                PutPoint(x0+i,y0+j,colour);
}


void DrawLine (int x0, int y0, int length, int flag, unsigned long color)//flag=0, horizontal line; flag=1, vertical line
{
     int i;

     if(flag==0)
     {
          for (i=x0;i<=(x0+length);i++)
                PutPoint(i, y0, color);
     }
     else
     {
          for (i=y0;i<=(y0+length);i++)
                PutPoint(x0, i, color);
     }
}


void rectangle (int x0, int y0, int x1, int y1, unsigned long color)
{
     DrawLine(x0,y0,x1-x0,0,color);
     DrawLine(x0,y1,x1-x0,0,color);
     DrawLine(x0,y0,y1-y0,1,color);
     DrawLine(x1,y0,y1-y0,1,color);
}


void MountMouse(void)
{
     _AX=0x00;        //功能00H*/
     geninterrupt(0x33);//0x33:鼠标中断类型*/
}



void UnmountMouse(void)
{
     _AX=0x02;        /*功能02H*/
     geninterrupt(0x33);    /*0x33:鼠标中断类型*/
     return ;
}




int GetMouseSta(void)      //判断鼠标按键状态
{
     int MouseMSG=0;
     _AX=0x03;
     geninterrupt(0x33);

     MouseX=_CX;         //将鼠标水平方向位置存放到MouseX
     MouseY=_DX;         //将鼠标垂直方向位置存放到MouseY

     if((_BX&1) && !(_BX&2))         //鼠标左键被按下同时右键没有按下,左键
          MouseMSG=1;

     if((_BX&2) && !(_BX&1))         //鼠标右键被按下同时左键没有按下,右键
          MouseMSG=2;

    if(_BX&1 && _BX&2)              //鼠标左键和右键同时被按下
        MouseMSG=0;
    
    return MouseMSG;
}


void SetMouseXY(int x, int y)
{
    _AX=0x04;
    _CX=x;
    _DX=y;
    geninterrupt(0x33);

    return;
}


//设置鼠标水平边界
void SetMouseBound(int mouseMinX, int mouseMaxX, int mouseMinY, int mouseMaxY)
{
    _AX=0x07;
    _CX=mouseMinX;
    _DX=mouseMaxX;
    geninterrupt(0x33);
    
    _AX=0x08;
    _CX=mouseMinY;
    _DX=mouseMaxY;
    geninterrupt(0x33);
    
    return;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -