#include #include #include #include #include #include #include #include #include #include #include "chinese.h" FILE *handle,*handle1; int fh=0; unsigned int readCount_0,byteNum_0,readCount_8,byteNum_8; unsigned char *wordCont_0,*wordCont_8; double scalceX=0.2,scalceY=0.2; int Color; void showHanzi(unsigned char qw,unsigned char wm,int x,int y); void case8Handle(FILE *handle,unsigned char *case8Data,long basePtr,int x0,int y0); void otherHandle(int fnNo,unsigned char controlWord,double facX,double facY,int xc,int yc,int *curX,int *curY); unsigned char myRead_0(void); unsigned char myRead_8(void); void b3_4(int *x,int *y); unsigned char (*fn[2])(void)={myRead_0,myRead_8}; int chinese::openhzk(char c) { if(fh==1) { fclose(handle); fclose(handle1); fh=0; } if(c=='s') {handle=fopen("d:\\ucdos\\fnt\\hzk24s","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='k') {handle=fopen("d:\\ucdos\\fnt\\hzk24k","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='f') {handle=fopen("d:\\ucdos\\fnt\\hzk24f","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='b') {handle=fopen("d:\\ucdos\\fnt\\hzk24h","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='h') {handle=fopen("d:\\ucdos\\fnt\\hzk40s","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='d') {handle=fopen("d:\\ucdos\\fnt\\clib48h.dot","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='x') {handle=fopen("d:\\ucdos\\hzk16","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='p') {handle=fopen("d:\\ucdos\\fnt\\ktdot.ps","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='1') {handle=fopen("d:\\ucdos\\fnt\\bsdot.ps","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='2') {handle=fopen("d:\\ucdos\\fnt\\lsdot.ps","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='3') {handle=fopen("d:\\ucdos\\fnt\\htdot.ps","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(c=='4') {handle=fopen("d:\\ucdos\\fnt\\ftdot.ps","rb"); handle1=fopen("d:\\ucdos\\asc16","rb");} if(handle==NULL || handle1==NULL) { cputs("Error on open then lib."); exit(1); } return 0; fh=1; } int chinese::close(void) { fclose(handle); fclose(handle1); return 0; } int chinese::puthz16(int x,int y,int z,int color,char *p) { unsigned int i ,c1,c2,m=0; int i1,i2,i3,rec; long l; char by[32]; while ((i=*p++)!=0) { if(i>0xa1) if(m==0) { c1=(i-0xa1)&0x7f; m=1; } else { c2=(i-0xa1)&0x7f; m=0; rec=c1*94+c2; l=rec*32l; fseek(handle,l,SEEK_SET); fread(by,32,1,handle); for (i1=0;i1<16;i1++) for(i2=0;i2<2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*2+i2],7-i3)) putpixel(x+i2*8+i3,y+i1,color); x=x+16+z; } } return(x); } int chinese::puthz16_new(int x,int y,int z,int color,char *p,int maxwidth) { unsigned int i,c1,c2,m=0; int i1,i2,i3,rec,x1; long l; char by[32]; while ((i=*p++)!=0) { if(i>0xa1) if(m==0) { c1=(i-0xa1)&0x7f; m=1; } else { c2=(i-0xa1)&0x7f; m=0; rec=c1*94+c2; l=rec*32l; fseek(handle,l,SEEK_SET); fread(by,32,1,handle); for (i1=0;i1<16;i1++) for(i2=0;i2<2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*2+i2],7-i3)) putpixel(x+i2*8+i3,y+i1,color); x=x+16+z; if (x>=x1+maxwidth) { x=x1; y=y+20; } } } return (y+16); } int chinese::puthz16a(int x,int y,int z,int color,char *p) { unsigned int i ,c1,c2,m=0; int i1,i2,i3,rec; long l; char by[32]; while ((i=*p++)!=0) { if(i>0xa1) {if(m==0) { c1=(i-0xa1)&0x7f; m=1; } else { c2=(i-0xa1)&0x7f; m=0; rec=c1*94+c2; l=rec*32l; fseek(handle,l,SEEK_SET); fread(by,32,1,handle); for (i1=0;i1<16;i1++) for(i2=0;i2<2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*2+i2],7-i3)) putpixel(x+i2*8+i3,y+i1,color); x=x+16+z; } } else { l=i*16l; fseek(handle1,l,SEEK_SET); fread(by,16,1,handle1); for(i1=0;i1<16;i1++) for(i2=0;i2<8;i2++) if(getbit(by[i1],7-i2)) putpixel(x+i2,y+i1,color); x=x+8+z/2; } } return(x); } int chinese::puthz24a(int x,int y,int z,int color,char *p) { unsigned int i,c1,c2,f=0; int i1,i2,i3,rec; long l; char by[72]; char tt[2]; while ((i=*p++)!=0) { if(i>0xa1) {if(f==0) { c1=(i-0xb0)&0x7f; f=1; } else { c2=(i-0xa1)&0x7f; f=0; rec=c1*94+c2; l=rec*72l; fseek(handle,l,SEEK_SET); fread(by,72,1,handle); for (i1=0;i1<24;i1++) for(i2=0;i2<=2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i1,y+i2*8+i3,color); x=x+24+z; } } else { tt[0]=i; tt[1]='\0'; setcolor(color); settextstyle(1,HORIZ_DIR,1); settextjustify(LEFT_TEXT,RIGHT_TEXT); outtextxy(x,y+4,tt); x=x+16; } } return(x); } int chinese::puthz24(int x,int y,int z,int color,char *p) { unsigned int i,c1,c2,f=0; int i1,i2,i3,rec; long l; char by[72]; while ((i=*p++)!=0) { if(i>0xa1) if(f==0) { c1=(i-0xb0)&0x7f; f=1; } else { c2=(i-0xa1)&0x7f; f=0; rec=c1*94+c2; l=rec*72l; fseek(handle,l,SEEK_SET); fread(by,72,1,handle); for (i1=0;i1<24;i1++) for(i2=0;i2<=2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i1,y+i2*8+i3,color); x=x+24+z; } } return(x); } int chinese::puthz24_x(int x,int y,int z,int color,char *p,int returnx,int xlimit) { unsigned int i,c1,c2,f=0; int i1,i2,i3,rec; long l; char by[72]; while ((i=*p++)!=0) { if(i>0xa1) if(f==0) { c1=(i-0xa1)&0x7f; f=1; } else { c2=(i-0xa1)&0x7f; f=0; rec=c1*94+c2; l=rec*72l; fseek(handle,l,SEEK_SET); fread(by,72,1,handle); for (i1=0;i1<24;i1++) for(i2=0;i2<=2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i1,y+i2*8+i3,color); x=x+24+z; if(x>xlimit-24) { x=returnx; y=y+30; } } } return(x); } int chinese::puthz24_new(int x,int y,int z,int color,char *p,int maxwidth,int flag) { unsigned int i,c1,c2,f=0; int i1,i2,i3,rec,x1; long l; char by[72]; x1=x; if (flag==2) x=x+48; while ((i=*p++)!=0) { if(i>0xa1) if(f==0) { c1=(i-0xa1)&0x7f; f=1; } else { c2=(i-0xa1)&0x7f; f=0; rec=c1*94+c2; l=rec*72l; fseek(handle,l,SEEK_SET); fread(by,72,1,handle); for (i1=0;i1<24;i1++) for(i2=0;i2<=2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i1,y+i2*8+i3,color); x=x+24+z; if(x>=x1+maxwidth) { x=x1; y=y+30; } } } return(y+30); } int chinese::puthz40(int x,int y,int z,int color,char *p,int maxwidth,int flag) { unsigned int i,c1,c2,f=0; int i1,i2,i3,rec,x1; long l; char by[180]; x1=x; if (flag==2) x=x+72; while ((i=*p++)!=0) { if(i>0xa1) if(f==0) { c1=(i-0xa1)&0x7f; f=1; } else { c2=(i-0xa1)&0x7f; f=0; rec=c1*94+c2; l=rec*180l; fseek(handle,l,SEEK_SET); fread(by,180,1,handle); for (i1=0;i1<36;i1++) for(i2=0;i2<3;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i1,y+i2*8+i3,color); for (i1=0;i1<36;i1++) for(i2=0;i2<2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*2+i2+108],7-i3)) putpixel(x+i1,y+24+i2*8+i3,color); x=x+36+z; if(x>=x1+maxwidth) { x=x1; y=y+45; } } } return(y+60); } int chinese::puthz48(int x,int y,int z,int color,char *p,int maxwidth,int flag) { unsigned int i,c1,c2,c3,f=0; int i1,i2,i3,rec,x1; long l; char by[270]; x1=x; if (flag==2) x=x+96; while ((i=*p++)!=0) { if(i>0xa1) if(f==0) { c1=(i-0xb0)&0x7f; f=1; } else { c2=(i-0xa1)&0x7f; f=0; rec=c1*94+c2; l=rec*270l; fseek(handle,l,SEEK_SET); fread(by,270,1,handle); for (i1=0;i1<45;i1++) for(i2=0;i2<=2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i1,y+i2*8+i3,color); /*for (i1=45;i1<90;i1++) for(i2=0;i2<3;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i1-45,y+24+i2*8+i3,color);*/ x=x+45+z; if(x>=x1+maxwidth) { x=x1; y=y+80; } } } return(y+80); } int chinese::puthz24rat(int x,int y,int z,int color,char *p,char d,int angle) { unsigned int i,c1,c2,f=0; int i1,i2,i3,rec; long l; char by[72]; while ((i=*p++)!=0) { if(i>0xa1) if(f==0) { c1=(i-0xb0)&0x7f; f=1; } else { c2=(i-0xa1)&0x7f; f=0; rec=c1*94+c2; l=rec*72l; fseek(handle,l,SEEK_SET); fread(by,72,1,handle); for (i1=0;i1<24;i1++) for(i2=0;i2<=2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i1,y+i2*8+i3,color); if(angle==90) for (i1=0;i1<24;i1++) for(i2=0;i2<=2;i2++) for(i3=0;i3<8;i3++) if(getbit(by[i1*3+i2],7-i3)) putpixel(x+i2*8+i3,y-i1,color); if(d=='h') x=x+24+z; if(d=='v') { if(angle==0) y=y+24+z; if(angle==90) y=y-24-z; } } } return(x); } int chinese::puthz24ext(int x,int y,int z,int color,int m,int n,char *p) { unsigned int i,c1,c2,f=0; int i1,i2,i3,i4,i5,rec; long l; char by[72]; while ((i=*p++)!=0) { if(i>0xa1) if(f==0) { c1=(i-0xb0)&0x7f; f=1; } else { c2=(i-0xa1)&0x7f; f=0; rec=c1*94+c2; l=rec*72l; fseek(handle,l,SEEK_SET); fread(by,72,1,handle); for (i1=0;i1<24*m;i1+=m) for(i4=0;i4=(2*byteNum_0)) break; controlWord=myRead_0(); if(controlWord<=7) otherHandle(0,controlWord,1.0,1.0,x,y,&curX,&curY); else{ setcolor(Color); case8Data[0]=controlWord; for(i=1;i<11;i++) case8Data[i]=myRead_0(); case8Handle(handle,case8Data,secondIndex,x,y); setcolor(Color); } } free(wordCont_0); //fclose(handle); } void otherHandle(int fnNo,unsigned char controlWord,double facX,double facY,int xc,int yc,int *curX,int *curY) { int xx[4],yy[4],i,j; switch(controlWord){ case 0: xx[0]=(int)fn[fnNo]()*16+fn[fnNo](); yy[0]=(int)fn[fnNo]()*16+fn[fnNo](); xx[0]=scalceX*xx[0]*facX; yy[0]=scalceY*yy[0]*facY; xx[0]+=xc;yy[0]+=yc; moveto(xx[0],yy[0]); *curX=xx[0];*curY=yy[0]; break; case 1: xx[0]=(int)fn[fnNo]()*16+fn[fnNo](); xx[0]=scalceX*xx[0]*facX; xx[0]+=xc; lineto(xx[0],*curY); *curX=xx[0]; break; case 2: yy[0]=(int)fn[fnNo]()*16+fn[fnNo](); yy[0]=scalceY*yy[0]*facY; yy[0]+=yc; lineto(*curX,yy[0]); *curY=yy[0]; break; case 3: xx[0]=(int)fn[fnNo]()*16+fn[fnNo](); yy[0]=(int)fn[fnNo]()*16+fn[fnNo](); xx[0]=scalceX*xx[0]*facX; yy[0]=scalceY*yy[0]*facY; xx[0]+=xc;yy[0]+=yc; lineto(xx[0],yy[0]); *curX=xx[0];*curY=yy[0]; break; case 4: xx[0]=*curX;yy[0]=*curY; xx[1]=(int)fn[fnNo]()*16+fn[fnNo](); yy[1]=(int)fn[fnNo]()*16+fn[fnNo](); xx[2]=(int)fn[fnNo]()*16+fn[fnNo](); yy[2]=(int)fn[fnNo]()*16+fn[fnNo](); xx[1]=scalceX*xx[1]*facX; yy[1]=scalceY*yy[1]*facY; xx[2]=scalceX*xx[2]*facX; yy[2]=scalceY*yy[2]*facY; xx[1]+=xc;yy[1]+=yc; xx[2]+=xc;yy[2]+=yc; xx[3]=xx[2];yy[3]=yy[2]; b3_4(xx,yy); *curX=xx[2];*curY=yy[2]; moveto(*curX,*curY); break; case 5: xx[0]=*curX;yy[0]=*curY; xx[1]=(int)fn[fnNo]()*16+fn[fnNo](); yy[1]=(int)fn[fnNo]()*16+fn[fnNo](); xx[2]=(int)fn[fnNo]()*16+fn[fnNo](); yy[2]=(int)fn[fnNo]()*16+fn[fnNo](); xx[3]=(int)fn[fnNo]()*16+fn[fnNo](); yy[3]=(int)fn[fnNo]()*16+fn[fnNo](); xx[1]=scalceX*xx[1]*facX; yy[1]=scalceY*yy[1]*facY; xx[2]=scalceX*xx[2]*facX; yy[2]=scalceY*yy[2]*facY; xx[3]=scalceX*xx[3]*facX; yy[3]=scalceY*yy[3]*facY; for(i=1;i<4;i++) { xx[i]+=xc;yy[i]+=yc;} b3_4(xx,yy); *curX=xx[3];*curY=yy[3]; moveto(*curX,*curY); break; case 6: xx[0]=(int)fn[fnNo]()*16+fn[fnNo](); yy[0]=(int)fn[fnNo]()*16+fn[fnNo](); xx[1]=(int)fn[fnNo]()*16+fn[fnNo](); yy[1]=(int)fn[fnNo]()*16+fn[fnNo](); xx[0]=scalceX*xx[0]*facX; yy[0]=scalceY*yy[0]*facY; xx[1]=scalceX*xx[1]*facX; yy[1]=scalceY*yy[1]*facY; for(i=0;i<2;i++){ xx[i]+=xc;yy[i]+=yc;} rectangle(xx[0],yy[0],xx[1],yy[1]); *curX=xx[1];*curY=yy[1]; moveto(*curX,*curY); break; case 7: printf("Case 7 is not used!\n"); exit(0);} } void case8Handle(FILE *handle,unsigned char *case8Data,long basePtr,int x0,int y0) { long subIndexPtr; unsigned char subIndexValue[2][3],controlWord; int curX,curY,xc,yc,subOrder; double facX,facY; byteNum_8=0;readCount_8=0; if(case8Data[0]==0x8){ subOrder=case8Data[1]*16+case8Data[2]-8; xc=case8Data[3]*16+case8Data[4]; yc=case8Data[5]*16+case8Data[6]; facX=(case8Data[7]*16+case8Data[8])/100.0; facY=(case8Data[9]*16+case8Data[10])/100.0;} else{ if(case8Data[0]==0x9) subOrder=case8Data[9]*16+case8Data[10]+0xf6; else subOrder=case8Data[9]*16+case8Data[10]+0x1f6; xc=case8Data[1]*16+case8Data[2]; yc=case8Data[3]*16+case8Data[4]; facX=(case8Data[5]*16+case8Data[6])/100.0; facY=(case8Data[7]*16+case8Data[8])/100.0;} xc*=scalceX;yc*=scalceY; xc+=x0;yc+=y0; fseek(handle,basePtr+subOrder*3,SEEK_SET); fread(subIndexValue[0],3,1,handle); fread(subIndexValue[1],3,1,handle); subIndexPtr=(long)subIndexValue[0][2]*65536+(long)subIndexValue[0][1]*256+subIndexValue[0][0]; byteNum_8=(long)subIndexValue[1][2]*65536+(long)subIndexValue[1][1]*256+subIndexValue[1][0]-subIndexPtr; subIndexPtr+=basePtr; wordCont_8=(unsigned char *)malloc(byteNum_8); if(!wordCont_8){ printf("Out of memory-2\n"); exit(0);} fseek(handle,subIndexPtr,SEEK_SET); fread(wordCont_8,1,byteNum_8,handle); while(1){ if(readCount_8>=(byteNum_8*2)) break; controlWord=myRead_8(); otherHandle(1,controlWord,facX,facY,xc,yc,&curX,&curY); } free(wordCont_8); } unsigned char myRead_8(void) { return(0x0f&(wordCont_8[readCount_8/2]>>((1-((readCount_8++)%2))*4)));} unsigned char myRead_0(void) { return(0x0f&(wordCont_0[readCount_0/2]>>((1-((readCount_0++)%2))*4)));} void b3_4(int *x,int *y) { int i,n,k,*bx,*by; double a,b,c,d,dt,xx,f0_3,f_0,f_1,f_2; n=100; bx=(int *)malloc(n*sizeof(int)); by=(int *)malloc(n*sizeof(int)); if((!bx)||(!by)){ printf("Memory Error-3!"); exit(0);} dt=(double)1/(double)n; a=((-1)*x[0]+3*x[1]-3*x[2]+x[3]); b=3*(x[0]-2*x[1]+x[2]); c=3*(x[1]-x[0]);d=x[0]; f0_3=6*a*dt*dt*dt;f_2=f0_3+2*b*dt*dt; f_1=f0_3/6+b*dt*dt+c*dt;f_0=d; bx[0]=x[0]; for(i=1;i0xa1) if(f==0) { c1=(i-160)&0x7f; f=1; } else { c2=(i-160)&0x7f; f=0; showHanzi(c1,c2,x,y); x=x+150*m+z; } } return(x); }