19
19
20
20
static int g_nglyphs ;
21
21
static int g_locafmt ;
22
+ static int g_indent ;
22
23
23
24
void panic (char * fmt , ...)
24
25
{
@@ -70,7 +71,7 @@ static void indent(int level, const char *fmt, ...)
70
71
int i ;
71
72
72
73
va_start (args , fmt );
73
- for (i = 0 ; i < level ; i ++ )
74
+ for (i = 0 ; i < g_indent + level ; i ++ )
74
75
putchar ('\t' );
75
76
vprintf (fmt , args );
76
77
va_end (args );
@@ -84,6 +85,8 @@ static void indentdump(int level, int offset, int max, const char *fmt, ...)
84
85
85
86
if (offset % max )
86
87
level = 0 ;
88
+ if (level > 0 )
89
+ level += g_indent ;
87
90
for (i = 0 ; i < level ; i ++ )
88
91
putchar ('\t' );
89
92
if (fmt ) {
@@ -1215,7 +1218,7 @@ void dumptable(FILE *f, ulong ofs, ulong len, char *name)
1215
1218
}
1216
1219
1217
1220
/*
1218
- * Main
1221
+ * Main truetype
1219
1222
*/
1220
1223
1221
1224
void readfontdir (FILE * f )
@@ -1343,6 +1346,50 @@ void readfontdir(FILE *f)
1343
1346
readglyf (f , glyfofs , locaofs );
1344
1347
}
1345
1348
1349
+ /*
1350
+ * Main truetype collection
1351
+ */
1352
+ void readcollection (FILE * f )
1353
+ {
1354
+ ulong tag ;
1355
+ ulong version ;
1356
+ ulong fonts ;
1357
+ ulong length ;
1358
+ ulong offset ;
1359
+ int i ;
1360
+ long save ;
1361
+
1362
+ indent (0 , "truetype collection\n" );
1363
+ indent (0 , "{\n" );
1364
+
1365
+ tag = readulong (f );
1366
+ version = readulong (f );
1367
+ fonts = readulong (f );
1368
+
1369
+ indent (1 , "version = 0x%08x\n" , version );
1370
+ indent (1 , "fonts = 0x%08x\n" , fonts );
1371
+
1372
+ save = ftell (f );
1373
+
1374
+ for (i = 0 ; i < fonts ; i ++ ) {
1375
+ offset = readulong (f );
1376
+ indent (1 , "offsetTable[% 3d]: 0x%08x\n" , i , offset );
1377
+ }
1378
+ puts ("" );
1379
+
1380
+ fseek (f , save , 0 );
1381
+ for (i = 0 ; i < fonts ; i ++ ) {
1382
+ fseek (f , 12 + i * 4 , 0 );
1383
+ offset = readulong (f );
1384
+ fseek (f , offset , 0 );
1385
+ g_indent = 1 ;
1386
+ readfontdir (f );
1387
+ puts ("" );
1388
+ }
1389
+
1390
+ puts ("}" );
1391
+ }
1392
+
1346
1393
int main (int argc , char * * argv )
1347
1394
{
1348
1395
if (argc < 2 )
@@ -1352,7 +1399,14 @@ int main(int argc, char **argv)
1352
1399
if (!f )
1353
1400
panic ("fopen failed" );
1354
1401
1355
- readfontdir (f );
1402
+ ulong tag = readulong (f );
1403
+ fseek (f , 0 , 0 );
1404
+ if (tag == 0x74746366 )
1405
+ readcollection (f );
1406
+ else {
1407
+ g_indent = 0 ;
1408
+ readfontdir (f );
1409
+ }
1356
1410
1357
1411
fclose (f );
1358
1412
0 commit comments