#include #include #include #ifdef MSDOS #define WB "wb" #else #define WB "w" #endif #define CODE_SIZE 4418 #define DEFAULTTHRESH 10.0 double thresh=DEFAULTTHRESH; struct { char *str; int len; } allkanji[94*94]; char *vfbase="ZFont"; usage(cmd) char *cmd; { fprintf(stderr,"usage: %s [-thresh threshold] [-base basename] [file...]\n",cmd); fprintf(stderr," -thresh .threshold default %f\n",DEFAULTTHRESH); fprintf(stderr," -base .baesname default %s\n","ZFont"); exit(1); } main(ac,ag) char **ag; { double strtod(); int i; for(i=1;i='a'?x-'a'+10:(x>='A'?x-'A'+10:x-'0')); } char *allocbin(buf,len) char *buf; { int i; char *cptr,*malloc(); if((cptr=malloc(len))==NULL){ fprintf(stderr,"Failed in malloc()\n"); exit(1); } for(i=0;i>8)&255)-0x21)*94+((kcode&255)-0x21); klen=(len-16)/2; allkanji[koffset].str=allocbin(buf+1,klen); allkanji[koffset].len=klen; } } fclose(fd); } int offsets[CODE_SIZE]; output_zeit(level) int level; { char filename[256]; FILE *fd; int kbase,klimit,offset,i; long last; sprintf(filename,"%s.vf%d",vfbase,level); if((fd=fopen(filename,WB))==NULL){ fprintf(stderr,"Failed opening file %s\n",filename); exit(1); } fseek(fd,(long)(CODE_SIZE*4+2),0); if(level==1){ kbase=0; klimit=0x5e*(0x50-0x21); } else { kbase=0x5e*(0x50-0x21); klimit=0x5e*(0x75-0x50); } for(offset=i=0;i0){ offsets[i]=offset; offset+=zeit_character(fd,allkanji[kbase+i].str,allkanji[kbase+i].len); } else offsets[i]= 0xffffffff; } last=ftell(fd); fseek(fd,0L,0); output_short(fd,level); for(i=0;i>8,fd); } output_long(fd,val) FILE *fd; long val; { putc(val,fd); putc(val>>8,fd); putc(val>>16,fd); putc(val>>24,fd); } int rest; int outbuf; int count; init_10() { rest=0; count=0; } output_10(fd,val) FILE *fd; { outbuf<<=10; outbuf|=(val&0x3ff); rest+=10; if(rest>=16){ rest-=16; putc(outbuf>>rest,fd); putc(outbuf>>(rest+8),fd); count+=2; } } output_x(fd,val) FILE *fd; { if(val<0) val=0; else if(val>1022) val=1022; return output_10(fd,val); } output_y(fd,val) FILE *fd; { val=1000-val; if(val<0) val=0; else if(val>1022) val=1022; return output_10(fd,val); } flush_10(fd) FILE *fd; { if(rest>0){ if(rest<6)output_10(fd,0); output_10(fd,0); } return(count); } zeit_character(fd,str,len) FILE *fd; char *str; { unsigned plain[4096]; decrypt_str(str,plain,len); init_10(); mf_charstr(fd,plain,len); return flush_10(fd); } decrypt_str(cipher,plain,len) unsigned char *cipher,*plain; { unsigned short r=4330,c1=52845,c2=22719; while(--len>=0){ *plain++=(*cipher ^ (r>>8)); r=(*cipher++ +r)*c1+c2; } } #define STACKSIZE 1024 int stack[STACKSIZE]; #define PUSH(x) (*--sp=(x)) #define DISCARD(n) (sp+=n) struct point { int tag,x,y; } points[1024]; /* tags */ #define NONE 0 #define LINE 1 #define BEZIER 2 output_bezier(fd,x0,y0,x1,y1,x2,y2,x3,y3) FILE *fd; double x0,y0,x1,y1,x2,y2,x3,y3; { double minx,miny,maxx,maxy,tempx,tempy; minx=(x0>x1?x1:x0); minx=(x2>minx?minx:x2); minx=(x3>minx?minx:x3); miny=(y0>y1?y1:y0); miny=(y2>miny?miny:y2); miny=(y3>miny?miny:y3); maxx=(x00){ output_x(fd,points[0].x); output_y(fd,points[0].y); for(i=1;i