sdk-world
v2026.11.05
PS2 SDK - world tier (copyleft-allowed, non-essential packages)
Toggle main menu visibility
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
126
FT_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
312
FT_END_HEADER
313
314
315
#endif
/* FTCGLYPH_H_ */
316
317
318
/* END */
ftcmanag.h
FTC_FamilyRec_
Definition
ftcglyph.h:138
FTC_GCacheClassRec_
Definition
ftcglyph.h:227
FTC_GCacheRec_
Definition
ftcglyph.h:202
FTC_GNodeRec_
Definition
ftcglyph.h:151
FTC_GQueryRec_
Definition
ftcglyph.h:163
freetype
src
cache
ftcglyph.h
Generated by
1.18.0