/* VGA2MF.C is Copyright 1990 Humanities and Arts Computing Center */ /* usage: vga2mf [vgafontname] [metafont_sourcecode_output_file] */ /* suggestions to ridgeway@blake.acs.washington.edu */ /* history: */ /* v. 1.0 released 4/25/1990 */ /* this is a minimally modified version of Ega2mf */ /* modifications to handle larger VGA character cell */ /* one might also modify egamf to accept a -v switch */ /* to permit one program to do both */ /* but _we_ didn't do it that way because . . . */ /* "So many programs, so little time . . . */ #include #include /* the charblock structure is used for processing each character */ typedef struct { unsigned char column[8]; } videorow; typedef struct { videorow row[16]; } charblock; /* the vga font is a naked 8x16 bitmap 256 chars deep */ typedef struct { unsigned char bitmap[16]; } vgachar; typedef struct { vgachar charset[256]; } vgafont; /* globally accessible area */ charblock editchar; /* global vars and strings */ char infilename[128]; char outfilename[128]; jumpout() { exit(1); } void copyright() { puts("VGA2Mf Screen font --> METAFONT code generator\n"); puts("HUMANITIES AND ARTS COMPUTING CENTER, DR-10"); puts("UNIVERSITY OF WASHINGTON, SEATTLE WA 98195 USA\n"); puts("Copyright 1990 Humanities and Arts Computing Center\n"); puts("This software may be used, modified, and redistributed free of any"); puts("fee or royalty, provided that this copyright and 'free software' notice"); puts("remains intact in any copies redistributed, and that you may charge no fee"); puts("of any sort whatsoever without the written permission of the Humanities"); puts("and Arts Computing Center."); return; } void exists (char *filename) { unsigned char response; FILE *handle; handle = fopen ( filename , "rb" ) ; if (handle != (FILE *) NULL) { fclose(handle); printf("File %s already exists: O.K. to replace? (Y/N): ", filename); response = getchar(); if ( ! ( (response=='y') || (response=='Y') ) ) { printf("\nPlease rename files as necessary and try again.\n"); jumpout(); } } return; } FILE *getopen(char *filename, char *access) { int temp; FILE *handle; gets(filename); if (access[0]=='w' || access[0]=='W') exists(filename); handle=fopen(filename,access); if (handle == NULL) { puts("\nCan't open file "); puts(filename); puts("\n"); } return handle; } FILE *get_file(char *access,char *prompt,char *filename) { printf("\n %s",prompt); return getopen(filename,access); } void makedisplay(unsigned char thischar, vgafont *thisfont) { int temp,mask,i,k,hold; for (i=0; i<16; i++) { temp=thisfont->charset[thischar].bitmap[i]; mask=0x80; for (k=0; k<8; k++) { hold=temp & mask; if (hold==0) editchar.row[i].column[k]=0; else editchar.row[i].column[k]=1; mask=mask / 2; } /* endfor k */ } /* endfor i */ return; } main(int argc, char *argv[]) { FILE *f1=(FILE *) NULL; FILE *f2=(FILE *) NULL; int done,ch,i,k,codeout; char quote,percent; vgafont *thisvga; quote=34; percent=37; /* yes, yes! we are assuming the ASCII character set */ copyright(); thisvga = (vgafont *) malloc(sizeof(vgafont)); if (argc > 1) { f1 = fopen(argv[1],"rb"); (void) strcpy(infilename,argv[1]); } if (f1 == (FILE *) NULL) { /* prompt for and open input file */ for ( ; f1 == (FILE *) NULL; f1=get_file("rb","Enter name of input vga font file: ",infilename)) ; } fread(thisvga,sizeof(vgafont),1,f1); fclose(f1); if (argc > 2) { (void) strcpy(outfilename,argv[2]); exists(outfilename); f2 = fopen(argv[2],"w"); } if (f2 == (FILE *) NULL) { /* prompt for and open output file */ for ( ; f2 == (FILE *) NULL; f2=get_file("w","Enter name of output Metafont source file: ",outfilename)) ; } fprintf(f2,"%c This is %s generated by VGA2MF from %s.\n",percent,outfilename,infilename); fprintf(f2,"if unknown cmbase: input cmbase fi\n"); fprintf(f2,"mode_setup;\n"); fprintf(f2,"def generate suffix t= enddef;\n"); fprintf(f2,"input cmtt10; font_setup;\n"); fprintf(f2,"if ligs>1: font_coding_scheme:=%cTeX text%c;\n",quote,quote); fprintf(f2,"else: font_coding_scheme:=if ligs=0: %cTeX typewriter text%c\n",quote,quote); fprintf(f2," else: %cTeX text without f-ligatures%c fi; fi \n",quote,quote); fprintf(f2,"numeric cheight; cheight=body_height+desc_depth;\n"); fprintf(f2,"numeric hhalf; numeric vhalf; hhalf=.4u; vhalf=(cheight)/36;\n"); fprintf(f2,"numeric vcent; vcent=cheight/32; numeric hcent; hcent=9/16u;\n"); fprintf(f2,"def crt(expr row,col) =\n"); fprintf(f2,"y.c:=body_height-(row * cheight / 16)-vcent; x.c:=hcent+(col * 9/8u);\n"); fprintf(f2,"y.a:=y.c+vhalf; y.b:=y.c-vhalf;\n"); fprintf(f2,"x.a:=x.c-hhalf; x.b:=x.c+hhalf;\n"); fprintf(f2,"filldraw (x.a,y.b)..(x.a,y.a)..(x.b,y.a)..(x.b,y.b)..cycle;\n"); fprintf(f2,"enddef;\n"); printf("Now processing character "); for (ch=0; ch<256; ch++) { /* generate code for character ch */ if ( (ch < 32) || (ch > 126) ) printf("[%d] ",ch); else printf("[%c] ",ch); fprintf(f2,"\nbeginchar(%d,9u#,body_height#,desc_depth#);",ch); fprintf(f2,"adjust_fit(0,0);\npickup pencircle scaled 0.2pt;\n"); makedisplay(ch,thisvga); for(i=0; i < 16; i++) { codeout=0; for(k=0; k<8; k++) { if (editchar.row[i].column[k] != 0) { fprintf(f2,"crt(%d,%d); ",i,k); codeout=1; } /* endif set dot on */ } /* end k */ if (codeout > 0) fprintf(f2,"\n"); } /* endfor i */ fprintf(f2,"endchar;\n"); if ( ( ch % 16 ) == 0 ) printf("\n"); } /* endfor ch */ fprintf(f2,"\n"); fprintf(f2,"font_slant slant; font_x_height x_height#;\n"); fprintf(f2," font_normal_space 9u#;\n"); fprintf(f2," font_quad 18u#;\n"); fprintf(f2," font_extra_space 9u#;\n"); fprintf(f2,"bye.\n"); printf("\nVGA2MF is done. Good luck with your new font.\n"); fclose(f2); }