void ffw_auto_hint(void) { // convert to quadratic if(!(cur_fv->sf->layers[ly_fore].order2)) { SFCloseAllInstrs(cur_fv->sf); SFConvertToOrder2(cur_fv->sf); } memset(cur_fv->selected, 1, cur_fv->map->enccount); FVAutoHint(cur_fv); FVAutoInstr(cur_fv); }
SplineFont *SFReadIkarus(char *fontname) { SplineFont *sf; FILE *file = fopen(fontname,"rb"); int ch1, ch2, rpos, wpos, i; int hlen, ilen, jlen, llen, mlen; int numchars, maxnum, opt_pt_size; double italic_angle; char fnam[13], fullname[81]; int32 *offsets, *numbers; if ( file==NULL ) return( NULL ); hlen = getushort(file); /* Length of font header */ ilen = getushort(file); /* Length of name section */ getushort(file); /* Number on URW list */ fread(fnam,1,12,file); /* 6 words of filename */ fread(fullname,1,80,file); /* 40 words of fontname (human readable) */ fnam[12] = fullname[80] = '\0'; ch1 = getc(file); ch2 = getc(file); if ( ch1=='i' || ch2=='k' ) /* Docs don't mention this, but lower case is ok too */; else if ( ch1!='I' || ch2!='K' ) { if ( (ch1=='D' && ch2=='I') || (ch1=='V' && ch2=='C') || (ch1=='V' && ch2=='S') || (ch1=='V' && ch2=='E') || (ch1=='S' && ch2=='C') || (ch1=='S' && ch2=='N') || (ch1=='B' && ch2=='I') || (ch1=='G' && isdigit(ch2)) || (ch1=='d' && ch2=='i') || (ch1=='v' && ch2=='c') || (ch1=='v' && ch2=='s') || (ch1=='v' && ch2=='e') || (ch1=='s' && ch2=='c') || (ch1=='s' && ch2=='n') || (ch1=='b' && ch2=='i') || (ch1=='g' && isdigit(ch2))) LogError( _("This is probably a valid URW font, but it is in a format (%c%c) which FontForge\ndoes not support. FontForge only supports 'IK' format fonts.\n"), ch1, ch2 ); else if ( ch1==0 && ch2==0 && ilen==55 ) LogError( _("This looks like an ikarus format which I have seen examples of, but for which\nI have no documentation. FontForge does not support it yet.\n") ); fclose(file); return( NULL ); } else if ( ilen<55 || hlen<=ilen ) { fclose(file); return( NULL ); } if ( ilen!=55 ) LogError( _("Unexpected size for name section of URW font (expected 55, got %d)\n"), ilen ); fseek(file,2*ilen+2,SEEK_SET); jlen = getushort(file); if ( jlen<12 || hlen<=jlen+ilen ) { fclose(file); return( NULL ); } if ( jlen!=12 ) LogError( _("Unexpected size for font info section of URW font (expected 12, got %d)\n"), jlen ); if ( getushort(file)!=1 ) { /* 1=> typeface */ fclose(file); return( NULL ); } numchars = getushort(file); /* cap height = */ getushort(file); /* body size = */ getushort(file); /* x-height = */ getushort(file); /* descender? = */ getushort(file); /* line thickness = */ getushort(file); /* stroke thickness = */ getushort(file); italic_angle = getushort(file)/10.0 * 3.1415926535897932/180.0; opt_pt_size = getushort(file); /* average char width = */ getushort(file); fseek(file,2*ilen+2*jlen+2,SEEK_SET); llen = getushort(file); /* the hierarchy section is unused in font files */ if ( llen!=1 || hlen<=jlen+ilen+llen ) { fclose(file); return( NULL ); } mlen = getushort(file); /* Peter Karow's book documents that hlen==jlen+ilen+llen+mlen+1, but this*/ /* does not appear to be the case. */ if ( hlen<jlen+ilen+llen+mlen+1 || mlen<3*numchars+3 ) { fclose(file); return( NULL ); } /* last record */ getushort(file); /* last word of last record */ getushort(file); offsets = malloc(numchars*sizeof(int32)); numbers = malloc(numchars*sizeof(int32)); maxnum = 0; for ( i=0; i<numchars; ++i ) { numbers[i] = getushort(file); if ( numbers[i]>maxnum ) maxnum = numbers[i]; rpos = getushort(file); /* record pos (1 record=2048 words) */ wpos = getushort(file); /* word pos in record */ offsets[i] = (rpos-1)*4096 + 2*(wpos-1); } sf = SplineFontBlank(numchars/*maxnum+1*/); IkarusFontname(sf,fullname,fnam); sf->italicangle = italic_angle; sf->ascent = 12000; sf->descent = 3000; /* Ikarus fonts live in a 15,000 em world */ for ( i=0; i<sf->glyphcnt; ++i ) if ( sf->glyphs[i]!=NULL ) sf->glyphs[i]->width = sf->glyphs[i]->vwidth = 15000; sf->map = EncMapNew(numchars,numchars,&custom); for ( i=0; i<numchars; ++i ) { fseek(file,offsets[i],SEEK_SET); IkarusReadChar(SFMakeChar(sf,sf->map,i),file); } if ( loaded_fonts_same_as_new && new_fonts_are_order2 ) SFConvertToOrder2(sf); free(numbers); free(offsets); fclose(file); return( sf ); }