diff --git a/ChangeLog b/ChangeLog index dfcf77883..1a3d57577 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2001-10-27 David Turner + + * src/cache/ftchunk.c (ftc_chunk_cache_lookup): fixed a bug that + considerably lowered the performance of the abstract chunk cache. + 2001-10-26 David Turner * include/freetype/ftcache.h, include/freetype/cache/*.h, diff --git a/src/cache/ftcchunk.c b/src/cache/ftcchunk.c index 9fc08af65..e6288bc6c 100644 --- a/src/cache/ftcchunk.c +++ b/src/cache/ftcchunk.c @@ -34,8 +34,15 @@ /*************************************************************************/ /*************************************************************************/ -#define FTC_CSET_HASH(cset,start) \ - ((FT_UFast)(((cset)->hash << 16) | ((start) & 0xFFFF))) +#define FTC_CSET_CHUNK_INDEX(cset,gindex) \ + ( (gindex) / (cset)->item_count ) + +#define FTC_CSET_START(cset,gindex) \ + ( FTC_CSET_CHUNK_INDEX(cset,gindex) * (cset)->item_count ) + +#define FTC_CSET_HASH(cset,gindex) \ + ((FT_UFast)( ((cset)->hash << 16) | \ + (FTC_CSET_CHUNK_INDEX(cset,gindex) & 0xFFFF) )) /* create a new chunk node, setting its cache index and ref count */ FT_EXPORT_DEF( FT_Error ) @@ -47,10 +54,10 @@ FTC_ChunkCache ccache = cset->ccache; FT_Error error = 0; FT_UInt len; - FT_UInt start = (gindex / cset->item_count) * cset->item_count; + FT_UInt start = FTC_CSET_START(cset,gindex); cnode->cset = cset; - cnode->node.hash = FTC_CSET_HASH(cset,start); + cnode->node.hash = FTC_CSET_HASH(cset,gindex); cnode->item_start = start; len = cset->item_total - start; @@ -149,6 +156,7 @@ } + FT_EXPORT_DEF( FT_Error ) ftc_chunk_cache_init( FTC_ChunkCache ccache, FT_LruList_Class cset_class ) @@ -166,6 +174,7 @@ } + FT_EXPORT_DEF( FT_Error ) ftc_chunk_cache_lookup( FTC_ChunkCache ccache, FTC_ChunkQuery query, @@ -177,8 +186,8 @@ error = FT_LruList_Lookup( ccache->cset_lru, query, &node ); if ( !error ) { - FTC_ChunkSet cset = FTC_CHUNK_SET(node); - FT_UFast hash = FTC_CSET_HASH( cset, query->gindex ); + FTC_ChunkSet cset = FTC_CHUNK_SET(node); + FT_UFast hash = FTC_CSET_HASH( cset, query->gindex ); error = ftc_cache_lookup_node( FTC_CACHE(ccache), hash, query, FTC_NODE_P(anode) ); diff --git a/src/cache/ftcsbits.c b/src/cache/ftcsbits.c index 871c20c84..95b5a1335 100644 --- a/src/cache/ftcsbits.c +++ b/src/cache/ftcsbits.c @@ -225,7 +225,7 @@ /* now, compute size */ if ( asize ) - *asize = sizeof( FTC_SBitRec ) + ABS(sbit->pitch) * sbit->height; + *asize = ABS(sbit->pitch) * sbit->height; } /* glyph dimensions ok */