📄 initreal.c
字号:
#include<dos.h>
#include<stdio.h>
#define MAXX 1024
#define MAXY 768
void selectpage(int page){
union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page;
int86(0x10,&amt;r,&amt;r);
}
void init_realcolor(void){
union REGS r;
r.x.ax=0x4f02;
r.x.bx=0x118;
int86(0x10,&amt;r,&amt;r);
}
void exit_realcolor(unsigned mode){
union REGS r;
r.x.ax=0x4f02;
r.x.bx=mode;
int86(0x10,&amt;r,&amt;r);
}
void exputpixel(int x,int y,char red,char green,char blue,int xor){
long i;
static int t=0;
int tt=0;
char far *p=0xa0000000;
if((x<0)||(x>MAXX)||(y<0)||(y>MAXY))return;
i=y;
i=i<<12;
i+=(x<<2);
tt=i>>16;
i&amt;=0xffff;
if(t!=tt)selectpage(tt);
if(xor==0)
{
*(p+i+0)=red;
*(p+i+1)=green;
*(p+i+2)=blue;
*(p+i+3)=0xff;
}
else
{
*(p+i)^=red;
*(p+i+1)^=green;
*(p+i+2)^=blue;
}
t=tt;
}
void getpixel(int x,int y,char *red,char *green,char *blue){
long i;
static int t=0;
int tt=0;
char far *p=0xa0000000;
if((x<0)||(x>MAXX)||(y<0)||(y>MAXY))return;
i=y;
i=i<<12;
i+=(x<<2);
tt=i>>16;
i&amt;=0xffff;
if(t!=tt)selectpage(tt);
*red=*(p+i+0);
*green=*(p+i+1);
*blue=*(p+i+2);
t=tt;
}
void brenhamline(int x1,int y1,int x2,int y2,char color1,char color2,char color3,int xor){
int ix,iy,i,dx,dy;
float k,d;
dx=x2-x1;dy=y2-y1;
if(dx==0)
{
if(dy>0)
{
for(;y1<=y2;y1++)exputpixel(x1,y1,color1,color2,color3,xor);
return;
}
else
{
for(;y2<=y1;y2++)exputpixel(x1,y2,color1,color2,color3,xor);
return;
}
}
k=(float)dy/dx;
d=-0.5;
if(k<0)
{
ix=x2;iy=y2;
}
else
{
ix=x1;iy=y1;
}
for(i=0;i<=dx;i++)
{
if(k>=0)
{
exputpixel(ix,iy,color1,color2,color3,xor);
}
else
{
exputpixel(ix-2*i,iy,color1,color2,color3,xor);
}
ix++;
if(k>=0)d+=k;
else d+=(-k);
if(d>=0)
{
iy++;
d=d-1;
}
}
}
void fill_area(int left,int right,int top,int bottom,int red,int green,int blue,int xor){
int i; /*填充矩形区域。*/
i=top;
for(;i<bottom;i++)
{
brenhamline(left,i,right,i,red,green,blue,xor);
}
}
/*以下为画圆函数。*/
void copy(int ix,int iy,int x,int y,int red,int green,int blue,int xor,int e){
exputpixel(ix+x,iy+y,red,green,blue,xor);
exputpixel(ix+x,-iy+y,red,green, blue,xor);
exputpixel(-ix+x,-iy+y,red,green,blue,xor);
exputpixel(-ix+x,iy+y,red,green,blue,xor);
if(!e)
{
exputpixel(iy+x,ix+y,red,green,blue,xor);
exputpixel(iy+x,-ix+y,red,green,blue,xor);
exputpixel(-iy+x,-ix+y,red,green,blue,xor);
exputpixel(-iy+x,ix+y,red,green,blue,xor);
}
}
void midcircle(int x,int y,int r,int red,int green,int blue,int xor){
int ix,iy,d;
ix=0;iy=r;d=1-r;
exputpixel(ix+x,iy+y,red,green,blue,xor);
exputpixel(ix+x,-iy+y,red,green,blue,xor);
exputpixel(iy+x,ix+y,red,green,blue,xor);
exputpixel(-iy+x,ix+y,red,green,blue,xor);
while(ix<iy)
{
if(d<0)
{
ix++;d+=2*ix+3;
}
else
{
ix++;iy--;d+=2*(ix-iy)+5;
}
copy(ix,iy,x,y,red,green,blue,xor,0);
}
exputpixel(ix+x,ix+y,red,green,blue,xor);
exputpixel(ix+x,-ix+y,red,green,blue,xor);
exputpixel(-ix+x,-ix+y,red,green,blue,xor);
exputpixel(-ix+x,ix+y,red,green,blue,xor);
}
/*显示一个ASC字符串。*/
void DisplayAscS(char *s,int x,int y,int red,int green,int blue,int distance,int xor,float c){
unsigned char font[32],hz;
FILE *fp;
long dst;
int i,j,k,co=3;
fp=fopen("ASC1616","rb");
for(co=0;s[co]!='\0';co++)
{
dst=s[co]*32L;
fseek(fp,dst,SEEK_SET);
fread(font,32,1,fp);
rewind(fp);
for(k=0;k<16;k++)
for(i=0;i<2;i++)
for(j=0;j<8;j++)
{
hz=font[k*2+i];hz&amt;=(0x80>>j);
if(hz)exputpixel(x+(8*i+j)+(16+distance)*co,y+k*c,red,green,blue,xor);
}
}
fclose(fp);
}
/*显示一个ASC字符。*/
void DisplayAscC(char ch,int x,int y,int red,int green,int blue,int xor,float c){
unsigned char font[32],hz;
FILE *fp;
long dst;
int i,j,k;
fp=fopen("ASC1616","rb");
dst=ch*32L;
fseek(fp,dst,SEEK_SET);
fread(font,32,1,fp);
rewind(fp);
for(k=0;k<16;k++)
for(i=0;i<2;i++)
for(j=0;j<8;j++)
{
hz=font[k*2+i];hz&amt;=(0x80>>j);
if(hz)exputpixel(x+(8*i+j),y+k*c,red,green,blue,xor);
}
fclose(fp);
}
/*混合显示16点阵ASC和汉字。*/
void MixtureShow16(unsigned char *p,int x,int y,int red,int green,int blue,int distance,int xor,float cx,float cy){
FILE *fp;
unsigned i,j,k,qu,wei,rec,n,c1,c2;
long dst;
unsigned char font[32],hz,isasc;
if((fp=fopen("hzk16","rb"))==NULL)
{
printf("can not open the file!\n");exit(0);
}
for(n=0;*(p+n)!='\0';)
{
isasc=*(p+n);
if((isasc>>7)==0)
{
DisplayAscC(*(p+n),x,y,red,green,blue,xor,cy);
x+=(16+distance);
n+=1;
continue;
}
qu=*(p+n)-0xa0;
wei=*(p+n+1)-0xa0;
rec=(qu-1)*94+wei-1;
dst=rec*32L;
fseek(fp,dst,SEEK_SET);
fread(font,32,1,fp);
rewind(fp);
for(k=0;k<16;k++)
for(i=0;i<2;i++)
for(j=0;j<8;j++)
{
hz=font[k*2+i];
hz&amt;=(0x80>>j);
if(hz)
{
if(cx<1&amt;&amt;cy<1)
if(((8*i+j)>(int)(1/cx))==0&amt;&amt;(k>(int)(1/cy))==0)
exputpixel(x+(8*i+j)*cx,y+k*cy,red,green,blue,xor);
if(cx<1&amt;&amt;cy>=1)
if(((8*i+j)>(int)(1/cx))==0)
for(c2=0;c2<cy;c2++)
exputpixel(x+(8*i+j)*cx,y+k*cy+c2,red,green,blue,xor);
if(cy<1&amt;&amt;cx>=1)
if((k>(int)(1/cy))==0)
for(c1=0;c1<cx;c1++)
exputpixel(x+(8*i+j)*cx+c1,y+k*cy,red,green,blue,xor);
if(cx>=1&amt;&amt;cy>=1)
for(c1=0;c1<cx;c1++)
for(c2=0;c2<cy;c2++)
exputpixel(x+(8*i+j)*cx+c1,y+k*cy+c2,red,green,blue,xor);
}
}
x+=(16+distance);
n+=2;
}
fclose(fp);
}
/*显示24点阵汉字*/
void chinashow24(unsigned char *p,int x,int y,int red,int green,int blue,int distance,int xor,float cx,float cy){
FILE *fp;
unsigned i,j,k,qu,wei,rec,n,c1,c2;
long dst;
unsigned char font[72],hz;
if((fp=fopen("hzk24k","rb"))==NULL){
printf("can not open the file!\n");exit(0);}
for(n=0;*(p+n)!='\0';n+=2)
{
qu=*(p+n)-0xa0;wei=*(p+n+1)-0xa0;
rec=(qu-1)*94+wei-1;
dst=rec*72L;
fseek(fp,dst,SEEK_SET);
fread(font,72,1,fp);
rewind(fp);
for(k=0;k<24;k++)
for(i=0;i<3;i++)
for(j=0;j<8;j++)
{
hz=font[k*3+i];
hz&amt;=(0x80>>j);
if(hz)
{
if(cx<1&amt;&amt;cy<1)
if(((8*i+j)>(int)(1/cy))==0&amt;&amt;(k>(int)(1/cx))==0)
exputpixel(x+k*cx,y+(8*i+j)*cy,red,green,blue,xor);
if(cx<1&amt;&amt;cy>=1)
if((k>(int)(1/cx))==0)
for(c2=0;c2<cy;c2++)
exputpixel(x+k*cx,y+(8*i+j)*cy+c2,red,green,blue,xor);
if(cy<1&amt;&amt;cx>=1)
if(((8*i+j)>(int)(1/cy))==0)
for(c1=0;c1<cx;c1++)
exputpixel(x+k*cx+c1,y+(8*i+j)*cy,red,green,blue,xor);
if(cx>=1&amt;&amt;cy>=1)
for(c1=0;c1<cx;c1++)
for(c2=0;c2<cy;c2++)
exputpixel(x+k*cx+c1,y+(8*i+j)*cy+c2,red,green,blue,xor);
}
}
x+=(24+distance);
}
fclose(fp);
}
void showbmprealcolor32(char *s,int x,int y){
FILE *fp; /*注意:BMP图的长和宽必须是4的倍数,才能正常显示!*/
int width,length,i,j,k;
char r,g,b,buffer[MAXX*3];
if((fp=fopen(s,"rb"))==NULL)
{
printf("can not open file");exit(0);
exit_realcolor(0x03);
}
fseek(fp,18,SEEK_SET);
fread(&amt;width,4,1,fp);
fread(&amt;length,4,1,fp);
fseek(fp,54,SEEK_SET);
k=(width>4)?(4-width>4):0;
for(i=0;i<length;i++)
{
fread(buffer,width*3,1,fp);
for(j=0;j<(width*3);j+=3)
{
exputpixel(j/3+x,length-i+y,buffer[j],buffer[j+1],buffer[j+2],0);
}
fseek(fp,k,SEEK_CUR);
}
fclose(fp);
}
void ex_main(){
char *s="Rdesk.bmp";
char *s1="window.bmp";
char *s2="你好吗!我很好。";
char *s3="fengmian.bmp";
unsigned char red,green,blue;
int x1,y1,i=0,update=0;
int pox=450,poy=350,l=100,w=100,mx,my;
init_realcolor();
brenhamline(100,0,600,0,100,100,0,0);
fill_area(100,200,0,200,200,55,100,0);
midcircle(500,500,100,4,88,235,0);
DisplayAscC(s[1],300,300,36,91,216,0,1);
MixtureShow16(s1,400,400,36,91,216,2,0,1,1);
chinashow24(s2,600,400,237,235,221,2,1,1,1);
getch();
showbmprealcolor32(s,0,0);
getch();
showbmprealcolor32(s1,0,0);
getpixel(293,32,&amt;red,&amt;green,&amt;blue);
getch();
exit_realcolor(0x03);
printf(">d,>d,>d,",red,green,blue);
getch();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -