1 /***************************************************************************/
5 /* FreeType Glyph Image (FT_Glyph) cache (body). */
7 /* Copyright 2000-2001, 2003, 2004, 2006, 2009, 2011 by */
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */
10 /* This file is part of the FreeType project, and may only be used, */
11 /* modified, and distributed under the terms of the FreeType project */
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */
13 /* this file you indicate that you have read the license and */
14 /* understand and accept it fully. */
16 /***************************************************************************/
20 #include FT_INTERNAL_OBJECTS_H
29 /* create a new chunk node, setting its cache index and ref count */
31 FTC_GNode_Init( FTC_GNode gnode,
35 gnode->family = family;
36 gnode->gindex = gindex;
42 FTC_GNode_UnselectFamily( FTC_GNode gnode,
45 FTC_Family family = gnode->family;
49 if ( family && --family->num_nodes == 0 )
50 FTC_FAMILY_FREE( family, cache );
55 FTC_GNode_Done( FTC_GNode gnode,
58 /* finalize the node */
61 FTC_GNode_UnselectFamily( gnode, cache );
65 FT_LOCAL_DEF( FT_Bool )
66 ftc_gnode_compare( FTC_Node ftcgnode,
69 FT_Bool* list_changed )
71 FTC_GNode gnode = (FTC_GNode)ftcgnode;
72 FTC_GQuery gquery = (FTC_GQuery)ftcgquery;
77 *list_changed = FALSE;
78 return FT_BOOL( gnode->family == gquery->family &&
79 gnode->gindex == gquery->gindex );
85 FT_LOCAL_DEF( FT_Bool )
86 FTC_GNode_Compare( FTC_GNode gnode,
89 FT_Bool* list_changed )
91 return ftc_gnode_compare( FTC_NODE( gnode ), gquery,
92 cache, list_changed );
97 /*************************************************************************/
98 /*************************************************************************/
100 /***** CHUNK SETS *****/
102 /*************************************************************************/
103 /*************************************************************************/
106 FTC_Family_Init( FTC_Family family,
109 FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache );
112 family->clazz = clazz->family_class;
113 family->num_nodes = 0;
114 family->cache = cache;
118 FT_LOCAL_DEF( FT_Error )
119 ftc_gcache_init( FTC_Cache ftccache )
121 FTC_GCache cache = (FTC_GCache)ftccache;
125 error = FTC_Cache_Init( FTC_CACHE( cache ) );
128 FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class;
130 FTC_MruList_Init( &cache->families,
132 0, /* no maximum here! */
134 FTC_CACHE( cache )->memory );
143 FT_LOCAL_DEF( FT_Error )
144 FTC_GCache_Init( FTC_GCache cache )
146 return ftc_gcache_init( FTC_CACHE( cache ) );
153 ftc_gcache_done( FTC_Cache ftccache )
155 FTC_GCache cache = (FTC_GCache)ftccache;
158 FTC_Cache_Done( (FTC_Cache)cache );
159 FTC_MruList_Done( &cache->families );
166 FTC_GCache_Done( FTC_GCache cache )
168 ftc_gcache_done( FTC_CACHE( cache ) );
174 FT_LOCAL_DEF( FT_Error )
175 FTC_GCache_New( FTC_Manager manager,
176 FTC_GCacheClass clazz,
179 return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz,
180 (FTC_Cache*)acache );
186 FT_LOCAL_DEF( FT_Error )
187 FTC_GCache_Lookup( FTC_GCache cache,
196 query->gindex = gindex;
198 FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error );
201 FTC_Family family = query->family;
204 /* prevent the family from being destroyed too early when an */
205 /* out-of-memory condition occurs during glyph node initialization. */
208 error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode );
210 if ( --family->num_nodes == 0 )
211 FTC_FAMILY_FREE( family, cache );
216 #endif /* !FTC_INLINE */