sdk-world v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Loading...
Searching...
No Matches
ftcglyph.h
Go to the documentation of this file.
1/****************************************************************************
2 *
3 * ftcglyph.h
4 *
5 * FreeType abstract glyph cache (specification).
6 *
7 * Copyright (C) 2000-2025 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 /*
20 *
21 * FTC_GCache is an _abstract_ cache object optimized to store glyph
22 * data. It works as follows:
23 *
24 * - It manages FTC_GNode objects. Each one of them can hold one or more
25 * glyph `items'. Item types are not specified in the FTC_GCache but
26 * in classes that extend it.
27 *
28 * - Glyph attributes, like face ID, character size, render mode, etc.,
29 * can be grouped into abstract `glyph families'. This avoids storing
30 * the attributes within the FTC_GCache, since it is likely that many
31 * FTC_GNodes will belong to the same family in typical uses.
32 *
33 * - Each FTC_GNode is thus an FTC_Node with two additional fields:
34 *
35 * * gindex: A glyph index, or the first index in a glyph range.
36 * * family: A pointer to a glyph `family'.
37 *
38 * - Family types are not fully specific in the FTC_Family type, but
39 * by classes that extend it.
40 *
41 * Note that both FTC_ImageCache and FTC_SBitCache extend FTC_GCache.
42 * They share an FTC_Family sub-class called FTC_BasicFamily which is
43 * used to store the following data: face ID, pixel/point sizes, load
44 * flags. For more details see the file `src/cache/ftcbasic.c'.
45 *
46 * Client applications can extend FTC_GNode with their own FTC_GNode
47 * and FTC_Family sub-classes to implement more complex caches (e.g.,
48 * handling automatic synthesis, like obliquing & emboldening, colored
49 * glyphs, etc.).
50 *
51 * See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and
52 * `ftcsbits.h', which both extend FTC_GCache with additional
53 * optimizations.
54 *
55 * A typical FTC_GCache implementation must provide at least the
56 * following:
57 *
58 * - FTC_GNode sub-class, e.g. MyNode, with relevant methods:
59 * my_node_new (must call FTC_GNode_Init)
60 * my_node_free (must call FTC_GNode_Done)
61 * my_node_compare (must call ftc_gnode_compare)
62 * my_node_remove_faceid (must call ftc_gnode_unselect in case
63 * of match)
64 *
65 * - FTC_Family sub-class, e.g. MyFamily, with relevant methods:
66 * my_family_compare
67 * my_family_init
68 * my_family_done
69 *
70 * - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query
71 * data.
72 *
73 * - Constant structures for a FTC_GNodeClass.
74 *
75 * - MyCacheNew() can be implemented easily as a call to the convenience
76 * function FTC_GCache_New.
77 *
78 * - MyCacheLookup with a call to FTC_GCache_Lookup. This function will
79 * automatically:
80 *
81 * - Search for the corresponding family in the cache, or create
82 * a new one if necessary. Put it in FTC_GQUERY(myquery).family
83 *
84 * - Call FTC_Cache_Lookup.
85 *
86 * If it returns NULL, you should create a new node, then call
87 * ftc_cache_add as usual.
88 */
89
90
91 /**************************************************************************
92 *
93 * Important: The functions defined in this file are only used to
94 * implement an abstract glyph cache class. You need to
95 * provide additional logic to implement a complete cache.
96 *
97 */
98
99
100 /*************************************************************************/
101 /*************************************************************************/
102 /*************************************************************************/
103 /*************************************************************************/
104 /*************************************************************************/
105 /********* *********/
106 /********* WARNING, THIS IS BETA CODE. *********/
107 /********* *********/
108 /*************************************************************************/
109 /*************************************************************************/
110 /*************************************************************************/
111 /*************************************************************************/
112 /*************************************************************************/
113
114
119#ifndef FTCGLYPH_H_
120#define FTCGLYPH_H_
121
122
123#include "ftcmanag.h"
124
125
126FT_BEGIN_HEADER
127
128
129 /*
130 * We can group glyphs into `families'. Each family correspond to a
131 * given face ID, character size, transform, etc.
132 *
133 * Families are implemented as MRU list nodes. They are
134 * reference-counted.
135 */
136
137 typedef struct FTC_FamilyRec_
138 {
139 FTC_MruNodeRec mrunode;
140 FT_UInt num_nodes; /* current number of nodes in this family */
141 FTC_Cache cache;
142 FTC_MruListClass clazz;
143
144 } FTC_FamilyRec, *FTC_Family;
145
146#define FTC_FAMILY( x ) ( (FTC_Family)(x) )
147#define FTC_FAMILY_P( x ) ( (FTC_Family*)(x) )
148
149
150 typedef struct FTC_GNodeRec_
151 {
152 FTC_NodeRec node;
153 FTC_Family family;
154 FT_UInt gindex;
155
156 } FTC_GNodeRec, *FTC_GNode;
157
158#define FTC_GNODE( x ) ( (FTC_GNode)(x) )
159#define FTC_GNODE_P( x ) ( (FTC_GNode*)(x) )
160
161
162 typedef struct FTC_GQueryRec_
163 {
164 FT_UInt gindex;
165 FTC_Family family;
166
167 } FTC_GQueryRec, *FTC_GQuery;
168
169#define FTC_GQUERY( x ) ( (FTC_GQuery)(x) )
170
171
172 /**************************************************************************
173 *
174 * These functions are exported so that they can be called from
175 * user-provided cache classes; otherwise, they are really part of the
176 * cache sub-system internals.
177 */
178
179 /* must be called by derived FTC_Node_InitFunc routines */
180 FT_LOCAL( void )
181 FTC_GNode_Init( FTC_GNode node,
182 FT_UInt gindex, /* glyph index for node */
183 FTC_Family family );
184
185 /* call this function to clear a node's family -- this is necessary */
186 /* to implement the `node_remove_faceid' cache method correctly */
187 FT_LOCAL( void )
188 FTC_GNode_UnselectFamily( FTC_GNode gnode,
189 FTC_Cache cache );
190
191 /* must be called by derived FTC_Node_DoneFunc routines */
192 FT_LOCAL( void )
193 FTC_GNode_Done( FTC_GNode node,
194 FTC_Cache cache );
195
196
197 FT_LOCAL( void )
198 FTC_Family_Init( FTC_Family family,
199 FTC_Cache cache );
200
201 typedef struct FTC_GCacheRec_
202 {
203 FTC_CacheRec cache;
204 FTC_MruListRec families;
205
206 } FTC_GCacheRec, *FTC_GCache;
207
208#define FTC_GCACHE( x ) ((FTC_GCache)(x))
209
210
211#if 0
212 /* can be used as @FTC_Cache_InitFunc */
213 FT_LOCAL( FT_Error )
214 FTC_GCache_Init( FTC_GCache cache );
215#endif
216
217
218#if 0
219 /* can be used as @FTC_Cache_DoneFunc */
220 FT_LOCAL( void )
221 FTC_GCache_Done( FTC_GCache cache );
222#endif
223
224
225 /* the glyph cache class adds fields for the family implementation */
226 typedef struct FTC_GCacheClassRec_
227 {
228 FTC_CacheClassRec clazz;
229 FTC_MruListClass family_class;
230
231 } FTC_GCacheClassRec;
232
233 typedef const FTC_GCacheClassRec* FTC_GCacheClass;
234
235#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x))
236
237#define FTC_CACHE_GCACHE_CLASS( x ) \
238 FTC_GCACHE_CLASS( FTC_CACHE( x )->org_class )
239#define FTC_CACHE_FAMILY_CLASS( x ) \
240 ( (FTC_MruListClass)FTC_CACHE_GCACHE_CLASS( x )->family_class )
241
242
243 /* convenience function; use it instead of FTC_Manager_Register_Cache */
244 FT_LOCAL( FT_Error )
245 FTC_GCache_New( FTC_Manager manager,
246 FTC_GCacheClass clazz,
247 FTC_GCache *acache );
248
249#ifndef FTC_INLINE
250 FT_LOCAL( FT_Error )
251 FTC_GCache_Lookup( FTC_GCache cache,
252 FT_Offset hash,
253 FT_UInt gindex,
254 FTC_GQuery query,
255 FTC_Node *anode );
256#endif
257
258
259 /* */
260
261
262#define FTC_FAMILY_FREE( family, cache ) \
263 FTC_MruList_Remove( &FTC_GCACHE((cache))->families, \
264 (FTC_MruNode)(family) )
265
266
267#ifdef FTC_INLINE
268
269#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \
270 gindex, query, node, error ) \
271 FT_BEGIN_STMNT \
272 FTC_GCache _gcache = FTC_GCACHE( cache ); \
273 FTC_GQuery _gquery = (FTC_GQuery)( query ); \
274 FTC_MruNode_CompareFunc _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \
275 FTC_MruNode _mrunode; \
276 \
277 \
278 _gquery->gindex = (gindex); \
279 \
280 FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \
281 _mrunode, error ); \
282 _gquery->family = FTC_FAMILY( _mrunode ); \
283 if ( !error ) \
284 { \
285 FTC_Family _gqfamily = _gquery->family; \
286 \
287 \
288 _gqfamily->num_nodes++; \
289 \
290 FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \
291 \
292 if ( --_gqfamily->num_nodes == 0 ) \
293 FTC_FAMILY_FREE( _gqfamily, _gcache ); \
294 } \
295 FT_END_STMNT
296 /* */
297
298#else /* !FTC_INLINE */
299
300#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \
301 gindex, query, node, error ) \
302 FT_BEGIN_STMNT \
303 \
304 error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \
305 FTC_GQUERY( query ), &node ); \
306 \
307 FT_END_STMNT
308
309#endif /* !FTC_INLINE */
310
311
312FT_END_HEADER
313
314
315#endif /* FTCGLYPH_H_ */
316
317
318/* END */