mkfont: Add support for TTC fonts (and other fonts with multiple faces).

This commit is contained in:
Marisa the Magician 2024-01-08 18:19:01 +01:00
commit 740ab8e81b

View file

@ -352,7 +352,7 @@ int main( int argc, char **argv )
{
if ( argc < 3 )
{
fprintf(stderr,"usage: mkfont <font name> <pxsize> <unicode range (hex)>"
fprintf(stderr,"usage: mkfont <font name>[:face index] <pxsize> <unicode range (hex)>"
" [gradient type (0,11)] [color palette] [-palinv]\n");
return 1;
}
@ -376,12 +376,38 @@ int main( int argc, char **argv )
}
if ( argc > 6 ) palinv = !strcmp(argv[6],"-palinv");
if ( argc > 5 ) loadpalette(argv[5]);
if ( FT_New_Face(ftlib,argv[1],0,&fnt) )
char *fidx = strrchr(argv[1],':');
int fnum = 0;
if ( fidx )
{
fprintf(stderr,"error: failed to open font '%s'\n",argv[1]);
*fidx = 0;
sscanf(fidx+1,"%d",&fnum);
}
if ( FT_New_Face(ftlib,argv[1],fnum,&fnt) )
{
if ( fidx ) fprintf(stderr,"error: failed to open font '%s' face %d.\n",argv[1],fnum);
else fprintf(stderr,"error: failed to open font '%s'.\n",argv[1]);
return 4;
}
fprintf(stderr,"info: loaded font \'%s %s\'.\n",fnt->family_name,fnt->style_name);
int nfnt = fnt->num_faces;
if ( !fidx && (nfnt > 1) )
{
fprintf(stderr,"info: loaded font has %d faces, you may want to load a specific one (see below).\n",nfnt);
FT_Done_Face(fnt);
for ( int i=0; i<nfnt; i++ )
{
if ( FT_New_Face(ftlib,argv[1],i,&fnt) )
{
fprintf(stderr,"error: failed to open font '%s' face %d. Skipping.\n",argv[1],i);
continue;
}
fprintf(stderr,"info: face %d: \'%s %s\'.\n",i,fnt->family_name,fnt->style_name);
FT_Done_Face(fnt);
}
FT_Done_FreeType(ftlib);
return 0;
}
if ( !strcmp(fnt->family_name,"tewi") ) tewi_hotfix = 1;
else if ( !strcmp(fnt->family_name,"miniwi") ) miniwi_hotfix = 1;
if ( FT_Set_Pixel_Sizes(fnt,0,pxsiz) )
@ -481,7 +507,7 @@ int main( int argc, char **argv )
int adv2 = fnt->glyph->advance.x>>6;
if ( adv2 ) adv = adv2;
w = adv;
iw = w+((gradient&4)?2:1);
iw = w+((gradient&8)?0:(gradient&4)?2:1);
}
int xx = 0;
int yy = upshift+tewi_hotfix+miniwi_hotfix;