📄 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 + -