00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <ft2build.h>
00020 #include FT_CACHE_H
00021 #include "ftcglyph.h"
00022 #include FT_ERRORS_H
00023
00024 #include "ftccback.h"
00025 #include "ftcerror.h"
00026
00027
00028
00029 FT_LOCAL_DEF( void )
00030 FTC_GNode_Init( FTC_GNode gnode,
00031 FT_UInt gindex,
00032 FTC_Family family )
00033 {
00034 gnode->family = family;
00035 gnode->gindex = gindex;
00036 family->num_nodes++;
00037 }
00038
00039
00040 FT_LOCAL_DEF( void )
00041 FTC_GNode_UnselectFamily( FTC_GNode gnode,
00042 FTC_Cache cache )
00043 {
00044 FTC_Family family = gnode->family;
00045
00046
00047 gnode->family = NULL;
00048 if ( family && --family->num_nodes == 0 )
00049 FTC_FAMILY_FREE( family, cache );
00050 }
00051
00052
00053 FT_LOCAL_DEF( void )
00054 FTC_GNode_Done( FTC_GNode gnode,
00055 FTC_Cache cache )
00056 {
00057
00058 gnode->gindex = 0;
00059
00060 FTC_GNode_UnselectFamily( gnode, cache );
00061 }
00062
00063
00064 FT_LOCAL_DEF( FT_Bool )
00065 ftc_gnode_compare( FTC_Node ftcgnode,
00066 FT_Pointer ftcgquery,
00067 FTC_Cache cache )
00068 {
00069 FTC_GNode gnode = (FTC_GNode)ftcgnode;
00070 FTC_GQuery gquery = (FTC_GQuery)ftcgquery;
00071 FT_UNUSED( cache );
00072
00073
00074 return FT_BOOL( gnode->family == gquery->family &&
00075 gnode->gindex == gquery->gindex );
00076 }
00077
00078
00079 FT_LOCAL_DEF( FT_Bool )
00080 FTC_GNode_Compare( FTC_GNode gnode,
00081 FTC_GQuery gquery )
00082 {
00083 return ftc_gnode_compare( FTC_NODE( gnode ), gquery, NULL );
00084 }
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 FT_LOCAL_DEF( void )
00096 FTC_Family_Init( FTC_Family family,
00097 FTC_Cache cache )
00098 {
00099 FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache );
00100
00101
00102 family->clazz = clazz->family_class;
00103 family->num_nodes = 0;
00104 family->cache = cache;
00105 }
00106
00107
00108 FT_LOCAL_DEF( FT_Error )
00109 ftc_gcache_init( FTC_Cache ftccache )
00110 {
00111 FTC_GCache cache = (FTC_GCache)ftccache;
00112 FT_Error error;
00113
00114
00115 error = FTC_Cache_Init( FTC_CACHE( cache ) );
00116 if ( !error )
00117 {
00118 FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class;
00119
00120 FTC_MruList_Init( &cache->families,
00121 clazz->family_class,
00122 0,
00123 cache,
00124 FTC_CACHE( cache )->memory );
00125 }
00126
00127 return error;
00128 }
00129
00130
00131 #if 0
00132
00133 FT_LOCAL_DEF( FT_Error )
00134 FTC_GCache_Init( FTC_GCache cache )
00135 {
00136 return ftc_gcache_init( FTC_CACHE( cache ) );
00137 }
00138
00139 #endif
00140
00141
00142 FT_LOCAL_DEF( void )
00143 ftc_gcache_done( FTC_Cache ftccache )
00144 {
00145 FTC_GCache cache = (FTC_GCache)ftccache;
00146
00147
00148 FTC_Cache_Done( (FTC_Cache)cache );
00149 FTC_MruList_Done( &cache->families );
00150 }
00151
00152
00153 #if 0
00154
00155 FT_LOCAL_DEF( void )
00156 FTC_GCache_Done( FTC_GCache cache )
00157 {
00158 ftc_gcache_done( FTC_CACHE( cache ) );
00159 }
00160
00161 #endif
00162
00163
00164 FT_LOCAL_DEF( FT_Error )
00165 FTC_GCache_New( FTC_Manager manager,
00166 FTC_GCacheClass clazz,
00167 FTC_GCache *acache )
00168 {
00169 return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz,
00170 (FTC_Cache*)acache );
00171 }
00172
00173
00174 #ifndef FTC_INLINE
00175
00176 FT_LOCAL_DEF( FT_Error )
00177 FTC_GCache_Lookup( FTC_GCache cache,
00178 FT_UInt32 hash,
00179 FT_UInt gindex,
00180 FTC_GQuery query,
00181 FTC_Node *anode )
00182 {
00183 FT_Error error;
00184
00185
00186 query->gindex = gindex;
00187
00188 FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error );
00189 if ( !error )
00190 {
00191 FTC_Family family = query->family;
00192
00193
00194
00195
00196 family->num_nodes++;
00197
00198 error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode );
00199
00200 if ( --family->num_nodes == 0 )
00201 FTC_FAMILY_FREE( family, cache );
00202 }
00203 return error;
00204 }
00205
00206 #endif
00207
00208
00209