#include #include #include #include "system.h" #include "stdio.h" #include "defines.h" #include "object.h" #include "dict.h" #include "njerq.h" #include "font.h" #include "map.h" #define MAXCH 100 /*max height/width of char bitmap*/ char *tnames[] = { "SSn", "Rn", "Bn", "In", "BIn", "Hn", "HIn", "HBn", "HBOn","CWn", 0}; extern struct dict *Systemdict; extern struct pstring se_tab[], sye_tab[]; #ifdef VAX extern unsigned char bytemap[256]; #endif extern struct object FontMatrix, ImageMatrix, FontBBox, Encoding, Buildchar, FontType, BHeight, Chardata, none, FID, FontDirectory, CharStrings, SCharstrings, Charstrings, FontInfo, Fontinfo; struct object blank, zero; int findex; int dontcache, dontoutput; int maxw, stdflag, width; char *outname; void main(int, char *[]), initfont(void); int getwidths(char *, double[]); void mkchar(myFont *, int, struct object, double, double[], int); myFont *getfont(char[], int); struct object getbits(myFont *, int); int fnum; double widths[256]; void main(int argc, char *argv[]){ char **t; int i; if(argc == 2 && *argv[1] == '-'){ fprintf(stderr,"specify font number from:\n"); for(t=tnames, i=0;*t != 0;t++, i++) fprintf(stderr,"%s %d\n",*t,i); exits("error"); } if(argc == 2 && *argv[1] >= '0' && *argv[1] <= '9') fnum = atoi(argv[1]); else fnum = -1; init((char *)0); exits(""); } void initfont(void) { struct fonttab *fonttbl; int *fontbits; unsigned char *cp; char namebuf[50], *p, *charname; static struct object cnames[256]; myFont *fp; Fontchar *fc; double base; int k, j, n, index, i; for(j=0;j<256;j++){ if(se_tab[j].length != 0) cnames[j] = pckname(se_tab[j],XA_LITERAL); } if(fnum < 0)k=0; else k=fnum; for(; tnames[k] != 0 && k <= fnum; k++){ findex=0; fprintf(stderr,"%s ",tnames[k]); sprintf(namebuf,"%s.16.1",tnames[k]); fp = getfont(namebuf, 0); getwidths(tnames[k],widths); if(fp == (myFont *)0){ fprintf(stderr,"can't open file %s.16.1\n", tnames[k]); exits("error"); } base = (double)fp->height; fprintf(stderr,"%d %d %d\n",fp->height,maxw,fp->ascent); if(!k){ for(j=0;j<256;j++){ if(sye_tab[j].length != 0) mkchar(fp,j,pckname(sye_tab[j],XA_LITERAL),base,widths,j); } } else{ for(j=0;j<256;j++){ if(se_tab[j].length != 0) mkchar(fp,j,cnames[j],base,widths,j); } } } } void mkchar(myFont *fp, int j,struct object charname, double base, double wid[], int rind) { Fontchar *fc; struct object chardata; int sleft, rheight; fc = fp->info + j; if(fc->width == 0){ return; } rheight = fc->bottom-fc->top+1; if(base-(double)(fc->top) < rheight) rheight = (int)(base-(double)(fc->top)); fprintf(stderr,"char %d %s index %d ",rind,charname.value.v_string.chars,findex); #ifdef AHMDAL if(fc->left&0200)sleft=fc->left - 256; else sleft=fc->left; sleft = fc->left; fprintf(stderr,"%d %d %d %f %f ",fc->width+abs(sleft),rheight,sleft, wid[j],base-(double)(fc->top)); #else fprintf(stderr,"%d %d %d %f %f ",fc->width+abs(fc->left),rheight,fc->left, wid[j],base-(double)(fc->top)); #endif getbits(fp,j); } int junk=0; struct object getbits(myFont *fp, int c) { unsigned char bits[500], *bt; unsigned char *ch; struct object obj; int j, k,size,height,l=0; unsigned int cbits; unsigned char *cx; static Bitmap *b; Fontchar *fc; Word *sp; int sleft; if(b == (Bitmap *)0)b=balloc(Rect(0, 0, MAXCH,MAXCH),0); else rectf(b, Rect(0, 0, MAXCH,MAXCH),Zero); fc = fp->info+c; height = fc->bottom - fc->top + 1; bitblt(b,Pt(0,0),fp->bits, Rect(fc->x,fc->top,(fc+1)->x,fc->bottom),S); bt = bits; sp = b->base; #ifdef AHMDAL if(fc->left&0200)sleft = fc->left-256; else sleft = fc->left; sleft = fc->left; #else sleft = fc->left; #endif for(k=height;k>0;k--){ ch = (unsigned char *)sp; for(j=0;j < (int)(fc->width+abs(sleft)+7)/8; j++,ch++){ #ifdef VAX *bt++ = bytemap[*ch]; /* map only for vax */ #else *bt++ = *ch; } sp += b->width; } size = bt-bits; fprintf(stderr,"%d %d %d\n",size,(fc+1)->x-fc->x,(int)(fc->width+abs(fc->left)+7)/8); obj = makestring(size); ch =obj.value.v_string.chars; cx =(unsigned char *) &cbits; for(k=j=0, bt=bits;k