static FT_Error Load_Post_Names( TT_Face face ) { FT_Stream stream; FT_Error error; FT_Fixed format; /* get a stream for the face's resource */ stream = face->root.stream; /* seek to the beginning of the PS names table */ error = face->goto_table( face, TTAG_post, stream, 0 ); if ( error ) goto Exit; format = face->postscript.FormatType; /* go to beginning of subtable */ if ( FILE_Skip( 32 ) ) goto Exit; /* now read postscript table */ switch ( format ) { case 0x00020000L: error = Load_Format_20( face, stream ); break; case 0x00028000L: error = Load_Format_25( face, stream ); break; default: error = TT_Err_Invalid_File_Format; } face->postscript_names.loaded = 1; Exit: return error; }
static TT_Error Kerning_Create( void* ext, PFace face ) { DEFINE_LOAD_LOCALS( face->stream ); TT_Kerning* kern = (TT_Kerning*)ext; UShort num_tables; Long table; TT_Kern_Subtable* sub; /* by convention */ if ( !kern ) return TT_Err_Ok; /* Now load the kerning directory. We're called from the face */ /* constructor. We thus need not use the stream. */ kern->version = 0; kern->nTables = 0; kern->tables = NULL; table = TT_LookUp_Table( face, TTAG_kern ); if ( table < 0 ) return TT_Err_Ok; /* The table is optional */ if ( FILE_Seek( face->dirTables[table].Offset ) || ACCESS_Frame( 4L ) ) return error; kern->version = GET_UShort(); num_tables = GET_UShort(); FORGET_Frame(); /* we don't set kern->nTables until we have allocated the array */ if ( ALLOC_ARRAY( kern->tables, num_tables, TT_Kern_Subtable ) ) return error; kern->nTables = num_tables; /* now load the directory entries, but do _not_ load the tables ! */ sub = kern->tables; for ( table = 0; table < num_tables; table++ ) { if ( ACCESS_Frame( 6L ) ) return error; sub->loaded = FALSE; /* redundant, but good to see */ sub->version = GET_UShort(); sub->length = GET_UShort() - 6; /* substract header length */ sub->format = GET_Byte(); sub->coverage = GET_Byte(); FORGET_Frame(); sub->offset = FILE_Pos(); /* now skip to the next table */ if ( FILE_Skip( sub->length ) ) return error; sub++; } /* that's fine, leave now */ return TT_Err_Ok; }