diff --git a/include/freetype/cache/ftcchunk.h b/include/freetype/cache/ftcchunk.h index 3866659ea..980399570 100644 --- a/include/freetype/cache/ftcchunk.h +++ b/include/freetype/cache/ftcchunk.h @@ -150,9 +150,10 @@ /* the abstract chunk cache object */ typedef struct FTC_Chunk_CacheRec_ { - FTC_CacheRec root; - FT_Lru csets_lru; /* static chunk set lru list */ - FTC_ChunkSet last_cset; /* small cache :-) */ + FTC_CacheRec root; + FT_Lru csets_lru; /* static chunk set lru list */ + FTC_ChunkSet last_cset; /* small cache :-) */ + FTC_ChunkSet_CompareFunc compare; /* useful shortcut */ } FTC_Chunk_CacheRec; @@ -176,22 +177,41 @@ FTC_CACHENODE_TO_DATA_P( &(n)->root )->ref_count-- - FT_EXPORT( void ) FTC_ChunkNode_Destroy( FTC_ChunkNode node ); + /* chunk set objects */ - FT_EXPORT( FT_Error ) FTC_Chunk_Cache_Init( FTC_Chunk_Cache cache ); - - FT_EXPORT( void ) FTC_Chunk_Cache_Done( FTC_Chunk_Cache cache ); + FT_EXPORT( void ) + FTC_ChunkNode_Destroy( FTC_ChunkNode node ); - FT_EXPORT( FT_Error ) FTC_ChunkSet_New( FTC_Chunk_Cache cache, - FT_Pointer type, - FTC_ChunkSet *aset ); + FT_EXPORT( FT_Error ) + FTC_ChunkSet_New( FTC_Chunk_Cache cache, + FT_Pointer type, + FTC_ChunkSet *aset ); - FT_EXPORT( FT_Error ) FTC_ChunkSet_Lookup_Node( - FTC_ChunkSet cset, - FT_UInt glyph_index, - FTC_ChunkNode* anode, - FT_UInt *anindex ); + + FT_EXPORT( FT_Error ) + FTC_ChunkSet_Lookup_Node( FTC_ChunkSet cset, + FT_UInt glyph_index, + FTC_ChunkNode* anode, + FT_UInt *anindex ); + + + /* chunk cache objects */ + + FT_EXPORT( FT_Error ) + FTC_Chunk_Cache_Init( FTC_Chunk_Cache cache ); + + + FT_EXPORT( void ) + FTC_Chunk_Cache_Done( FTC_Chunk_Cache cache ); + + + FT_EXPORT( FT_Error ) + FTC_Chunk_Cache_Lookup( FTC_Chunk_Cache cache, + FT_Pointer type, + FT_UInt gindex, + FTC_ChunkNode *anode, + FT_UInt *aindex ); #ifdef __cplusplus diff --git a/include/freetype/cache/ftcglyph.h b/include/freetype/cache/ftcglyph.h index 2614c046d..3dfed9d08 100644 --- a/include/freetype/cache/ftcglyph.h +++ b/include/freetype/cache/ftcglyph.h @@ -154,9 +154,10 @@ /* the abstract glyph cache object */ typedef struct FTC_Glyph_CacheRec_ { - FTC_CacheRec root; - FT_Lru gsets_lru; /* static sets lru list */ - FTC_GlyphSet last_gset; /* small cache :-) */ + FTC_CacheRec root; + FT_Lru gsets_lru; /* static sets lru list */ + FTC_GlyphSet last_gset; /* small cache :-) */ + FTC_GlyphSet_CompareFunc compare; /* useful shortcut */ } FTC_Glyph_CacheRec; @@ -196,6 +197,11 @@ FT_UInt glyph_index, FTC_GlyphNode *anode ); + FT_EXPORT( FT_Error ) FTC_Glyph_Cache_Lookup( FTC_Glyph_Cache cache, + FT_Pointer type, + FT_UInt gindex, + FTC_GlyphNode *anode ); + #ifdef __cplusplus } diff --git a/src/cache/ftcchunk.c b/src/cache/ftcchunk.c index bbea8289c..a6a013e8b 100644 --- a/src/cache/ftcchunk.c +++ b/src/cache/ftcchunk.c @@ -347,16 +347,22 @@ /*************************************************************************/ - FT_EXPORT_DEF( FT_Error ) FTC_Chunk_Cache_Init( FTC_Chunk_Cache cache ) + FT_EXPORT_DEF( FT_Error ) + FTC_Chunk_Cache_Init( FTC_Chunk_Cache cache ) { FT_Memory memory = cache->root.memory; FT_Error error; + FTC_Chunk_Cache_Class* ccache_clazz; /* set up root node_class to be used by manager */ cache->root.node_clazz = (FTC_CacheNode_Class*)&ftc_chunk_cache_node_class; + /* setup "compare" shortcut */ + ccache_clazz = (FTC_Chunk_Cache_Class*)cache->root.clazz; + cache->compare = ccache_clazz->cset_class->compare; + error = FT_Lru_New( &ftc_chunk_set_lru_class, FTC_MAX_CHUNK_SETS, cache, @@ -367,11 +373,64 @@ } - FT_EXPORT_DEF( void ) FTC_Chunk_Cache_Done( FTC_Chunk_Cache cache ) + FT_EXPORT_DEF( void ) + FTC_Chunk_Cache_Done( FTC_Chunk_Cache cache ) { /* discard glyph sets */ FT_Lru_Done( cache->csets_lru ); } + FT_EXPORT_DEF( FT_Error ) + FTC_Chunk_Cache_Lookup( FTC_Chunk_Cache cache, + FT_Pointer type, + FT_UInt gindex, + FTC_ChunkNode *anode, + FT_UInt *aindex ) + { + FT_Error error; + FTC_ChunkSet cset; + FTC_ChunkNode node; + FT_UInt cindex; + FTC_Manager manager; + + + /* check for valid `desc' delayed to FT_Lru_Lookup() */ + + if ( !cache || !anode || !aindex ) + return FT_Err_Invalid_Argument; + + *anode = 0; + *aindex = 0; + cset = cache->last_cset; + + if ( !cset || !cache->compare( cset, type ) ) + { + error = FT_Lru_Lookup( cache->csets_lru, + (FT_LruKey)type, + (FT_Pointer*)&cset ); + cache->last_cset = cset; + if ( error ) + goto Exit; + } + + error = FTC_ChunkSet_Lookup_Node( cset, gindex, &node, &cindex ); + if ( error ) + goto Exit; + + /* now compress the manager's cache pool if needed */ + manager = cache->root.manager; + if ( manager->num_bytes > manager->max_bytes ) + { + FTC_ChunkNode_Ref ( node ); + FTC_Manager_Compress( manager ); + FTC_ChunkNode_Unref ( node ); + } + + *anode = node; + *aindex = cindex; + + Exit: + return error; + } /* END */ diff --git a/src/cache/ftcglyph.c b/src/cache/ftcglyph.c index a4a6ce726..503fc8e2e 100644 --- a/src/cache/ftcglyph.c +++ b/src/cache/ftcglyph.c @@ -377,16 +377,22 @@ /*************************************************************************/ - FT_EXPORT_DEF( FT_Error ) FTC_Glyph_Cache_Init( FTC_Glyph_Cache cache ) + FT_EXPORT_DEF( FT_Error ) + FTC_Glyph_Cache_Init( FTC_Glyph_Cache cache ) { FT_Memory memory = cache->root.memory; FT_Error error; + FTC_Glyph_Cache_Class* gcache_clazz; /* set up root node_class to be used by manager */ cache->root.node_clazz = (FTC_CacheNode_Class*)&ftc_glyph_cache_node_class; + /* setup the "compare" shortcut */ + gcache_clazz = (FTC_Glyph_Cache_Class*)cache->root.clazz; + cache->compare = gcache_clazz->gset_class->compare; + /* The following is extremely important for ftc_destroy_glyph_image() */ /* to work properly, as the second parameter that is sent to it */ /* through the cache manager is `cache_data' and must be set to */ @@ -404,11 +410,59 @@ } - FT_EXPORT_DEF( void ) FTC_Glyph_Cache_Done( FTC_Glyph_Cache cache ) + FT_EXPORT_DEF( void ) + FTC_Glyph_Cache_Done( FTC_Glyph_Cache cache ) { /* discard glyph sets */ FT_Lru_Done( cache->gsets_lru ); } + FT_EXPORT_DEF( FT_Error ) + FTC_Glyph_Cache_Lookup( FTC_Glyph_Cache cache, + FT_Pointer type, + FT_UInt gindex, + FTC_GlyphNode *anode ) + { + FT_Error error; + FTC_GlyphSet gset; + FTC_GlyphNode node; + FTC_Manager manager; + + /* check for valid `desc' delayed to FT_Lru_Lookup() */ + + if ( !cache || !anode ) + return FT_Err_Invalid_Argument; + + *anode = 0; + gset = cache->last_gset; + if ( !gset || !cache->compare( gset, type ) ) + { + error = FT_Lru_Lookup( cache->gsets_lru, + (FT_LruKey)type, + (FT_Pointer*)&gset ); + cache->last_gset = gset; + if ( error ) + goto Exit; + } + + error = FTC_GlyphSet_Lookup_Node( gset, gindex, &node ); + if ( error ) + goto Exit; + + /* now compress the manager's cache pool if needed */ + manager = cache->root.manager; + if ( manager->num_bytes > manager->max_bytes ) + { + FTC_GlyphNode_Ref ( node ); + FTC_Manager_Compress( manager ); + FTC_GlyphNode_Unref ( node ); + } + + *anode = node; + + Exit: + return error; + } + /* END */ diff --git a/src/cache/ftcimage.c b/src/cache/ftcimage.c index 1a5233374..fd1880f73 100644 --- a/src/cache/ftcimage.c +++ b/src/cache/ftcimage.c @@ -274,50 +274,22 @@ FT_EXPORT( FT_Error ) FTC_Image_Cache_Lookup( FTC_Image_Cache cache, FTC_Image_Desc* desc, FT_UInt gindex, - FT_Glyph* aglyph ) + FT_Glyph *aglyph ) { FT_Error error; - FTC_GlyphSet gset; FTC_GlyphNode node; - FTC_Manager manager; - FTC_ImageSet img_set; + /* some argument checks are delayed to FTC_Glyph_Cache_Lookup */ - - /* check for valid `desc' delayed to FT_Lru_Lookup() */ - - if ( !cache || !aglyph ) + if (!aglyph) return FT_Err_Invalid_Argument; - *aglyph = 0; - gset = cache->root.last_gset; - img_set = (FTC_ImageSet)gset; - if ( !gset || memcmp( &img_set->description, desc, sizeof ( *desc ) ) ) - { - error = FT_Lru_Lookup( cache->root.gsets_lru, - (FT_LruKey)desc, - (FT_Pointer*)&gset ); - cache->root.last_gset = gset; - if ( error ) - goto Exit; - } + error = FTC_Glyph_Cache_Lookup( (FTC_Glyph_Cache)cache, + desc, gindex, &node ); + + if (!error) + *aglyph = ((FTC_GlyphImage)node)->ft_glyph; - error = FTC_GlyphSet_Lookup_Node( gset, gindex, &node ); - if ( error ) - goto Exit; - - /* now compress the manager's cache pool if needed */ - manager = cache->root.root.manager; - if ( manager->num_bytes > manager->max_bytes ) - { - FTC_GlyphNode_Ref ( node ); - FTC_Manager_Compress( manager ); - FTC_GlyphNode_Unref ( node ); - } - - *aglyph = ((FTC_GlyphImage)node)->ft_glyph; - - Exit: return error; } diff --git a/src/cache/ftcsbits.c b/src/cache/ftcsbits.c index 089908986..83fbf34ad 100644 --- a/src/cache/ftcsbits.c +++ b/src/cache/ftcsbits.c @@ -248,6 +248,7 @@ /* the node itself */ size = sizeof ( *node ); + /* the sbit records */ size += cset->element_count * sizeof ( FTC_SBitRec ); @@ -369,53 +370,21 @@ FTC_SBit* asbit ) { FT_Error error; - FTC_ChunkSet cset; FTC_ChunkNode node; FT_UInt cindex; - FTC_Manager manager; - FTC_SBitSet sset; - FTC_SBit sbit; - - - /* check for valid `desc' delayed to FT_Lru_Lookup() */ - - if ( !cache || !asbit ) + /* argument checks delayed to FTC_Chunk_Cache_Lookup */ + if (!asbit) return FT_Err_Invalid_Argument; - + *asbit = 0; - cset = cache->root.last_cset; - sset = (FTC_SBitSet)cset; - - if ( !cset || memcmp( &sset->desc, desc, sizeof ( *desc ) ) ) - { - error = FT_Lru_Lookup( cache->root.csets_lru, - (FT_LruKey)desc, - (FT_Pointer*)&cset ); - cache->root.last_cset = cset; - if ( error ) - goto Exit; - } - - error = FTC_ChunkSet_Lookup_Node( cset, gindex, &node, &cindex ); - if ( error ) - goto Exit; - - /* now compress the manager's cache pool if needed */ - manager = cache->root.root.manager; - if ( manager->num_bytes > manager->max_bytes ) - { - FTC_ChunkNode_Ref ( node ); - FTC_Manager_Compress( manager ); - FTC_ChunkNode_Unref ( node ); - } - - sbit = ((FTC_SBit)((FTC_ChunkNode)node)->elements) + cindex; - *asbit = sbit; - - Exit: + error = FTC_Chunk_Cache_Lookup( &cache->root, desc, gindex, + &node, &cindex ); + if (!error) + *asbit = (FTC_SBit)node->elements + cindex; + return error; } - + /* END */