📄 ftcbasic.c
字号:
query.attrs.scaler.y_res = 0; hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex;#if 1 /* inlining is about 50% faster! */ FTC_GCACHE_LOOKUP_CMP( cache, ftc_basic_family_compare, FTC_GNode_Compare, hash, gindex, &query, node, error );#else error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, FTC_GQUERY( &query ), (FTC_Node*) &node );#endif if ( !error ) { *aglyph = FTC_INODE( node )->glyph; if ( anode ) { *anode = FTC_NODE( node ); FTC_NODE( node )->ref_count++; } } Exit: return error; }#ifdef FT_CONFIG_OPTION_OLD_INTERNALS /* yet another backwards-legacy structure */ typedef struct FTC_OldImage_Desc_ { FTC_FontRec font; FT_UInt image_type; } FTC_OldImage_Desc;#define FTC_OLD_IMAGE_FORMAT( x ) ( (x) & 7 )#define ftc_old_image_format_bitmap 0x0000#define ftc_old_image_format_outline 0x0001#define ftc_old_image_format_mask 0x000F#define ftc_old_image_flag_monochrome 0x0010#define ftc_old_image_flag_unhinted 0x0020#define ftc_old_image_flag_autohinted 0x0040#define ftc_old_image_flag_unscaled 0x0080#define ftc_old_image_flag_no_sbits 0x0100 /* monochrome bitmap */#define ftc_old_image_mono ftc_old_image_format_bitmap | \ ftc_old_image_flag_monochrome /* anti-aliased bitmap */#define ftc_old_image_grays ftc_old_image_format_bitmap /* scaled outline */#define ftc_old_image_outline ftc_old_image_format_outline static void ftc_image_type_from_old_desc( FTC_ImageType typ, FTC_OldImage_Desc* desc ) { typ->face_id = desc->font.face_id; typ->width = desc->font.pix_width; typ->height = desc->font.pix_height; /* convert image type flags to load flags */ { FT_UInt load_flags = FT_LOAD_DEFAULT; FT_UInt type = desc->image_type; /* determine load flags, depending on the font description's */ /* image type */ if ( FTC_OLD_IMAGE_FORMAT( type ) == ftc_old_image_format_bitmap ) { if ( type & ftc_old_image_flag_monochrome ) load_flags |= FT_LOAD_MONOCHROME; /* disable embedded bitmaps loading if necessary */ if ( type & ftc_old_image_flag_no_sbits ) load_flags |= FT_LOAD_NO_BITMAP; } else { /* we want an outline, don't load embedded bitmaps */ load_flags |= FT_LOAD_NO_BITMAP; if ( type & ftc_old_image_flag_unscaled ) load_flags |= FT_LOAD_NO_SCALE; } /* always render glyphs to bitmaps */ load_flags |= FT_LOAD_RENDER; if ( type & ftc_old_image_flag_unhinted ) load_flags |= FT_LOAD_NO_HINTING; if ( type & ftc_old_image_flag_autohinted ) load_flags |= FT_LOAD_FORCE_AUTOHINT; typ->flags = load_flags; } } FT_EXPORT( FT_Error ) FTC_Image_Cache_New( FTC_Manager manager, FTC_ImageCache *acache ); FT_EXPORT( FT_Error ) FTC_Image_Cache_Lookup( FTC_ImageCache icache, FTC_OldImage_Desc* desc, FT_UInt gindex, FT_Glyph *aglyph ); FT_EXPORT_DEF( FT_Error ) FTC_Image_Cache_New( FTC_Manager manager, FTC_ImageCache *acache ) { return FTC_ImageCache_New( manager, (FTC_ImageCache*)acache ); } FT_EXPORT_DEF( FT_Error ) FTC_Image_Cache_Lookup( FTC_ImageCache icache, FTC_OldImage_Desc* desc, FT_UInt gindex, FT_Glyph *aglyph ) { FTC_ImageTypeRec type0; if ( !desc ) return FTC_Err_Invalid_Argument; ftc_image_type_from_old_desc( &type0, desc ); return FTC_ImageCache_Lookup( (FTC_ImageCache)icache, &type0, gindex, aglyph, NULL ); }#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ /* * * basic small bitmap cache * */ FT_CALLBACK_TABLE_DEF const FTC_SFamilyClassRec ftc_basic_sbit_family_class = { { sizeof( FTC_BasicFamilyRec ), ftc_basic_family_compare, ftc_basic_family_init, 0, /* FTC_MruNode_ResetFunc */ 0 /* FTC_MruNode_DoneFunc */ }, ftc_basic_family_get_count, ftc_basic_family_load_bitmap }; FT_CALLBACK_TABLE_DEF const FTC_GCacheClassRec ftc_basic_sbit_cache_class = { { ftc_snode_new, ftc_snode_weight, ftc_snode_compare, ftc_basic_gnode_compare_faceid, ftc_snode_free, sizeof ( FTC_GCacheRec ), ftc_gcache_init, ftc_gcache_done }, (FTC_MruListClass)&ftc_basic_sbit_family_class }; /* documentation is in ftcache.h */ FT_EXPORT_DEF( FT_Error ) FTC_SBitCache_New( FTC_Manager manager, FTC_SBitCache *acache ) { return FTC_GCache_New( manager, &ftc_basic_sbit_cache_class, (FTC_GCache*)acache ); } /* documentation is in ftcache.h */ FT_EXPORT_DEF( FT_Error ) FTC_SBitCache_Lookup( FTC_SBitCache cache, FTC_ImageType type, FT_UInt gindex, FTC_SBit *ansbit, FTC_Node *anode ) { FT_Error error; FTC_BasicQueryRec query; FTC_SNode node = 0; /* make compiler happy */ FT_UInt32 hash; if ( anode ) *anode = NULL; /* other argument checks delayed to FTC_Cache_Lookup */ if ( !ansbit ) return FTC_Err_Invalid_Argument; *ansbit = NULL;#ifdef FT_CONFIG_OPTION_OLD_INTERNALS /* This one is a major hack used to detect whether we are passed a * regular FTC_ImageType handle, or a legacy FTC_OldImageDesc one. */ if ( type->width >= 0x10000 ) { FTC_OldImageDesc desc = (FTC_OldImageDesc)type; query.attrs.scaler.face_id = desc->font.face_id; query.attrs.scaler.width = desc->font.pix_width; query.attrs.scaler.height = desc->font.pix_height; query.attrs.load_flags = desc->flags; } else#endif /* FT_CONFIG_OPTION_OLD_INTERNALS */ { query.attrs.scaler.face_id = type->face_id; query.attrs.scaler.width = type->width; query.attrs.scaler.height = type->height; query.attrs.load_flags = type->flags; } query.attrs.scaler.pixel = 1; query.attrs.scaler.x_res = 0; /* make compilers happy */ query.attrs.scaler.y_res = 0; /* beware, the hash must be the same for all glyph ranges! */ hash = FTC_BASIC_ATTR_HASH( &query.attrs ) + gindex / FTC_SBIT_ITEMS_PER_NODE;#if 1 /* inlining is about 50% faster! */ FTC_GCACHE_LOOKUP_CMP( cache, ftc_basic_family_compare, FTC_SNode_Compare, hash, gindex, &query, node, error );#else error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, FTC_GQUERY( &query ), (FTC_Node*)&node );#endif if ( error ) goto Exit; *ansbit = node->sbits + ( gindex - FTC_GNODE( node )->gindex ); if ( anode ) { *anode = FTC_NODE( node ); FTC_NODE( node )->ref_count++; } Exit: return error; }#ifdef FT_CONFIG_OPTION_OLD_INTERNALS FT_EXPORT( FT_Error ) FTC_SBit_Cache_New( FTC_Manager manager, FTC_SBitCache *acache ); FT_EXPORT( FT_Error ) FTC_SBit_Cache_Lookup( FTC_SBitCache cache, FTC_OldImage_Desc* desc, FT_UInt gindex, FTC_SBit *ansbit ); FT_EXPORT_DEF( FT_Error ) FTC_SBit_Cache_New( FTC_Manager manager, FTC_SBitCache *acache ) { return FTC_SBitCache_New( manager, (FTC_SBitCache*)acache ); } FT_EXPORT_DEF( FT_Error ) FTC_SBit_Cache_Lookup( FTC_SBitCache cache, FTC_OldImage_Desc* desc, FT_UInt gindex, FTC_SBit *ansbit ) { FTC_ImageTypeRec type0; if ( !desc ) return FT_Err_Invalid_Argument; ftc_image_type_from_old_desc( &type0, desc ); return FTC_SBitCache_Lookup( (FTC_SBitCache)cache, &type0, gindex, ansbit, NULL ); }#endif /* FT_CONFIG_OPTION_OLD_INTERNALS *//* END */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -