www.pudn.com > jpeg1.zip > DIALOG.C
/* ÑÓʱ */
void mdelay(unsigned int delta)
{ unsigned int time;
time=peek(0x40,0x6c);
while((peek(0x40,0x6c)-time)<=delta);
}
/* ÕñÁå */
void bell(int f)
{ sound(f);
mdelay(1);
nosound();
}
void FailSnd()
{ int i;
for(i=800;i>795;i--) {
sound(i); delay(150); }
nosound();
}
/* ´íÎóÌáʾ */
void ErrorProc(char *ErrorMsg)
{ bell(800);
Hide(); mbar(0,DIMY-29,640,DIMY,252); Show();
mputs(25,36,ErrorMsg,252,251);
mdelay(36);
Hide(); mbar(0,DIMY-29,640,DIMY,252); Show();
}
/* ½Ó¹Ü¼üÅÌÖÐ¶Ï */
void interrupt int_9()
{ unsigned char byte,key;
key=inportb(0x60);
if(key==46||key==224) {
if((peekb(0x40,0x17)&4)||(peekb(0x40,0x96)&4)) {
byte=peekb(0x40,0x17);
pokeb(0x40,0x17,byte&0xfb);
byte=peekb(0x40,0x96);
pokeb(0x40,0x96,byte&0xfb);
key=inportb(0x61);
key|=0x80; outportb(0x61,key);
key&=0x7f; outportb(0x61,key);
outportb(0x20,0x20);
}
else (*old_int_9)();
}
else (*old_int_9)();
}
/* »ñÈ¡ÊäÈë×Ö·û´® */
int mscanf(char *cmd)
{ int c,count;
count=2; cur=16; s=cmd;
Hide(); mline(8*cur+5,579,8*cur+2,592,255); Show();
while(1) {
while(bioskey(1)==0) {
if(Right_Pressed()) {
while(Right_Pressed());
return -1; }
}
if(count<=1) count=2;
if(cur<16) cur=16;
c=bioskey(0);
if((c>>8)==0) c=0xffff;
else c&=0xff;
if((c==0x0c)||(c==0x0d)) { *s='\0'; return 1; }
if(c==0x1b) return -1;
if((!isalnum(c))&&(c!=8)&&(c!='.')&&(c!='\\')&&(c!=':')
&&(c!='_')&&(c!='*')&&(c!='?')) bell(300);
else {
if(c==8) {
if(count>=2) {
in.h.dl=--cur; in.x.cx=2;
c=0x20; count--; s--;
}
}
else {
if(count<=30) {
in.h.dl=cur++; in.x.cx=1;
*s++=c; count++; }
else bell(300);
}
if((count>=2)&&(count<=30)) {
Hide();
in.h.ah=2; in.h.bh=0;
in.h.dh=36;
int86(0x10,&in,&out);
in.h.ah=0x09; in.h.al=c;
in.h.bl=255; in.h.bh=252;
int86(0x10,&in,&out);
mline(8*cur+5,579,8*cur+2,592,255);
Show();
}
}
}
}
/* ÎļþÀ©Õ¹ÃûÌæ»» */
int get_base_name(char *file_in,char *file_out,char *ext)
{ int i=0;
strcpy(file_out,file_in);
if(strrchr(file_out,'.')==NULL) strcat(file_out,ext);
else {
while(*(file_out+i)!='.') i++;
file_out[i]='\x0';
strcat(file_out,ext); }
}
/* EMS ¹¦ÄÜ */
int EmmClose(unsigned int handle)
{ in.h.ah=0x45;
in.x.dx=handle;
int86(EMM,&in,&in);
return(in.h.ah==0);
}
int EmmVer()
{ in.h.ah=0x46;
int86(EMM,&in,&in);
return(in.h.al);
}
int EmmNum(int *total,int *NotUse)
{ in.h.ah=0x42;
int86(EMM,&in,&in);
if(in.h.ah==0) {
*total=in.x.dx;
*NotUse=in.x.bx;
}
}
int EmmGet(int page,char far *str,int offset,int len)
{ char far *ptr;
ptr=EMMbase+page*0x4000+offset;
memcpy(str,ptr,len);
}
int EmmMove(int page,unsigned int file)
{ char far *ptr;
ptr=EMMbase+page*0x4000;
read(file,(void *)ptr,Block);
}
int EmmMap(int page,int phys,unsigned int handle)
{ in.h.ah=0x44;
in.h.al=page;
in.x.bx=phys;
in.x.dx=handle;
int86(EMM,&in,&in);
return(in.h.ah==0);
}
int EmmAlloc(int n)
{ in.h.ah=0x43;
in.x.bx=n;
int86(EMM,&in,&in);
if(in.h.ah!=0) return(0xffff);
else return(in.x.dx);
}
int EmmOk()
{ in.h.ah=0x40;
int86(EMM,&in,&in);
if(in.h.ah!=0) return(FALSE);
in.h.ah=0x41;
int86(EMM,&in,&in);
if(in.h.ah!=0) return(FALSE);
EMMbase=MK_FP(in.x.bx,0);
return(TRUE);
}
int EmmTest() /* EMS Çý¶¯¼ì²â */
{ int result;
unsigned int handle;
in.x.ax=0x3d00;
in.x.dx=(int)"EMMXXXX0";
sreg.ds=_DS;
intdosx(&in,&in,&sreg);
handle=in.x.ax;
result=(in.x.cflag==0);
if(result){
in.h.ah=0x3e;
in.x.bx=handle;
intdos(&in,&in);
}
return(result);
}
/* Õæ²ÊɫͼÏóÑÕɫѡÔñ */
/* Õæ²ÊÉ« ==> COLOR_NUM ÖÖÑÕÉ« */
int ColorSelect(char *filename,int Width,int Height,char flags)
{ struct ffblk file;
register int i,j,k;
int f1,f2,f3,f4,f5,pos,l;
unsigned long imagesize;
unsigned char far * pal,far * keep;
char drive[3],dir[MAXDIR],name[9],ext[4],my[80];
unsigned char far *p1,far *p2,far *p3,far *p4;
unsigned int EMMhandle,offset,sgm,ex1,ex2,ex3,p,num,seg,seg1,posy;
strcpy(my,filename);
if(strstr(my,".")==NULL) strcat(my,".*");
if(!findfirst(my,&file,0x20)) {
fnsplit(file.ff_name,drive,dir,name,ext);
fnmerge(my,drive,dir,name,"");
strcpy(fr,my); strcat(fr,".R$$");
strcpy(fg,my); strcat(fg,".G$$");
strcpy(fb,my); strcat(fb,".B$$");
strcpy(fout,my); strcat(fout,".IMG");
strcpy(fpal,my); strcat(fpal,".PAL");
l=20;
if(flags==OFF) {
p=strlen(fr)-2; l=10;
fr[p]='\x0'; fg[p]='\x0'; fb[p]='\x0'; }
}
else {
ErrorProc("File Not Found!");
return -1; }
f1=open(fr,O_RDONLY|O_BINARY,S_IREAD);
f2=open(fg,O_RDONLY|O_BINARY,S_IREAD);
f3=open(fb,O_RDONLY|O_BINARY,S_IREAD);
f4=open(fout,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
f5=open(fpal,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
if((f1==-1)||(f2==-1)||(f3==-1)||(f4==-1)||(f5==-1)) {
ErrorProc("File Open ERROR!");
return -1; }
if(flags==OFF) {
lseek(f1,12,SEEK_SET);
lseek(f2,12,SEEK_SET);
lseek(f3,12,SEEK_SET); }
write(f4,"JPEG R\x0\x0",8);
write(f4,&Width,2);
write(f4,&Height,2);
COLOR_CUT=8;
PAGE_LINE=16384/Width;
Block=Width*PAGE_LINE;
imagesize=(unsigned long)Width*Height;
PAGE_NUM=((imagesize%Block)!=0)?(imagesize/16384+1):(imagesize/16384);
if(!EmmTest()||!EmmOk()) {
ErrorProc("Expanded Memory is NOT available!");
close(f1); close(f2); close(f3);
close(f4); close(f5); return -1; }
if((EMMhandle=EmmAlloc(PAGE_NUM*3))==0xffff) {
ErrorProc("Expanded Memory Allocation Error!");
close(f1); close(f2); close(f3);
close(f4); close(f5); return -1; }
if(allocmem(64*(64+16),&seg)!=-1) {
ErrorProc("Not Enough Memory!");
close(f1); close(f2); close(f3);
close(f4); close(f5); return -1; }
coll[0]=MK_FP(seg,0);
coll[1]=MK_FP(seg+1924,0);
coll[2]=MK_FP(seg+1024*2,0);
for(k=0;k>=3; p2[k]>>=3; p3[k]>>=4;
if(buf[p1[k]][p2[k]][p3[k]]<=COLOR_CUT) buf[p1[k]][p2[k]][p3[k]]++;
}
}
num=DAC_BEGIN;
for(i=0;iCOLOR_CUT) {
coll[0][num]=i;
coll[1][num]=j;
coll[2][num]=k;
num++; }
sgm=0;
while(num>COLOR_NUM) {
sgm++;
for(i=DAC_BEGIN;inum-1) break;
ex1=abs(coll[0][i]-coll[0][k])+abs(coll[1][i]-coll[1][k])+abs(coll[2][i]-coll[2][k]);
if(ex1>=3; p2[k]>>=3; p3[k]>>=4; }
for(j=0;j R G B Õæ²ÊɫͼÏó */
int Change(int fin,int ftr,int ftg,int ftb)
{ unsigned int seg;
BITCOLOR color[256];
int i,j,k=1,ww,hh;
unsigned char far *soc,far *dest,ct[256];
read(fin,&bmphead,sizeof(bmphead));
read(fin,&bmpinfo,sizeof(bmpinfo));
read(fin,&color,sizeof(color));
if(bmphead.Type!=0x4d42) return -1;
if(bmpinfo.Compression!=0) return 2;
if((bmpinfo.Width%4)!=0) ww=bmpinfo.Width+4-(bmpinfo.Width%4);
else ww=bmpinfo.Width;
hh=bmpinfo.Heigth;
for(i=0;i BMP ¸ñʽ */
int Creat(int fp_r,char *tab,int fp_w,int flag)
{ unsigned int seg;
BITCOLOR bmpcolor[256];
unsigned char *buf,pal;
int i,k,width,ftab,height;
lseek(fp_r,8,SEEK_SET);
read(fp_r,&width,2); bmpinfo.Width=width;
read(fp_r,&height,2); bmpinfo.Heigth=height;
if((width%4)!=0) width+=4-(width%4);
bmphead.Type=0x4d42; bmphead.bfsize=1078;
bmphead.Reserve1=0; bmphead.Reserve2=0;
bmphead.Offset=1078; bmpinfo.Size=40;
bmpinfo.Planes=1; bmpinfo.Bitcount=8;
bmpinfo.Compression=0; bmpinfo.SizeImage=0;
bmpinfo.XpelsPerMeter=0; bmpinfo.YpelsPerMeter=0;
bmpinfo.ClrUsed=256; bmpinfo.ClrImportant=0;
bmpinfo.SizeImage=(unsigned long)bmpinfo.Width*bmpinfo.Heigth;
bmphead.bfsize+=(unsigned long)bmpinfo.SizeImage;
if(allocmem(2048/16,&seg)==-1) {
buf=(unsigned char *)MK_FP(seg,0);
if((ftab=open(tab,O_RDWR|O_BINARY,S_IREAD))!=-1) {
for (i=0;i<256;i++) {
read(ftab,&bmpcolor[i],3);
pal=bmpcolor[i].B;
bmpcolor[i].B=(unsigned char)(bmpcolor[i].R<<2);
bmpcolor[i].G=(unsigned char)(bmpcolor[i].G<<2);
bmpcolor[i].R=(unsigned char)(pal<<2);
bmpcolor[i].Reserved=0;
}
close(ftab);
}
else
for(i=0;i<256;i++) {
bmpcolor[i].R=(unsigned char)i;
bmpcolor[i].G=(unsigned char)i;
bmpcolor[i].B=(unsigned char)i;
bmpcolor[i].Reserved=(unsigned char)0;
}
if(flag==OFF)
for(i=0;i<256;i++) {
bmpcolor[i].R=(unsigned char)(0.59*(float)bmpcolor[i].R
+0.3*(float)bmpcolor[i].G+0.11*(float)bmpcolor[i].B);
bmpcolor[i].R=bmpcolor[i].R;
bmpcolor[i].G=bmpcolor[i].R;
bmpcolor[i].B=bmpcolor[i].R; }
write(fp_w,&bmphead,sizeof(bmphead));
write(fp_w,&bmpinfo,sizeof(bmpinfo));
write(fp_w,&bmpcolor,sizeof(bmpcolor));
lseek(fp_r,(long)-width,SEEK_END);
read(fp_r,buf,width);
write(fp_w,buf,bmpinfo.Width);
for (i=1;i BMP ¸ñʽÖ÷¿Ø */
int img2bmp(char *fname,int flag)
{ int br,bw;
char name[MAXPATH],msg[80];
strcpy(name,fname);
strcpy(msg,name);
if((br=open(name,O_RDWR|O_BINARY,S_IREAD))!=-1) {
strcat(msg," ==> ");
get_base_name(name,name,".BMP");
strcat(msg,name);
if((bw=open(name,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE))!=-1) {
get_base_name(name,name,".PAL");
mputs(25,36,msg,252,255);
Creat(br,name,bw,flag);
strcat(msg," Over!");
bell(800); mputs(25,36,msg,252,255);
mdelay(20); close(bw); }
else ErrorProc("File Can't be Created!");
close(br);
}
else ErrorProc("File Can't be Opened!");
}
/* BMP ¸ñʽ ==> IMG ¸ñʽÖ÷¿Ø */
int bmp2img(char *filename,int flag)
{ int hr,hw,hR,hG,hB,result;
struct ffblk file_blk;
char fname[MAXPATH],ext[5],msg[80];
strcpy(fname,filename);
if(strrchr(fname,'.')==NULL) strcat(fname,".BMP");
if(findfirst(fname,&file_blk,FA_ARCH)==-1) {
ErrorProc("File Not Found!"); return -1; }
fnsplit(fname,drive,dir,name,ext);
do {
fnmerge(fname,drive,dir,file_blk.ff_name,"");
if((hr=open(fname,O_RDWR|O_BINARY,S_IREAD))!=-1) {
strcpy(msg,fname);
switch(flag) {
case OFF : get_base_name(fname,fname,".Y");
if((hw=open(fname,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,
S_IREAD|S_IWRITE))!=-1) {
strcat(msg," ==> ");
strcat(msg,fname);
mputs(25,36,msg,252,255);
result=Change(hr,hw,-1,-1);
close(hw);
switch(result) {
case 1 : strcat(msg," Change Over!");
bell(800); mputs(25,36,msg,252,255);
mdelay(20); break;
case 2 : ErrorProc("Not an UnCompressed BMP File!");
remove(fname); break;
case 4 : ErrorProc("Not Enougn Memory!");
remove(fname); break;
case 3 : ErrorProc("Not an 256 Color BMP File!");
remove(fname); break;
}
}
else ErrorProc("File Can't be Created!");
break;
case ON : get_base_name(fname,fname,".R");
hR=open(fname,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,
S_IREAD|S_IWRITE);
get_base_name(fname,fname,".G");
hG=open(fname,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,
S_IREAD|S_IWRITE);
get_base_name(fname,fname,".B");
hB=open(fname,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,
S_IREAD|S_IWRITE);
if((hR!=-1)&&(hG!=-1)&&(hB!=-1)) {
get_base_name(fname,fname," RGB TURE COLOR");
strcat(msg," ==> ");
strcat(msg,fname);
mputs(25,36,msg,252,255);
result=Change(hr,hR,hG,hB);
close(hR); close(hB); close(hG);
if(result!=1) {
fname[strlen(fname)-14]='\x2e';
get_base_name(fname,fname,".R"); remove(fname);
get_base_name(fname,fname,".G"); remove(fname);
get_base_name(fname,fname,".B"); remove(fname); }
switch(result) {
case 1 : strcat(msg," Change Over!");
bell(800); mputs(25,36,msg,252,255);
mdelay(20); break;
case 2 : ErrorProc("Not an UnCompressed BMP File!");
break;
case 4 : ErrorProc("Not Enougn Memory!");
break;
case 3 : ErrorProc("Not an 256 Color BMP File!");
break;
}
}
else ErrorProc("File Can't be Created!");
break;
}
close(hr);
}
else ErrorProc("File Can't be Opened!");
} while(findnext(&file_blk)!=-1);
return 1;
}
/* PCX ¸ñʽ ==> IMG ¸ñʽ */
int pcx2img(char *fname,int flag)
{ unsigned char p256;
unsigned int segm;
int raw,pcxw,pcxd,result;
if(allocmem(64,&segm)!=-1) {
ErrorProc("Alloc Memory Failure!");
return -1; }
if((raw=open(fname,O_RDWR|O_BINARY,S_IREAD))!=-1) {
palette=(unsigned char *)MK_FP(segm,0);
read(raw,(char *)&pcxhead,sizeof(pcxhead));
lseek(raw,-769L,SEEK_END);
read(raw,palette,769);
p256=*palette;
if(p256==0x0c) {
palette=(unsigned char *)MK_FP(segm,1);
pcxw=(pcxhead.xmax-pcxhead.xmin)+1;
if(pcxw%4!=0) pcxw+=4-(pcxw%4);
pcxd=(pcxhead.ymax-pcxhead.ymin);
result=unpackpcxfile(fname,raw,pcxw,pcxd,flag);
switch(result) {
case 2 : ErrorProc("Not Enougn Memory!");
break;
case 3 : ErrorProc("Error Creatint Object File!");
break;
}
close(raw); }
else ErrorProc("Error Doing Color Palette!");
}
else ErrorProc("Error Opening File!");
freemem(segm);
}
/* PCX Îļþ RLL ½âÂë */
int unpackpcxfile(char *fname,int fp,int pcxw,int pcxd,int flag)
{ float temp;
unsigned long len;
unsigned int seg;
char name[MAXPATH],msg[80];
int i,j,m,x,count,hR,hG,hB;
unsigned char far *buffs,huge *ps,*kr,*kg,*kb,ch;
lseek(fp,0,SEEK_END);
len=(unsigned long)tell(fp);
if(allocmem(pcxw/4+len/16+2,&seg)!=-1) return 2;
strcpy(msg,fname); strcpy(name,fname);
strcat(msg," ==> ");
if(flag==ON) {
get_base_name(name,name,".R");
hR=open(name,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
get_base_name(name,name,".G");
hG=open(name,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
get_base_name(name,name,".B");
hB=open(name,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
if((hR==-1)||(hG==-1)||(hB==-1)) {
freemem(seg); return 3; }
write(hR,"JPEG R\x0\x0",8);
write(hR,&pcxw,2); write(hR,&pcxd,2);
write(hG,"JPEG R\x0\x0",8);
write(hG,&pcxw,2); write(hG,&pcxd,2);
write(hB,"JPEG R\x0\x0",8);
write(hB,&pcxw,2); write(hB,&pcxd,2);
get_base_name(name,name," RGB TURE COLOR");
}
else {
get_base_name(name,name,".Y");
hR=open(name,O_CREAT|O_TRUNC|O_RDWR|O_BINARY,S_IREAD|S_IWRITE);
if(hR==-1) { freemem(seg); return 3; }
write(hR,"JPEG R\x0\x0",8);
write(hR,&pcxw,2); write(hR,&pcxd,2);
get_base_name(name,name,".Y");
}
strcat(msg,name);
mputs(25,36,msg,252,255);
ps=(unsigned char far *)MK_FP(seg,pcxw*4);
buffs=(unsigned char far *)ps; len-=0x80L;
i=len/SIZE; len%=SIZE;
lseek(fp,0x80L,SEEK_SET);
for(m=0;m ´ò¿ªÎļþ³ö´í
0 ==> IMG ¸ñʽ
1 ==> BMP ¸ñʽ
2 ==> PCX ¸ñʽ
-2 ==> ¸ñʽ²»¿Éʶ±ð */
int DecideFormat(char *filename)
{ char size[9];
int handle,idx_num=-2;
if((handle=open(filename,O_RDWR|O_BINARY,S_IREAD))==-1) {
ErrorProc("Open File Error!"); return -1; }
read(handle,size,8);
if(strcmp(size,"JPEG R")==NULL) idx_num=0;
lseek(handle,0,SEEK_SET);
read(handle,&bmphead,sizeof(bmphead));
read(handle,&bmpinfo,sizeof(bmpinfo));
if(bmphead.Type==0x4d42) idx_num=1;
lseek(handle,0,SEEK_SET);
read(handle,&pcxhead,sizeof(pcxhead));
if(pcxhead.manufacturer==0x0a&&pcxhead.version==5) idx_num=2;
close(handle);
return (idx_num);
}
/* ¸ñʽת»»Ö÷¿Ø */
/* FLAG=ON ²Êɫת»» =OFF »Ò¶Èת»» */
int FormatChange(int flag)
{ int i,idx;
struct ffblk f_blk;
char fname[MAXDIR],drive[4],dir[MAXDIR],name[9],ext[5],msg[80];
fseek(ovlp,-12*32,2);
Hide(); mbar(0,DIMY-29,640,DIMY,252);
title16(2,575,7,2,255); Show();
if(mscanf(fname)==-1) {
Hide(); mbar(0,DIMY-29,640,DIMY,252);
Show(); return -1; }
if(strrchr(fname,'.')==NULL) strcat(fname,".BMP");
if(findfirst(fname,&f_blk,FA_ARCH)!=-1) {
fnsplit(fname,drive,dir,name,ext);
do {
Set_Mouse(IDC_WAIT);
strcpy(name,f_blk.ff_name);
fnmerge(fname,drive,dir,name,"");
Hide(); mbar(0,DIMY-29,640,DIMY,252); Show();
i=DecideFormat(fname);
switch(i) {
case -1 : ErrorProc("File Open Error!"); break;
case -2 : ErrorProc("UnKnown Image Format!"); break;
case 0 : img2bmp(fname,flag); break;
case 1 : bmp2img(fname,flag); break;
case 2 : pcx2img(fname,flag); break;
}
} while(findnext(&f_blk)!=-1);
Set_Mouse(IDC_CURSOR);
}
else {
bell(800); Hide();
mbar(0,DIMY-29,640,DIMY,252); Show();
mputs(25,36,fname,252,255);
mputs(50,36,"File Not Found",252,251); }
Hide(); mbar(0,DIMY-29,640,DIMY,252); Show();
}