/*--------------------256bmp.c----------------------*/
#include "dos.h"
#include "stdio.h"
#include "process.h"
#include "bios.h"
#include "math.h"
unsigned char set_SVGA_mode(int vmode) /*设置SVGA屏幕模式*/
{
union REGS r;
r.x.ax=0x4f02;
r.x.bx=vmode;
int86(0x10,&r,&r);
return(r.h.ah);
}
unsigned int get_SVGA_mode() /*获取当前SVGA屏幕模式*/
{
union REGS r;
r.x.ax=0x4f03;
int86(0x10,&r,&r);
return(r.x.bx);
}
void put_bmp(int x,int y,char *name)
{
char buffer[640],page_new=0,page_old=0;
int i,j,k,n,r,g,b;
long position,width,length;
FILE *fp;
strcpy(buffer,name);
fp=fopen(buffer,"rb");
fseek(fp,28,SEEK_SET);
fread(&i,2,1,fp);
fseek(fp,18,SEEK_SET);
fread(&width,4,1,fp);/*得到图片的长度和宽度*/
fread(&length,4,1,fp);
fseek(fp,54,SEEK_SET);
for(i=0;i<256;i++) /*按照该图片的DAC色表设置色彩寄存器*/
{
b=fgetc(fp);
g=fgetc(fp);
r=fgetc(fp); /*获取R、G、B分量*/
outportb(968u,i);
outportb(969u,r>>2);
outportb(969u,g>>2);
outportb(969u,b>>2);
fgetc(fp);
}
k=(width%4)?(4-width%4):0; /*宽度修正值*/
for(j=length-1;j>=0;j--)
{
fread(buffer,width,1,fp);
for(i=0,n=0;i<width;i++,n++)
{
position=(j+y)*640l+i+x; /*计算要显示点的显存位置*/
page_new=position/65536l; /*计算显示页*/
if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/
{
union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page_new; /*选择页面*/
int86(0x10,&r,&r);
page_old=page_new;
}
pokeb(0xa000,position%65536l,buffer[n]); /*写到显存位置*/
}
fseek(fp,k,SEEK_CUR); /*每行绘制完后修正宽度*/
}
fclose(fp);
}
void get_image(int x1,int y1,int x2,int y2,char *buffer)
{
int i,j,page_old=0,page_new=0;
FILE *fp;
char far *video=(char far *)0xA0000000L;
fp=fopen(buffer,"wb");
for(i=y1;i<=y2;i++)
for(j=x1;j<=x2;j++)
{
page_new=(640*i+j)/65536l; /*计算显示页*/
if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/
{
union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page_new; /*选择页面*/
int86(0x10,&r,&r);
page_old=page_new;
}
fwrite(video+(640*i+j)%65536,1,1,fp);
}
fclose(fp);
}
void put_image(int x1,int y1,int x2,int y2,char *buffer)
{
int i,j,page_old=0,page_new=0;
FILE *fp;
char far *video=(char far *)0xA0000000L;
fp=fopen(buffer,"rb");
fseek(fp,0,SEEK_SET);
for(i=y1;i<=y2;i++)
for(j=x1;j<=x2;j++)
{
page_new=(640*i+j)/65536l; /*计算显示页*/
if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/
{
union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page_new; /*选择页面*/
int86(0x10,&r,&r);
page_old=page_new;
}
fread(video+(640*i+j)%65536,1,1,fp);
}
fclose(fp);
}
main()
{
int savemode;
savemode=get_SVGA_mode(); /*先保存原来的屏幕模式*/
set_SVGA_mode(0x101); /*硬件无关性初始化屏幕为640*480 256色模式*/
put_bmp(0,0,"image.bmp");
getch();
set_SVGA_mode(savemode); /*恢复屏幕*/
}