public TrueTypeFont parseTTF(TTFDataStream raf) throws IOException {
TrueTypeFont font = new TrueTypeFont( raf );
font.setVersion( raf.read32Fixed() );
int numberOfTables = raf.readUnsignedShort();
int searchRange = raf.readUnsignedShort();
int entrySelector = raf.readUnsignedShort();
int rangeShift = raf.readUnsignedShort();
for( int i=0; i< numberOfTables; i++ )
{
TTFTable table = readTableDirectory( raf );
font.addTable( table );
}
List< TTFTable > initialized = new ArrayList< TTFTable >();
//need to initialize a couple tables in a certain order
HeaderTable head = font.getHeader();
raf.seek( head.getOffset() );
head.initData( font, raf );
initialized.add( head );
HorizontalHeaderTable hh = font.getHorizontalHeader();
raf.seek( hh.getOffset() );
hh.initData( font, raf );
initialized.add( hh );
MaximumProfileTable maxp = font.getMaximumProfile();
raf.seek( maxp.getOffset() );
maxp.initData( font, raf );
initialized.add( maxp );
PostScriptTable post = font.getPostScript();
raf.seek( post.getOffset() );
post.initData( font, raf );
initialized.add( post );
IndexToLocationTable loc = font.getIndexToLocation();
raf.seek( loc.getOffset() );
loc.initData( font, raf );
initialized.add( loc );
Iterator< TTFTable > iter = font.getTables().iterator();
while( iter.hasNext() )
{
TTFTable table = iter.next();
if( !initialized.contains( table ) )
{
raf.seek( table.getOffset() );
table.initData( font, raf );
}
}
return font;
}
Parse a file and get a true type font. |