1 /***************************************************************************/
5 /* FreeType Glyph Image (FT_Glyph) cache (body). */
7 /* Copyright 2000-2001, 2003, 2004, 2006, 2009 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 /***************************************************************************/
28 /* create a new chunk node, setting its cache index and ref count */
30 FTC_GNode_Init( FTC_GNode gnode
,
34 gnode
->family
= family
;
35 gnode
->gindex
= gindex
;
41 FTC_GNode_UnselectFamily( FTC_GNode gnode
,
44 FTC_Family family
= gnode
->family
;
48 if ( family
&& --family
->num_nodes
== 0 )
49 FTC_FAMILY_FREE( family
, cache
);
54 FTC_GNode_Done( FTC_GNode gnode
,
57 /* finalize the node */
60 FTC_GNode_UnselectFamily( gnode
, cache
);
64 FT_LOCAL_DEF( FT_Bool
)
65 ftc_gnode_compare( FTC_Node ftcgnode
,
69 FTC_GNode gnode
= (FTC_GNode
)ftcgnode
;
70 FTC_GQuery gquery
= (FTC_GQuery
)ftcgquery
;
74 return FT_BOOL( gnode
->family
== gquery
->family
&&
75 gnode
->gindex
== gquery
->gindex
);
79 FT_LOCAL_DEF( FT_Bool
)
80 FTC_GNode_Compare( FTC_GNode gnode
,
83 return ftc_gnode_compare( FTC_NODE( gnode
), gquery
, NULL
);
87 /*************************************************************************/
88 /*************************************************************************/
90 /***** CHUNK SETS *****/
92 /*************************************************************************/
93 /*************************************************************************/
96 FTC_Family_Init( FTC_Family family
,
99 FTC_GCacheClass clazz
= FTC_CACHE__GCACHE_CLASS( cache
);
102 family
->clazz
= clazz
->family_class
;
103 family
->num_nodes
= 0;
104 family
->cache
= cache
;
108 FT_LOCAL_DEF( FT_Error
)
109 ftc_gcache_init( FTC_Cache ftccache
)
111 FTC_GCache cache
= (FTC_GCache
)ftccache
;
115 error
= FTC_Cache_Init( FTC_CACHE( cache
) );
118 FTC_GCacheClass clazz
= (FTC_GCacheClass
)FTC_CACHE( cache
)->org_class
;
120 FTC_MruList_Init( &cache
->families
,
122 0, /* no maximum here! */
124 FTC_CACHE( cache
)->memory
);
133 FT_LOCAL_DEF( FT_Error
)
134 FTC_GCache_Init( FTC_GCache cache
)
136 return ftc_gcache_init( FTC_CACHE( cache
) );
143 ftc_gcache_done( FTC_Cache ftccache
)
145 FTC_GCache cache
= (FTC_GCache
)ftccache
;
148 FTC_Cache_Done( (FTC_Cache
)cache
);
149 FTC_MruList_Done( &cache
->families
);
156 FTC_GCache_Done( FTC_GCache cache
)
158 ftc_gcache_done( FTC_CACHE( cache
) );
164 FT_LOCAL_DEF( FT_Error
)
165 FTC_GCache_New( FTC_Manager manager
,
166 FTC_GCacheClass clazz
,
169 return FTC_Manager_RegisterCache( manager
, (FTC_CacheClass
)clazz
,
170 (FTC_Cache
*)acache
);
176 FT_LOCAL_DEF( FT_Error
)
177 FTC_GCache_Lookup( FTC_GCache cache
,
186 query
->gindex
= gindex
;
188 FTC_MRULIST_LOOKUP( &cache
->families
, query
, query
->family
, error
);
191 FTC_Family family
= query
->family
;
194 /* prevent the family from being destroyed too early when an */
195 /* out-of-memory condition occurs during glyph node initialization. */
198 error
= FTC_Cache_Lookup( FTC_CACHE( cache
), hash
, query
, anode
);
200 if ( --family
->num_nodes
== 0 )
201 FTC_FAMILY_FREE( family
, cache
);
206 #endif /* !FTC_INLINE */