/* -mt -f -A -K -G -O -w */ /* Compile with Turbo-C 2.0 */ /* This program generates METAFONT code from a Bitmaps file JIS24 Author: Francois Jalbert ' Date: November 1990 Version: 1.0 Date: April 1991 Version: 2.00 Modifications: - Added four kanjis. - Fixed incorrect VGA resolution. - Command line parameter now supported. - Added automatic mode. - Added batch mode. - Updated and improved run-time messages. - Long triangles added by Mr. Masatoshi Watanabe. Fantastic! - Fixed and proportional parameters added. - Standard and dictionary parameters added. - JIS24 now accessed through low-level I/O channel for speed. Error Levels: 0 - Normal termination. 1 - Error. 2 - All fonts generated (batch). */ #include #include #include #ifdef __TURBOC__ #include #endif #define True 1 #define False 0 /* Number of Bitmaps in JIS24 */ #define BitmapMax 7806 /* Size of each square Bitmap */ #define SizeMax 24 #define SizeMax1 25 /* DOS file name length */ #define FileNameDOS 250 /* includes path */ #define TotalNameDOS 254 /* DOS Record Size */ #define RecSize 72 /* SizeMax*SizeMax/8 */ /* Parameter flag */ #define Flag1 '/' /* DOS style */ #define Flag2 '-' /* UNIX style */ /* Parameter keywords */ #define ParamMax 20 char FixedX1[]="FIXEDWIDTH"; char FixedX2[]="FIXEDX"; char FixedX3[]="NOPROPORTIONALWIDTH"; char FixedX4[]="NOPROPORTIONALX"; char NoFixedX1[]="NOFIXEDWIDTH"; char NoFixedX2[]="NOFIXEDX"; char NoFixedX3[]="PROPORTIONALWIDTH"; char NoFixedX4[]="PROPORTIONALX"; char FixedY1[]="FIXEDHEIGHT"; char FixedY2[]="FIXEDY"; char FixedY3[]="NOPROPORTIONALHEIGHT"; char FixedY4[]="NOPROPORTIONALY"; char NoFixedY1[]="NOFIXEDHEIGHT"; char NoFixedY2[]="NOFIXEDY"; char NoFixedY3[]="PROPORTIONALHEIGHT"; char NoFixedY4[]="PROPORTIONALY"; char Standard1[]="STANDARD"; char NoStandard1[]="DICTIONARY"; char Batch1[]="BATCH"; /* Answer maximum length */ #define AnswerMax 254 typedef char FileNameType[FileNameDOS+1]; typedef char TotalNameType[TotalNameDOS+1]; typedef char ParamType[ParamMax+1]; typedef char AnswerType[AnswerMax+1]; /* Buffer for the Bitmap Data */ struct ColumnType { unsigned char Data1,Data2,Data3; }; typedef struct ColumnType BufferType[SizeMax]; /* start at 0 because of fread */ /* The Bitmap array is defined larger to simplify the forthcoming code */ typedef int BitmapType[SizeMax1+1][SizeMax1+1]; struct BitmapsType { BitmapType Bitmap; int XMin,XMax,YMin,YMax; }; /* Run time parameters */ struct RunTimeType { FileNameType FileName; /* Batch mode */ int Batch; /* Automatic mode for JemTeX fonts only */ int Automatic; /* Fixed or proportional fonts */ int FixedX,FixedY; /* Standard or dictionary fonts */ int Standard; }; void Delete(char *String, int Length) /* Delete the first Length characters of String */ { int Index; Index=0; do String[Index]=String[Index+Length]; while (String[++Index]!='\0'); } /*------------------------------- GetParameters -----------------------------*/ void SimpleQuery(char Title[], char ChoiceA[], char ChoiceB[], int *Answer) { char JChar[2]; int Valid; do { Valid=True; printf("%s:\n",Title); printf(" a) %s\n",ChoiceA); printf(" b) %s\n",ChoiceB); printf("Your choice? "); if (ferror(stdout)) exit(1); if (gets(JChar)==NULL) exit(1); if (strlen(JChar)>1) exit(1); JChar[0]=toupper(JChar[0]); if (JChar[0]=='A') *Answer=True; else if (JChar[0]=='B') *Answer=False; else { Valid=False; if (putchar('\7')==EOF) exit(1); } } while (!Valid); printf("\n"); if (ferror(stdout)) exit(1); } void GetMode(struct RunTimeType *RunTime) /* Determines if the desired font is a JemTeX font */ { RunTime->Automatic=False; if (toupper(RunTime->FileName[0])=='K') if (toupper(RunTime->FileName[1])=='A') if (toupper(RunTime->FileName[2])=='N') if (toupper(RunTime->FileName[3])=='J') if (toupper(RunTime->FileName[4])=='I') if(('A'<=toupper(RunTime->FileName[5]))&&(toupper(RunTime->FileName[5])<='H')) if(('A'<=toupper(RunTime->FileName[6]))&&(toupper(RunTime->FileName[6])<='H')) if (strlen(RunTime->FileName)==7) if (toupper(RunTime->FileName[5])<='G') RunTime->Automatic=True; else if (toupper(RunTime->FileName[6])<='E') RunTime->Automatic=True; } void EchoParameters(struct RunTimeType *RunTime) /* Echoes the current parameters */ { printf("Font=%s",RunTime->FileName); if (RunTime->FixedX) printf(" Fixed Width"); else printf(" Prop. Width"); if (RunTime->FixedY) printf(" Fixed Height"); else printf(" Prop. Height"); if (RunTime->Standard) printf(" Standard"); else printf(" Dictionary"); if (RunTime->Automatic) printf(" Automatic"); else printf(" Manual"); if (RunTime->Batch) printf(" Batch"); printf(".\n"); if (ferror(stdout)) exit(1); } void Manual(struct RunTimeType *RunTime) /* Get parameters from user */ { printf("METAFONT file name? "); if (ferror(stdout)) exit(1); if (gets(RunTime->FileName)==NULL) exit(1); if (strlen(RunTime->FileName)>FileNameDOS) { /* File name too long */ printf("\7File name too long: %s...",RunTime->FileName); exit(1); } printf("\n"); if (ferror(stdout)) exit(1); SimpleQuery("Fixed or proportional font width","Fixed","Proportional", &RunTime->FixedX); SimpleQuery("Fixed or proportional font height","Fixed","Proportional", &RunTime->FixedY); SimpleQuery("Standard or dictionary font","Standard","Dictionary", &RunTime->Standard); /* Batch mode intrinsically isn't manual */ RunTime->Batch=False; } void FindBefore(FileNameType FileName) /* No check for before kanjiaa */ { if (FileName[6]=='a') { FileName[6]='h'; FileName[5]--; } else FileName[6]--; } void FindAfter(FileNameType FileName) /* No check for above kanjihe */ { if (FileName[6]=='h') { FileName[6]='a'; FileName[5]++; } else FileName[6]++; } void ScanMF(FileNameType FileName) /* Scans backwards for the last JemTeX font generated */ /* Looks first for a .TFM and then for an .MF */ /* If no more fonts to generate, stops with error level 2 */ { FILE *TestFile; TotalNameType TotalName; int Found; strcpy(FileName,"kanjihf"); do { FindBefore(FileName); strcpy(TotalName,FileName); strcat(TotalName,".tfm"); TestFile=fopen(TotalName,"r"); Found=(TestFile!=NULL); if (!Found) { strcpy(TotalName,FileName); strcat(TotalName,".mf"); TestFile=fopen(TotalName,"r"); Found=(TestFile!=NULL); } } while (!Found && strcmp(FileName,"kanjiaa")); if (Found) { if (fclose(TestFile)==EOF) exit(1); if (strcmp(FileName,"kanjihe")) FindAfter(FileName); else { printf("\7All JemTeX fonts generated!\n"); exit(2); } } } void Automate(struct RunTimeType *RunTime, int argc, char *argv[]) /* Get parameters from command line */ /* Finds the next font to be generated if in batch mode */ { int ParamIndex,ParamLength,Index; ParamType Param; /* Defaults */ strcpy(RunTime->FileName,"kanjiaa"); RunTime->FixedX=False; RunTime->FixedY=False; RunTime->Standard=True; RunTime->Batch=False; /* Scan command line parameters */ /* 0th is program's name, last is NULL */ for (ParamIndex=1 ; ParamIndexParamMax) { /* Keyword too long */ printf("\7Invalid command line parameter: %s...",argv[ParamIndex]); exit(1); } strcpy(Param,argv[ParamIndex]); if ((Param[0]==Flag1) || (Param[0]==Flag2)) { /* Not a font name */ /* Delete 1 char at the 1st position */ Delete(Param,1); /* Convert to upper case */ for (Index=0 ; IndexFixedX=True; else if ((!strcmp(Param,NoFixedX1)) || (!strcmp(Param,NoFixedX2)) || (!strcmp(Param,NoFixedX3)) || (!strcmp(Param,NoFixedX4))) RunTime->FixedX=False; else if ((!strcmp(Param,FixedY1)) || (!strcmp(Param,FixedY2)) || (!strcmp(Param,FixedY3)) || (!strcmp(Param,FixedY4))) RunTime->FixedY=True; else if ((!strcmp(Param,NoFixedY1)) || (!strcmp(Param,NoFixedY2)) || (!strcmp(Param,NoFixedY3)) || (!strcmp(Param,NoFixedY4))) RunTime->FixedY=False; else if (!strcmp(Param,Standard1)) RunTime->Standard=True; else if (!strcmp(Param,NoStandard1)) RunTime->Standard=False; else if (!strcmp(Param,Batch1)) RunTime->Batch=True; else { /* Unknown keyword */ printf("\7Invalid command line parameter: %s...\n",Param); exit(1); } } else { /* Must be a font name */ if (ParamLength>FileNameDOS) { /* File name too long */ printf("\7File name too long: %s...\n",Param); exit(1); } strcpy(RunTime->FileName,Param); } } if (RunTime->Batch) ScanMF(RunTime->FileName); } void GetParameters(struct RunTimeType *RunTime, int argc, char *argv[]) /* Get parameters from user or command line */ { /* 0th is program's name, last is NULL */ if (argc==1) Manual(RunTime); else Automate(RunTime,argc,argv); GetMode(RunTime); EchoParameters(RunTime); printf("\n"); if (ferror(stdout)) exit(1); } /*---------------------------------- Output ---------------------------------*/ void BeginOut(FILE *OutFile, struct RunTimeType *RunTime) /* Writes initial METAFONT header */ /* Co-author is Mr. Masatoshi Watanabe */ { fprintf(OutFile,"%%JIS2MF Version 2.00 of 14 April 1991.\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"%% Font=%s\n",RunTime->FileName); if (RunTime->FixedX) fprintf(OutFile,"%% Fixed Width\n"); else fprintf(OutFile,"%% Proportional Width\n"); if (RunTime->FixedY) fprintf(OutFile,"%% Fixed Height\n"); else fprintf(OutFile,"%% Proportional Height\n"); if (RunTime->Standard) fprintf(OutFile,"%% Standard Positioning\n"); else fprintf(OutFile,"%% Dictionary Positioning\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"tracingstats:=1;\n"); fprintf(OutFile,"screen_cols:=640; %%VGA\n"); fprintf(OutFile,"screen_rows:=480; %%VGA\n"); fprintf(OutFile,"font_size 10pt#;\n"); if (RunTime->Standard) { fprintf(OutFile,"u#:=12.7/36pt#;\n"); fprintf(OutFile,"body_height#:=23.25u#;\n"); fprintf(OutFile,"desc_depth#:=4.75u#;\n"); } else { fprintf(OutFile,"u#:=13/36pt#;\n"); fprintf(OutFile,"body_height#:=21u#;\n"); fprintf(OutFile,"desc_depth#:=7u#;\n"); } fprintf(OutFile,"\n"); fprintf(OutFile,"letter_fit#:=0pt#;\n"); fprintf(OutFile,"asc_height#:=0pt#;\n"); fprintf(OutFile,"cap_height#:=0pt#;\n"); fprintf(OutFile,"fig_height#:=0pt#;\n"); fprintf(OutFile,"x_height#:=0pt#;\n"); fprintf(OutFile,"math_axis#:=0pt#;\n"); fprintf(OutFile,"bar_height#:=0pt#;\n"); fprintf(OutFile,"comma_depth#:=0pt#;\n"); fprintf(OutFile,"crisp#:=0pt#;\n"); fprintf(OutFile,"tiny#:=0pt#;\n"); fprintf(OutFile,"fine#:=0pt#;\n"); fprintf(OutFile,"thin_join#:=0pt#;\n"); fprintf(OutFile,"hair#:=1pt#;\n"); fprintf(OutFile,"stem#:=1pt#;\n"); fprintf(OutFile,"curve#:=1pt#;\n"); fprintf(OutFile,"flare#:=1pt#;\n"); fprintf(OutFile,"dot_size#:=0pt#;\n"); fprintf(OutFile,"cap_hair#:=1pt#;\n"); fprintf(OutFile,"cap_stem#:=1pt#;\n"); fprintf(OutFile,"cap_curve#:=1pt#;\n"); fprintf(OutFile,"rule_thickness#:=0pt#;\n"); fprintf(OutFile,"vair#:=0pt#;\n"); fprintf(OutFile,"notch_cut#:=0pt#;\n"); fprintf(OutFile,"bar#:=1pt#;\n"); fprintf(OutFile,"slab#:=1pt#;\n"); fprintf(OutFile,"cap_bar#:=1pt#;\n"); fprintf(OutFile,"cap_band#:=1pt#;\n"); fprintf(OutFile,"cap_notch_cut#:=0pt#;\n"); fprintf(OutFile,"serif_drop#:=0pt#;\n"); fprintf(OutFile,"stem_corr#:=0pt#;\n"); fprintf(OutFile,"vair_corr#:=0pt#;\n"); fprintf(OutFile,"o#:=0pt#;\n"); fprintf(OutFile,"apex_o#:=0pt#;\n"); fprintf(OutFile,"hefty:=true;\n"); fprintf(OutFile,"serifs:=true;\n"); fprintf(OutFile,"monospace:=false;\n"); fprintf(OutFile,"math_fitting:=false;\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"mode_setup;\n"); fprintf(OutFile,"font_setup;\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"pair z;\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"def s(expr col,row)= %%square\n"); fprintf(OutFile," z:=((col*u),(row*u));\n"); fprintf(OutFile," fill unitsquare scaled u shifted z;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def sul(expr col,row)= %%upper left square\n"); fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n"); fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def sur(expr col,row)= %%upper right square\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def sbr(expr col,row)= %%bottom right square\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n"); fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def sbl(expr col,row)= %%bottom left square\n"); fprintf(OutFile," z:=((col*u),(row*u));\n"); fprintf(OutFile," fill unitsquare scaled .5u shifted z;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"def c(expr col,row)= %%circle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill fullcircle scaled u shifted z;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def cul(expr col,row)= %%upper left circle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--quartercircle rotated 90 scaled u shifted z--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def cur(expr col,row)= %%upper right circle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--quartercircle scaled u shifted z--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def cbr(expr col,row)= %%bottom right circle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--quartercircle rotated 270 scaled u shifted z--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def cbl(expr col,row)= %%bottom left circle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--quartercircle rotated 180 scaled u shifted z--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"def tul(expr col,row)= %%upper left triangle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--z+(0,.5u)--z-(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tur(expr col,row)= %%upper right triangle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--z+(0,.5u)--z+(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tbr(expr col,row)= %%bottom right triangle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--z-(0,.5u)--z+(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tbl(expr col,row)= %%bottom left triangle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--z-(0,.5u)--z-(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"def rul(expr col,row)= %%upper left reverse triangle\n"); fprintf(OutFile," z:=((col*u),(row*u)+u);\n"); fprintf(OutFile," fill z--z-(0,.5u)--z+(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rur(expr col,row)= %%upper right reverse triangle\n"); fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n"); fprintf(OutFile," fill z--z-(0,.5u)--z-(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rbr(expr col,row)= %%bottom right reverse triangle\n"); fprintf(OutFile," z:=((col*u)+u,(row*u));\n"); fprintf(OutFile," fill z--z+(0,.5u)--z-(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rbl(expr col,row)= %%bottom left reverse triangle\n"); fprintf(OutFile," z:=((col*u),(row*u));\n"); fprintf(OutFile," fill z--z+(0,.5u)--z+(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"def tuul(expr col,row)= %%upper left long triangle\n"); fprintf(OutFile," z:=((col*u)+u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--z+(0,.5u)--z-(u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tull(expr col,row)= %%upper left long triangle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n"); fprintf(OutFile," fill z--z+(0,u)--z-(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tuur(expr col,row)= %%upper right long triangle\n"); fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n"); fprintf(OutFile," fill z--z+(0,.5u)--z+(u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def turr(expr col,row)= %%upper right long triangle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u));\n"); fprintf(OutFile," fill z--z+(0,u)--z+(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tbbr(expr col,row)= %%bottom right long triangle\n"); fprintf(OutFile," z:=((col*u),(row*u)+.5u);\n"); fprintf(OutFile," fill z--z-(0,.5u)--z+(u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tbrr(expr col,row)= %%bottom right long triangle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+u);\n"); fprintf(OutFile," fill z--z-(0,u)--z+(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tbbl(expr col,row)= %%bottom left long triangle\n"); fprintf(OutFile," z:=((col*u)+u,(row*u)+.5u);\n"); fprintf(OutFile," fill z--z-(0,.5u)--z-(u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def tbll(expr col,row)= %%bottom left long triangle\n"); fprintf(OutFile," z:=((col*u)+.5u,(row*u)+u);\n"); fprintf(OutFile," fill z--z-(0,u)--z-(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"\n"); fprintf(OutFile,"def ruul(expr col,row)= %%upper left reverse long triangle\n"); fprintf(OutFile," z:=((col*u),(row*u)+u);\n"); fprintf(OutFile," fill z--z-(0,u)--z+(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rull(expr col,row)= %%upper left reverse long triangle\n"); fprintf(OutFile," z:=((col*u),(row*u)+u);\n"); fprintf(OutFile," fill z--z-(0,.5u)--z+(u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def ruur(expr col,row)= %%upper right reverse long triangle\n"); fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n"); fprintf(OutFile," fill z--z-(0,u)--z-(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rurr(expr col,row)= %%upper right reverse long triangle\n"); fprintf(OutFile," z:=((col*u)+u,(row*u)+u);\n"); fprintf(OutFile," fill z--z-(0,.5u)--z-(u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rbbr(expr col,row)= %%bottom right reverse long triangle\n"); fprintf(OutFile," z:=((col*u)+u,(row*u));\n"); fprintf(OutFile," fill z--z+(0,u)--z-(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rbrr(expr col,row)= %%bottom right reverse long triangle\n"); fprintf(OutFile," z:=((col*u)+u,(row*u));\n"); fprintf(OutFile," fill z--z+(0,.5u)--z-(u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rbbl(expr col,row)= %%bottom left reverse long triangle\n"); fprintf(OutFile," z:=((col*u),(row*u));\n"); fprintf(OutFile," fill z--z+(0,u)--z+(.5u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"def rbll(expr col,row)= %%bottom left reverse long triangle\n"); fprintf(OutFile," z:=((col*u),(row*u));\n"); fprintf(OutFile," fill z--z+(0,.5u)--z+(u,0)--cycle;\n"); fprintf(OutFile,"enddef;\n"); fprintf(OutFile,"\n"); if (ferror(OutFile)) exit(1); } void ActiveBitmap(FILE *OutFile, BitmapType Bitmap, int X, int Y, int XX, float YY) /* Writes METAFONT code for an active cell */ /* Co-author is Mr. Masatoshi Watanabe */ { int SquareUR,SquareUL,SquareBR,SquareBL; int CircleUR,CircleUL,CircleBR,CircleBL; int LTryUUR,LTryURR,LTryUUL,LTryULL; int LTryBBR,LTryBRR,LTryBBL,LTryBLL; SquareUL=(Bitmap[X-1][Y] || Bitmap[X-1][Y+1] || Bitmap[X][Y+1]); SquareUR=(Bitmap[X+1][Y] || Bitmap[X+1][Y+1] || Bitmap[X][Y+1]); SquareBL=(Bitmap[X-1][Y] || Bitmap[X-1][Y-1] || Bitmap[X][Y-1]); SquareBR=(Bitmap[X+1][Y] || Bitmap[X+1][Y-1] || Bitmap[X][Y-1]); CircleUL=(!Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] && !Bitmap[X][Y+1] && !Bitmap[X+1][Y+1]); CircleUR=(!Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] && !Bitmap[X][Y+1] && !Bitmap[X-1][Y+1]); CircleBL=(!Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] && !Bitmap[X][Y-1] && !Bitmap[X+1][Y-1]); CircleBR=(!Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] && !Bitmap[X][Y-1] && !Bitmap[X-1][Y-1]); LTryUUL=(Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] && !Bitmap[X][Y+1] && !Bitmap[X+1][Y+1] && Bitmap[X+1][Y]); LTryUUR=(Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] && !Bitmap[X][Y+1] && !Bitmap[X-1][Y+1] && Bitmap[X-1][Y]); LTryBBL=(Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] && !Bitmap[X][Y-1] && !Bitmap[X+1][Y-1] && Bitmap[X+1][Y]); LTryBBR=(Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] && !Bitmap[X][Y-1] && !Bitmap[X-1][Y-1] && Bitmap[X-1][Y]); LTryULL=(!Bitmap[X-1][Y-1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y+1] && !Bitmap[X][Y+1] && Bitmap[X+1][Y+1] && Bitmap[X][Y-1]); LTryURR=(!Bitmap[X+1][Y-1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y+1] && !Bitmap[X][Y+1] && Bitmap[X-1][Y+1] && Bitmap[X][Y-1]); LTryBLL=(!Bitmap[X-1][Y+1] && !Bitmap[X-1][Y] && !Bitmap[X-1][Y-1] && !Bitmap[X][Y-1] && Bitmap[X+1][Y-1] && Bitmap[X][Y+1]); LTryBRR=(!Bitmap[X+1][Y+1] && !Bitmap[X+1][Y] && !Bitmap[X+1][Y-1] && !Bitmap[X][Y-1] && Bitmap[X-1][Y-1] && Bitmap[X][Y+1]); if (LTryUUL) fprintf(OutFile,"tuul(%d,%4.2f);",XX,YY); if (LTryULL) fprintf(OutFile,"tull(%d,%4.2f);",XX,YY); if (LTryUUR) fprintf(OutFile,"tuur(%d,%4.2f);",XX,YY); if (LTryURR) fprintf(OutFile,"turr(%d,%4.2f);",XX,YY); if (LTryBBL) fprintf(OutFile,"tbbl(%d,%4.2f);",XX,YY); if (LTryBLL) fprintf(OutFile,"tbll(%d,%4.2f);",XX,YY); if (LTryBBR) fprintf(OutFile,"tbbr(%d,%4.2f);",XX,YY); if (LTryBRR) fprintf(OutFile,"tbrr(%d,%4.2f);",XX,YY); if (SquareUL && SquareUR && SquareBL && SquareBR) fprintf(OutFile,"s(%d,%4.2f);",XX,YY); else if (CircleUL && CircleUR && CircleBL && CircleBR) fprintf(OutFile,"c(%d,%4.2f);",XX,YY); else { if (!LTryUUL && !LTryULL && !LTryUUR && !LTryBLL) if (SquareUL) fprintf(OutFile,"sul(%d,%4.2f);",XX,YY); else if (CircleUL) fprintf(OutFile,"cul(%d,%4.2f);",XX,YY); else fprintf(OutFile,"tul(%d,%4.2f);",XX,YY); if (!LTryUUL && !LTryURR && !LTryUUR && !LTryBRR) if (SquareUR) fprintf(OutFile,"sur(%d,%4.2f);",XX,YY); else if (CircleUR) fprintf(OutFile,"cur(%d,%4.2f);",XX,YY); else fprintf(OutFile,"tur(%d,%4.2f);",XX,YY); if (!LTryBBL && !LTryULL && !LTryBBR && !LTryBLL) if (SquareBL) fprintf(OutFile,"sbl(%d,%4.2f);",XX,YY); else if (CircleBL) fprintf(OutFile,"cbl(%d,%4.2f);",XX,YY); else fprintf(OutFile,"tbl(%d,%4.2f);",XX,YY); if (!LTryBBL && !LTryURR && !LTryBBR && !LTryBRR) if (SquareBR) fprintf(OutFile,"sbr(%d,%4.2f);",XX,YY); else if (CircleBR) fprintf(OutFile,"cbr(%d,%4.2f);",XX,YY); else fprintf(OutFile,"tbr(%d,%4.2f);",XX,YY); } if (ferror(OutFile)) exit(1); } void InactiveBitmap(FILE *OutFile, BitmapType Bitmap, int X, int Y, int XX, float YY, int *Active) /* Writes METAFONT code for an inactive cell */ /* Co-author is Mr. Masatoshi Watanabe */ { if (Bitmap[X-1][Y] && Bitmap[X][Y+1]) if (Bitmap[X-1][Y-1] && !Bitmap[X+1][Y+1]) { *Active=True; fprintf(OutFile,"ruul(%d,%4.2f);",XX,YY); } else if (Bitmap[X+1][Y+1] && !Bitmap[X-1][Y-1]) { *Active=True; fprintf(OutFile,"rull(%d,%4.2f);",XX,YY); } else { *Active=True; fprintf(OutFile,"rul(%d,%4.2f);",XX,YY); } if (Bitmap[X+1][Y] && Bitmap[X][Y+1]) if (Bitmap[X+1][Y-1] && !Bitmap[X-1][Y+1]) { *Active=True; fprintf(OutFile,"ruur(%d,%4.2f);",XX,YY); } else if (Bitmap[X-1][Y+1] && !Bitmap[X+1][Y-1]) { *Active=True; fprintf(OutFile,"rurr(%d,%4.2f);",XX,YY); } else { *Active=True; fprintf(OutFile,"rur(%d,%4.2f);",XX,YY); } if (Bitmap[X-1][Y] && Bitmap[X][Y-1]) if (Bitmap[X-1][Y+1] && !Bitmap[X+1][Y-1]) { *Active=True; fprintf(OutFile,"rbbl(%d,%4.2f);",XX,YY); } else if (Bitmap[X+1][Y-1] && !Bitmap[X-1][Y+1]) { *Active=True; fprintf(OutFile,"rbll(%d,%4.2f);",XX,YY); } else { *Active=True; fprintf(OutFile,"rbl(%d,%4.2f);",XX,YY); } if (Bitmap[X+1][Y] && Bitmap[X][Y-1]) if (Bitmap[X+1][Y+1] && !Bitmap[X-1][Y-1]) { *Active=True; fprintf(OutFile,"rbbr(%d,%4.2f);",XX,YY); } else if (Bitmap[X-1][Y-1] && !Bitmap[X+1][Y+1]) { *Active=True; fprintf(OutFile,"rbrr(%d,%4.2f);",XX,YY); } else { *Active=True; fprintf(OutFile,"rbr(%d,%4.2f);",XX,YY); } if (ferror(OutFile)) exit(1); } void MiddleOut(FILE *OutFile, struct BitmapsType *Bitmaps, int Number, int Standard) /* Writes METAFONT code for a given Bitmap */ { int X,Y; int Active; fprintf(OutFile,"beginchar(%d,%du#,",Number,Bitmaps->XMax-Bitmaps->XMin+1); if (Standard) { if (Bitmaps->YMax>0.75) fprintf(OutFile,"%4.2fu#,",Bitmaps->YMax-0.75); else fprintf(OutFile,"0,"); if (5.75>Bitmaps->YMin) fprintf(OutFile,"%4.2fu#);\n",5.75-Bitmaps->YMin); else fprintf(OutFile,"0);\n"); } else { if (Bitmaps->YMax>3) fprintf(OutFile,"%du#,",Bitmaps->YMax-3); else fprintf(OutFile,"0,"); if (8>Bitmaps->YMin) fprintf(OutFile,"%du#);\n",8-Bitmaps->YMin); else fprintf(OutFile,"0);\n"); } fprintf(OutFile,"normal_adjust_fit(2u#,2u#);\n"); for (X=Bitmaps->XMin ; X<=Bitmaps->XMax ; X++) for (Y=1 ; Y<=SizeMax ; Y++) { Active=Bitmaps->Bitmap[X][Y]; if (Active) /* Current pixel is on */ if (Standard) ActiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-3.75); else ActiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-6); else /* Current pixel is off */ if (Standard) InactiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-3.75, &Active); else InactiveBitmap(OutFile,Bitmaps->Bitmap,X,Y,X-Bitmaps->XMin,Y-6, &Active); /* Avoid METAFONT buffer overflow */ if (Active) fprintf(OutFile,"\n"); } fprintf(OutFile,"endchar;\n"); fprintf(OutFile,"\n"); if (ferror(OutFile)) exit(1); } void EndOut(FILE *OutFile, struct RunTimeType *RunTime) /* Writes final METAFONT header */ { fprintf(OutFile,"font_identifier \"%s\";\n",RunTime->FileName); if (RunTime->Standard) fprintf(OutFile,"font_coding_scheme \"JemTeX Standard\";\n"); else fprintf(OutFile,"font_coding_scheme \"JemTeX Dictionary\";\n"); fprintf(OutFile,"font_slant slant;\n"); fprintf(OutFile,"font_normal_space 8u#;\n"); fprintf(OutFile,"font_normal_stretch 4u#;\n"); fprintf(OutFile,"font_normal_shrink 3u#;\n"); fprintf(OutFile,"font_x_height 24u#; %%ex\n"); fprintf(OutFile,"font_quad 24u#; %%em\n"); fprintf(OutFile,"font_extra_space 0u#;\n"); fprintf(OutFile,"\n"); /* Must end with CR/LF because of a bug(?) in emTeX METAFONT */ fprintf(OutFile,"bye\n"); if (ferror(OutFile)) exit(1); } /*--------------------------------- Generate --------------------------------*/ void FindWantedBitmap(int Automatic, int *First, int *WantedBitmap, int *Number) /* Finds number of the next desired Bitmap either automatically or manually */ /* The characters 0 and 1 in the first font kanjiaa are both set to Bitmap 1 */ { int Valid; AnswerType Answer; if (Automatic) /* Find automatically */ if (*First) /* Early in font kanjiaa */ if (*WantedBitmap==-1) *WantedBitmap=1; else { *WantedBitmap=1; *First=False; } else if ( (*Number==128) || (*WantedBitmap==BitmapMax) ) *WantedBitmap=0; else (*WantedBitmap)++; else /* Find manually */ do { printf("Bitmap number? "); if (ferror(stdout)) exit(1); if (gets(Answer)==NULL) exit(1); if (1!=sscanf(Answer,"%d",WantedBitmap)) exit(1); Valid=( (0<=*WantedBitmap) && (*WantedBitmap<=BitmapMax) ); if (!Valid) { printf("\7Bitmap %d out of range...\n",*WantedBitmap); if (ferror(stdout)) exit(1); } } while (!Valid); printf("Bitmap number %d.\n",*WantedBitmap); if (ferror(stdout)) exit(1); } void ScanBitmap(FILE *InFile, BitmapType Bitmap, int *Empty) /* Reads the Bitmap in a logical grid */ /* (0,0) is the lower left corner of the Bitmap */ { int Y; BufferType Buffer; struct ColumnType *Column; /* Read the Bitmap */ if (fread(Buffer,(unsigned)RecSize,1U,InFile)!=1U) exit(1); /* Find if the Bitmap is empty */ *Empty=True; for (Y=1 ; Y<=SizeMax ; Y++) { Column=&Buffer[Y-1]; if ( (Column->Data1!=(unsigned char)'\x00') || (Column->Data2!=(unsigned char)'\x00') || (Column->Data3!=(unsigned char)'\x00') ) { *Empty=False; break; } } /* Update logical grid */ if (!*Empty) for (Y=1 ; Y<=SizeMax ; Y++) { Column=&Buffer[SizeMax-Y]; Bitmap[ 1][Y]=(int)(Column->Data1 & (unsigned char)'\x80'); Bitmap[ 2][Y]=(int)(Column->Data1 & (unsigned char)'\x40'); Bitmap[ 3][Y]=(int)(Column->Data1 & (unsigned char)'\x20'); Bitmap[ 4][Y]=(int)(Column->Data1 & (unsigned char)'\x10'); Bitmap[ 5][Y]=(int)(Column->Data1 & (unsigned char)'\x08'); Bitmap[ 6][Y]=(int)(Column->Data1 & (unsigned char)'\x04'); Bitmap[ 7][Y]=(int)(Column->Data1 & (unsigned char)'\x02'); Bitmap[ 8][Y]=(int)(Column->Data1 & (unsigned char)'\x01'); Bitmap[ 9][Y]=(int)(Column->Data2 & (unsigned char)'\x80'); Bitmap[10][Y]=(int)(Column->Data2 & (unsigned char)'\x40'); Bitmap[11][Y]=(int)(Column->Data2 & (unsigned char)'\x20'); Bitmap[12][Y]=(int)(Column->Data2 & (unsigned char)'\x10'); Bitmap[13][Y]=(int)(Column->Data2 & (unsigned char)'\x08'); Bitmap[14][Y]=(int)(Column->Data2 & (unsigned char)'\x04'); Bitmap[15][Y]=(int)(Column->Data2 & (unsigned char)'\x02'); Bitmap[16][Y]=(int)(Column->Data2 & (unsigned char)'\x01'); Bitmap[17][Y]=(int)(Column->Data3 & (unsigned char)'\x80'); Bitmap[18][Y]=(int)(Column->Data3 & (unsigned char)'\x40'); Bitmap[19][Y]=(int)(Column->Data3 & (unsigned char)'\x20'); Bitmap[20][Y]=(int)(Column->Data3 & (unsigned char)'\x10'); Bitmap[21][Y]=(int)(Column->Data3 & (unsigned char)'\x08'); Bitmap[22][Y]=(int)(Column->Data3 & (unsigned char)'\x04'); Bitmap[23][Y]=(int)(Column->Data3 & (unsigned char)'\x02'); Bitmap[24][Y]=(int)(Column->Data3 & (unsigned char)'\x01'); } } void ScanSides(struct BitmapsType *Bitmaps, int FixedX, int FixedY) /* Determines the minimal size of the Bitmap for proportional spacing */ { int X,Y; if (FixedX) { Bitmaps->XMin=1; Bitmaps->XMax=SizeMax; } else { Bitmaps->XMin=SizeMax1; for (X=SizeMax ; X>=1 ; X--) for (Y=1 ; Y<=SizeMax ; Y++) if (Bitmaps->Bitmap[X][Y]) Bitmaps->XMin=X; Bitmaps->XMax=0; for (X=1 ; X<=SizeMax ; X++) for (Y=1 ; Y<=SizeMax ; Y++) if (Bitmaps->Bitmap[X][Y]) Bitmaps->XMax=X; } if (FixedY) { Bitmaps->YMin=1; Bitmaps->YMax=SizeMax; } else { Bitmaps->YMin=SizeMax1; for (Y=SizeMax ; Y>=1 ; Y--) for (X=1 ; X<=SizeMax ; X++) if (Bitmaps->Bitmap[X][Y]) Bitmaps->YMin=Y; Bitmaps->YMax=0; for (Y=1 ; Y<=SizeMax ; Y++) for (X=1 ; X<=SizeMax ; X++) if (Bitmaps->Bitmap[X][Y]) Bitmaps->YMax=Y; } } void Generate(FILE *InFile, FILE *OutFile, int *Number, struct RunTimeType *RunTime) /* Generates the METAFONT code for the selected font */ { /* Bitmap pointers */ int CurrentBitmap,WantedBitmap; /* Current Bitmap and its dimensions */ struct BitmapsType Bitmaps; int X,Y; /* Indicates early in font kanjiaa */ int First; /* Indicates current Bitmap is empty */ int Empty; /* Clear the area outside the Bitmap once and for all */ for (X=0 ; X<=SizeMax1 ; X++) { Bitmaps.Bitmap[X][0]=False; Bitmaps.Bitmap[X][SizeMax1]=False; } for (Y=1 ; Y<=SizeMax ; Y++) { Bitmaps.Bitmap[0][Y]=False; Bitmaps.Bitmap[SizeMax1][Y]=False; } /* Number of the Bitmap ready to be read */ CurrentBitmap=1; /* First METAFONT character number */ *Number=0; /* First Bitmap wanted */ if (RunTime->Automatic) { WantedBitmap=1024 * ( toupper(RunTime->FileName[5])-'A' ) + 128 * ( toupper(RunTime->FileName[6])-'A' ) - 1; First=(WantedBitmap==-1); } do { FindWantedBitmap(RunTime->Automatic,&First,&WantedBitmap,Number); if (WantedBitmap) { /* Position pointer */ if (WantedBitmap!=CurrentBitmap) { if ( fseek(InFile , ((WantedBitmap-1L)*RecSize) , 0) ) exit(1); CurrentBitmap=WantedBitmap; } printf("Reading Bitmap"); if (ferror(stdout)) exit(1); ScanBitmap(InFile,Bitmaps.Bitmap,&Empty); CurrentBitmap++; printf(".\n"); if (ferror(stdout)) exit(1); /* Process Bitmap */ if (Empty) printf("Bitmap is empty, no METAFONT code %d.\n",*Number); else { printf("Writing METAFONT code %d",*Number); ScanSides(&Bitmaps,RunTime->FixedX,RunTime->FixedY); MiddleOut(OutFile,&Bitmaps,*Number,RunTime->Standard); printf(".\n"); } printf("\n"); if (ferror(stdout)) exit(1); /* Ready to generate next METAFONT character */ (*Number)++; } } while (WantedBitmap); } /*----------------------------------- Main ----------------------------------*/ main(int argc, char *argv[]) { /* JIS24 and METAFONT file names */ FILE *InFile; FILE *OutFile; TotalNameType TotalName; /* Current METAFONT character number */ int Number; /* Run time parameters */ struct RunTimeType RunTime; printf("\n"); printf("Bitmaps to METAFONT Conversion Program.\n"); /*To make Borland happy*/ printf("Version 2.00 Copyright F. Jalbert 1991.\n"); printf("\n"); if (ferror(stdout)) exit(1); printf("Opening Bitmap file JIS24"); InFile=fopen("jis24","rb"); if (InFile==NULL) exit(1); printf(".\n"); printf("\n"); if (ferror(stdout)) exit(1); GetParameters(&RunTime,argc,argv); strcpy(TotalName,RunTime.FileName); strcat(TotalName,".mf"); printf("Creating METAFONT file %s",TotalName); OutFile=fopen(TotalName,"wt"); if (OutFile==NULL) exit(1); printf(".\n"); printf("\n"); if (ferror(stdout)) exit(1); printf("Writing initial METAFONT header"); #ifndef __TURBOC__ printf("\n"); #endif BeginOut(OutFile,&RunTime); printf(".\n"); printf("\n"); Generate(InFile,OutFile,&Number,&RunTime); printf("\n"); if (ferror(stdout)) exit(1); printf("Writing final METAFONT header"); #ifndef __TURBOC__ printf("\n"); #endif EndOut(OutFile,&RunTime); printf(".\n"); printf("Closing METAFONT file %s",TotalName); if (fclose(OutFile)==EOF) exit(1); printf(".\n"); printf("Closing Bitmap file JIS24"); if (fclose(InFile)==EOF) exit(1); printf(".\n"); printf("\n"); if (ferror(stdout)) exit(1); printf("METAFONT code for %d Bitmap(s) generated.\n",Number); printf("\n"); if (ferror(stdout)) exit(1); return(0); }