1/****************************************************************************
2 *
3 * ftcglyph.c
4 *
5 * FreeType Glyph Image (FT_Glyph) cache (body).
6 *
7 * Copyright (C) 2000-2023 by
8 * David Turner, Robert Wilhelm, and Werner Lemberg.
9 *
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.
15 *
16 */
17
18
19#include <freetype/internal/ftobjs.h>
20#include <freetype/ftcache.h>
21#include "ftcglyph.h"
22#include <freetype/fterrors.h>
23
24#include "ftccback.h"
25#include "ftcerror.h"
26
27
28 /* create a new chunk node, setting its cache index and ref count */
29 FT_LOCAL_DEF( void )
30 FTC_GNode_Init( FTC_GNode gnode,
31 FT_UInt gindex,
32 FTC_Family family )
33 {
34 gnode->family = family;
35 gnode->gindex = gindex;
36 family->num_nodes++;
37 }
38
39
40 FT_LOCAL_DEF( void )
41 FTC_GNode_UnselectFamily( FTC_GNode gnode,
42 FTC_Cache cache )
43 {
44 FTC_Family family = gnode->family;
45
46
47 gnode->family = NULL;
48 if ( family && --family->num_nodes == 0 )
49 FTC_FAMILY_FREE( family, cache );
50 }
51
52
53 FT_LOCAL_DEF( void )
54 FTC_GNode_Done( FTC_GNode gnode,
55 FTC_Cache cache )
56 {
57 /* finalize the node */
58 gnode->gindex = 0;
59
60 FTC_GNode_UnselectFamily( gnode, cache );
61 }
62
63
64 FT_LOCAL_DEF( FT_Bool )
65 ftc_gnode_compare( FTC_Node ftcgnode,
66 FT_Pointer ftcgquery,
67 FTC_Cache cache,
68 FT_Bool* list_changed )
69 {
70 FTC_GNode gnode = (FTC_GNode)ftcgnode;
71 FTC_GQuery gquery = (FTC_GQuery)ftcgquery;
72 FT_UNUSED( cache );
73
74
75 if ( list_changed )
76 *list_changed = FALSE;
77 return FT_BOOL( gnode->family == gquery->family &&
78 gnode->gindex == gquery->gindex );
79 }
80
81
82 /*************************************************************************/
83 /*************************************************************************/
84 /***** *****/
85 /***** CHUNK SETS *****/
86 /***** *****/
87 /*************************************************************************/
88 /*************************************************************************/
89
90 FT_LOCAL_DEF( void )
91 FTC_Family_Init( FTC_Family family,
92 FTC_Cache cache )
93 {
94 FTC_GCacheClass clazz = FTC_CACHE_GCACHE_CLASS( cache );
95
96
97 family->clazz = clazz->family_class;
98 family->num_nodes = 0;
99 family->cache = cache;
100 }
101
102
103 FT_LOCAL_DEF( FT_Error )
104 ftc_gcache_init( FTC_Cache cache )
105 {
106 FTC_GCache gcache = (FTC_GCache)cache;
107 FT_Error error;
108
109
110 error = FTC_Cache_Init( cache );
111 if ( !error )
112 {
113 FTC_GCacheClass clazz = (FTC_GCacheClass)cache->org_class;
114
115 FTC_MruList_Init( &gcache->families,
116 clazz->family_class,
117 0, /* no maximum here! */
118 cache,
119 cache->memory );
120 }
121
122 return error;
123 }
124
125
126#if 0
127
128 FT_LOCAL_DEF( FT_Error )
129 FTC_GCache_Init( FTC_GCache gcache )
130 {
131 return ftc_gcache_init( FTC_CACHE( gcache ) );
132 }
133
134#endif /* 0 */
135
136
137 FT_LOCAL_DEF( void )
138 ftc_gcache_done( FTC_Cache cache )
139 {
140 FTC_GCache gcache = (FTC_GCache)cache;
141
142
143 FTC_Cache_Done( cache );
144 FTC_MruList_Done( &gcache->families );
145 }
146
147
148#if 0
149
150 FT_LOCAL_DEF( void )
151 FTC_GCache_Done( FTC_GCache gcache )
152 {
153 ftc_gcache_done( FTC_CACHE( gcache ) );
154 }
155
156#endif /* 0 */
157
158
159 FT_LOCAL_DEF( FT_Error )
160 FTC_GCache_New( FTC_Manager manager,
161 FTC_GCacheClass clazz,
162 FTC_GCache *acache )
163 {
164 return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz,
165 (FTC_Cache*)acache );
166 }
167
168
169#ifndef FTC_INLINE
170
171 FT_LOCAL_DEF( FT_Error )
172 FTC_GCache_Lookup( FTC_GCache gcache,
173 FT_Offset hash,
174 FT_UInt gindex,
175 FTC_GQuery query,
176 FTC_Node *anode )
177 {
178 FT_Error error;
179
180
181 query->gindex = gindex;
182
183 FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error );
184 if ( !error )
185 {
186 FTC_Family family = query->family;
187
188
189 /* prevent the family from being destroyed too early when an */
190 /* out-of-memory condition occurs during glyph node initialization. */
191 family->num_nodes++;
192
193 error = FTC_Cache_Lookup( FTC_CACHE( gcache ), hash, query, anode );
194
195 if ( --family->num_nodes == 0 )
196 FTC_FAMILY_FREE( family, cache );
197 }
198 return error;
199 }
200
201#endif /* !FTC_INLINE */
202
203
204/* END */
205