DOS真彩色模式下真彩色图像显示技术_第2页 fread(
DOSÕæ?ÊÉ?Ä?Ê?ÏÂÕæ?ÊÉ?Í?ÏñÏÔÊ???Êõ_µÚ2Ò? fread( (char *) &header,
1, sizeof(PCXHEAD), fp);
width = header.bytes-perline; height = header.ymax - header.ymin + 1; printf("Image information: Width=%d, Height=%d",width,h
eight);
if ((header.bits-perpixel==8)&&(header.color-planes==3)
) {
printf("
Type : 24bits RGB true colors"); printf("1...Emulating display 16M true color image with
64K high color");
printf("2...Display of 16M true color image");
printf("Press select 1 or 2 : "); if ((c=getch())=='1') {
highcolor();
SetVesaMode(0x03);
}
else if (c=='2') {
truecolor();
SetVesaMode(0x03);
}
else {
printf("This is not high-color & true-color image !")
;
exit(1);
}
}
fclose(fp);
return 0;
}
// ÉèÖÃVESA BIOSÀ?Õ?Ä?Ê?º?Êý void SetVesaMode(unsigned int mode) { union REGS r;
unsigned int setmode=1;
r.x.ax=0x4f02;
r.x.bx=mode;
int86(0x10,&r,&r);
if (r.x.ax!=0x4f)
setmode=0;
else VesaInfo(mode);
Curpage=0xffff;
return(setmode);
}
// ?µ?ØVESA?à?ÌÐÅÏ?º?Êý
void VesaInfo(unsigned int mode) { union REGS r;
struct SREGS sr;
r.x.cx=mode;
r.x.ax=0x4f01;
sr.es =FP-SEG(&modeinfo); r.x.di=FP-OFF(&modeinfo); int86x(0x10,&r,&r,&sr); Wingran =modeinfo.wingran; Line-bytes=modeinfo.bytesperscanline;
Y-res
=modeinfo.yres;
}
// ?ÆËã É?ÃèÏßÊ?Ö?º?Êý
void map(void)
{ register int i,j;
for(i=0; i>3;
green= *pic++ >>2;
blue = *pic++ >>3;
red=red<<11; green=green<<5; *word++ =red|green|blue; }
word=wordptr;
for (j=0;j<2*(m-1);j+=2) { segmet=addr+j;
page=segmet>>16;
if (segmet <= 65535L) { poke(0xa000, addr+j, *word++ );
}
else {
Selectpage(page);
poke(0xa000, addr+j, *word++ );
}
}
}
getch();
free(wordptr); free(pic); free(pic) ; free(pic); }
// 24Î?PCXÕæ?ÊÉ?Í?ÏñÈ?Ï?ÏÔÊ?º?Êý
void truecolor(void) { register int i, j; unsigned char *pic, *p0,*p1,*p2;
unsigned char page, picdata; int n,m,k,cnt,total; unsigned long segmet; SetVesaMode(0x112);
map();
Selectpage(0);
n=min(480,height);
m=min(640,width);
for (k=0; k<3; k++)
pic=(unsigned char *)malloc(m);
p0=pic; p1=pic; p2=pic; fseek(fp,0x80L,SEEK-SET); for(i=0; i>16;
if (segmet <= 65535L) {
for (k=0; k<3; k++)
pokeb(0xa000, addr+j+k, *pic++); }
else {
Selectpage(page);
for (k=0; k<3; k++)
pokeb(0xa000, addr+j+k, *pic++); }
}
}
getch();
for (k=0; k<3; k++) free(pic); }
?Î?? ÎÄÏ×
1.ÕÅÒ???.Super VGAÓëVESA?à?ÌÖ?ÄÏ.????:º?Ñó?ö?æÉç,1993.8
2.ÕÅÒæÃ?.Î??úÍ?ÏñÎÄ?þ?ñÊ??óÈ?(Ðøƪ).????:Ñ?Ô??ö?æÉç,1994.7
[Ê×Ò?]