📄 ttpload.c
字号:
#endif } /*************************************************************************/ /* */ /* <Function> */ /* tt_face_load_fpgm */ /* */ /* <Description> */ /* Load the font program. */ /* */ /* <InOut> */ /* face :: A handle to the target face object. */ /* */ /* <Input> */ /* stream :: A handle to the input stream. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_LOCAL_DEF( FT_Error ) tt_face_load_fpgm( TT_Face face, FT_Stream stream ) {#ifdef TT_USE_BYTECODE_INTERPRETER FT_Error error; FT_ULong table_len; FT_TRACE2(( "Font program " )); /* The font program is optional */ error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); if ( error ) { face->font_program = NULL; face->font_program_size = 0; error = TT_Err_Ok; FT_TRACE2(( "is missing!\n" )); } else { face->font_program_size = table_len; if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) goto Exit; FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); } Exit: return error;#else /* !TT_USE_BYTECODE_INTERPRETER */ FT_UNUSED( face ); FT_UNUSED( stream ); return TT_Err_Ok;#endif } /*************************************************************************/ /* */ /* <Function> */ /* tt_face_load_prep */ /* */ /* <Description> */ /* Load the cvt program. */ /* */ /* <InOut> */ /* face :: A handle to the target face object. */ /* */ /* <Input> */ /* stream :: A handle to the input stream. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_LOCAL_DEF( FT_Error ) tt_face_load_prep( TT_Face face, FT_Stream stream ) {#ifdef TT_USE_BYTECODE_INTERPRETER FT_Error error; FT_ULong table_len; FT_TRACE2(( "Prep program " )); error = face->goto_table( face, TTAG_prep, stream, &table_len ); if ( error ) { face->cvt_program = NULL; face->cvt_program_size = 0; error = TT_Err_Ok; FT_TRACE2(( "is missing!\n" )); } else { face->cvt_program_size = table_len; if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) goto Exit; FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); } Exit: return error;#else /* !TT_USE_BYTECODE_INTERPRETER */ FT_UNUSED( face ); FT_UNUSED( stream ); return TT_Err_Ok;#endif } /*************************************************************************/ /* */ /* <Function> */ /* tt_face_load_hdmx */ /* */ /* <Description> */ /* Load the `hdmx' table into the face object. */ /* */ /* <Input> */ /* face :: A handle to the target face object. */ /* */ /* stream :: A handle to the input stream. */ /* */ /* <Return> */ /* FreeType error code. 0 means success. */ /* */ FT_LOCAL_DEF( FT_Error ) tt_face_load_hdmx( TT_Face face, FT_Stream stream ) { FT_Error error; FT_Memory memory = stream->memory; FT_UInt version, nn, num_records; FT_ULong table_size, record_size; FT_Byte* p; FT_Byte* limit; /* this table is optional */ error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); if ( error || table_size < 8 ) return TT_Err_Ok; if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) goto Exit; p = face->hdmx_table; limit = p + table_size; version = FT_NEXT_USHORT( p ); num_records = FT_NEXT_USHORT( p ); record_size = FT_NEXT_ULONG( p ); /* The maximum number of bytes in an hdmx device record is the */ /* maximum number of glyphs + 2; this is 0xFFFF + 2; this is */ /* the reason why `record_size' is a long (which we read as */ /* unsigned long for convenience). In practice, two bytes */ /* sufficient to hold the size value. */ /* */ /* There are at least two fonts, HANNOM-A and HANNOM-B version */ /* 2.0 (2005), which get this wrong: The upper two bytes of */ /* the size value are set to 0xFF instead of 0x00. We catch */ /* and fix this. */ if ( record_size >= 0xFFFF0000UL ) record_size &= 0xFFFFU; /* The limit for `num_records' is a heuristic value. */ if ( version != 0 || num_records > 255 || record_size > 0x10001L ) { error = TT_Err_Invalid_File_Format; goto Fail; } if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) ) goto Fail; for ( nn = 0; nn < num_records; nn++ ) { if ( p + record_size > limit ) break; face->hdmx_record_sizes[nn] = p[0]; p += record_size; } face->hdmx_record_count = nn; face->hdmx_table_size = table_size; face->hdmx_record_size = record_size; Exit: return error; Fail: FT_FRAME_RELEASE( face->hdmx_table ); face->hdmx_table_size = 0; goto Exit; } FT_LOCAL_DEF( void ) tt_face_free_hdmx( TT_Face face ) { FT_Stream stream = face->root.stream; FT_Memory memory = stream->memory; FT_FREE( face->hdmx_record_sizes ); FT_FRAME_RELEASE( face->hdmx_table ); } /*************************************************************************/ /* */ /* Return the advance width table for a given pixel size if it is found */ /* in the font's `hdmx' table (if any). */ /* */ FT_LOCAL_DEF( FT_Byte* ) tt_face_get_device_metrics( TT_Face face, FT_UInt ppem, FT_UInt gindex ) { FT_UInt nn; FT_Byte* result = NULL; FT_ULong record_size = face->hdmx_record_size; FT_Byte* record = face->hdmx_table + 8; for ( nn = 0; nn < face->hdmx_record_count; nn++ ) if ( face->hdmx_record_sizes[nn] == ppem ) { gindex += 2; if ( gindex < record_size ) result = record + nn * record_size + gindex; break; } return result; }/* END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -