|
#include "dos.h"
#include "fcntl.h"
#include "io.h"
#define TEXT_BIG_CURSOR 0
#define TEXT_NORMAL_CURSOR 7
unsigned char set_SVGA_mode(int vmode)
{union REGS r;
r.x.ax=0x4f02;
r.x.bx=vmode;
int86(0x10,&r,&r);
return(r.h.ah);
}
void hide_text_cursor(void)
{union REGS r;
r.h.ah=1;
r.h.ch=32;
int86(0x10,&r,&r);
}
selectpage(register char page) /*换页函数*/
{union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page; /*选择页面*/
int86(0x10,&r,&r);
}
void show_text_cursor(char size)
/*(10-17):自定义文本光标)*/
{union REGS r;
r.h.ah=1;
r.h.cl=size;
r.h.ch=7;
int86(0x10,&r,&r);
}
unsigned int get_SVGA_mode()
{union REGS r;
r.x.ax=0x4f03;
int86(0x10,&r,&r);
return(r.x.bx);
}
unsigned int Vmode=0;
void init16M() /*屏幕初始化*/
{Vmode=get_SVGA_mode();
hide_text_cursor();
if(set_SVGA_mode(0x115))
{printf("\nSorry, Your graphics driver does not supplied.\n");
show_text_cursor(TEXT_NORMAL_CURSOR);
exit(0);
}
}
void close16M() /*恢复文本模式*/
{if(Vmode!=0)
{set_SVGA_mode(Vmode);
show_text_cursor(TEXT_NORMAL_CURSOR);
}
}
typedef struct /*16Mrgb像素类型*/
{unsigned char b;
unsigned char g;
unsigned char r;
}rgb16M;
unsigned char nowpage,lastpage=8;
void writevideo(long position,char value)
{nowpage=position/65536;
if(nowpage!=lastpage)
{selectpage(nowpage);
lastpage=nowpage;
}
pokeb(0xa000,position%65536,value);
}
void putpoint16M(int x,int y,rgb16M color)
/*16M真彩色 800*600写点函数*/
{register long temp=3200l*y+4l*x;
writevideo(temp,color.b);
writevideo(temp+1,color.g);
writevideo(temp+2,color.r);
}
rgb16M *malloc();
#include "dir.h"
#include "dos.h"
char dir_input(char *fileformat,char *selectfile)
/*列表选择函数,返回0为选择了不存在的文件*/
{struct ffblk *ff,temp;
ff=&temp;
clrscr();
puts("Select a file from the list:");
if(findfirst(fileformat,ff,FA_ARCH|FA_HIDDEN))exit(0);
printf("\n%-20s",ff->ff_name);
while(!findnext(ff))
{printf("%-20s",ff->ff_name);
if(wherey()==25)getch();
}
printf("\n\nInput a filename:");
gets(selectfile);
return(findfirst(fileformat,ff,FA_ARCH));
}
main()
{register int wl,ll,i,j,x0,y0,fp;int temp;
register char fix;char filename[13];
register rgb16M *buffer;
dir_input("*.bmp",filename);
init16M();
if((fp=open(filename,O_RDONLY|O_BINARY))==-1){close16M();exit(0);}
lseek(fp,18,SEEK_SET);
read(fp,&temp,4);wl=temp;
read(fp,&temp,4);ll=temp;
fix=(wl%4)?(4-wl%4):0;
x0=(800-wl)/2;y0=(600-ll)/2;
lseek(fp,54,SEEK_SET);
buffer=malloc(wl*sizeof(rgb16M));
for(j=ll-1;j>=0;j--)
{read(fp,buffer,wl*3);
lseek(fp,fix,SEEK_CUR);
for(i=0;i<wl;i++)
putpoint16M(x0+i,y0+j,buffer);
}
getch();
close(fp);
close16M();
} |
|