ref: 3d780173feddb66e404b317f88086da05ebf266b
dir: /src/cache/ftcglyph.c/
/***************************************************************************/ /* */ /* ftcglyph.c */ /* */ /* FreeType Glyph Image (FT_Glyph) cache (body). */ /* */ /* Copyright 2000-2001, 2003 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ /* */ /* This file is part of the FreeType project, and may only be used, */ /* modified, and distributed under the terms of the FreeType project */ /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ /* this file you indicate that you have read the license and */ /* understand and accept it fully. */ /* */ /***************************************************************************/ #include <ft2build.h> #include FT_CACHE_H #include FT_CACHE_INTERNAL_GLYPH_H #include FT_ERRORS_H #include FT_INTERNAL_OBJECTS_H #include FT_INTERNAL_DEBUG_H #include "ftcerror.h" /* create a new chunk node, setting its cache index and ref count */ FT_EXPORT_DEF( void ) FTC_GNode_Init( FTC_GNode gnode, FT_UInt gindex, FTC_Family family ) { gnode->family = family; gnode->gindex = gindex; family->num_nodes++; } FT_EXPORT_DEF( void ) FTC_GNode_UnselectFamily( FTC_GNode gnode, FTC_Cache cache ) { FTC_Family family = gnode->family; gnode->family = NULL; if ( family && --family->num_nodes <= 0 ) FTC_MruList_Remove( &FTC_GCACHE( cache )->families, (FTC_MruNode)family ); } FT_EXPORT_DEF( void ) FTC_GNode_Done( FTC_GNode gnode, FTC_Cache cache ) { /* finalize the node */ gnode->gindex = 0; FTC_GNode_UnselectFamily( gnode, cache ); } FT_EXPORT_DEF( FT_Bool ) FTC_GNode_Compare( FTC_GNode gnode, FTC_GQuery gquery ) { return FT_BOOL( gnode->family == gquery->family && gnode->gindex == gquery->gindex ); } /*************************************************************************/ /*************************************************************************/ /***** *****/ /***** CHUNK SETS *****/ /***** *****/ /*************************************************************************/ /*************************************************************************/ FT_EXPORT_DEF( void ) FTC_Family_Init( FTC_Family family, FTC_Cache cache ) { FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache ); family->clazz = clazz->family_class; family->num_nodes = 0; family->cache = cache; } FT_EXPORT_DEF( FT_Error ) FTC_GCache_Init( FTC_GCache cache ) { FT_Error error; error = FTC_Cache_Init( FTC_CACHE( cache ) ); if ( !error ) { FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class; FTC_MruList_Init( &cache->families, clazz->family_class, 0, /* no maximum here! */ cache, FTC_CACHE( cache )->memory ); } return error; } FT_EXPORT_DEF( void ) FTC_GCache_Done( FTC_GCache cache ) { FTC_Cache_Done( (FTC_Cache)cache ); FTC_MruList_Done( &cache->families ); } FT_EXPORT_DEF( FT_Error ) FTC_GCache_New( FTC_Manager manager, FTC_GCacheClass clazz, FTC_GCache *acache ) { return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz, (FTC_Cache*)acache ); } FT_EXPORT_DEF( FT_Error ) FTC_GCache_Lookup( FTC_GCache cache, FT_UInt32 hash, FT_UInt gindex, FTC_GQuery query, FTC_Node *anode ) { FT_Error error; query->gindex = gindex; FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error ); if ( !error ) error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode ); return error; } /* END */