1
/***************************************************************************/
5
/* FreeType abstract glyph cache (specification). */
7
/* Copyright 2000-2001, 2003, 2004 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
/***************************************************************************/
21
* FTC_GCache is an _abstract_ cache object optimized to store glyph
22
* data. It works as follows:
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.
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.
33
* - Each FTC_GNode is thus an FTC_Node with two additional fields:
35
* * gindex: A glyph index, or the first index in a glyph range.
36
* * family: A pointer to a glyph `family'.
38
* - Family types are not fully specific in the FTC_Family type, but
39
* by classes that extend it.
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'.
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
51
* See also the FTC_ICache & FTC_SCache classes in `ftcimage.h' and
52
* `ftcsbits.h', which both extend FTC_GCache with additional
55
* A typical FTC_GCache implementation must provide at least the
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
65
* - FTC_Family sub-class, e.g. MyFamily, with relevant methods:
68
* my_family_reset (optional)
71
* - FTC_GQuery sub-class, e.g. MyQuery, to hold cache-specific query
74
* - Constant structures for a FTC_GNodeClass.
76
* - MyCacheNew() can be implemented easily as a call to the convenience
77
* function FTC_GCache_New.
79
* - MyCacheLookup with a call to FTC_GCache_Lookup. This function will
82
* - Search for the corresponding family in the cache, or create
83
* a new one if necessary. Put it in FTC_GQUERY(myquery).family
85
* - Call FTC_Cache_Lookup.
87
* If it returns NULL, you should create a new node, then call
88
* ftc_cache_add as usual.
92
/*************************************************************************/
94
/* Important: The functions defined in this file are only used to */
95
/* implement an abstract glyph cache class. You need to */
96
/* provide additional logic to implement a complete cache. */
98
/*************************************************************************/
101
/*************************************************************************/
102
/*************************************************************************/
103
/*************************************************************************/
104
/*************************************************************************/
105
/*************************************************************************/
106
/********* *********/
107
/********* WARNING, THIS IS BETA CODE. *********/
108
/********* *********/
109
/*************************************************************************/
110
/*************************************************************************/
111
/*************************************************************************/
112
/*************************************************************************/
113
/*************************************************************************/
116
#ifndef __FTCGLYPH_H__
117
#define __FTCGLYPH_H__
120
#include <ft2build.h>
121
#include FT_CACHE_INTERNAL_MANAGER_H
128
* We can group glyphs into `families'. Each family correspond to a
129
* given face ID, character size, transform, etc.
131
* Families are implemented as MRU list nodes. They are
135
typedef struct FTC_FamilyRec_
137
FTC_MruNodeRec mrunode;
138
FT_UInt num_nodes; /* current number of nodes in this family */
140
FTC_MruListClass clazz;
142
} FTC_FamilyRec, *FTC_Family;
144
#define FTC_FAMILY(x) ( (FTC_Family)(x) )
145
#define FTC_FAMILY_P(x) ( (FTC_Family*)(x) )
148
typedef struct FTC_GNodeRec_
154
} FTC_GNodeRec, *FTC_GNode;
156
#define FTC_GNODE( x ) ( (FTC_GNode)(x) )
157
#define FTC_GNODE_P( x ) ( (FTC_GNode*)(x) )
160
typedef struct FTC_GQueryRec_
165
} FTC_GQueryRec, *FTC_GQuery;
167
#define FTC_GQUERY( x ) ( (FTC_GQuery)(x) )
170
/*************************************************************************/
172
/* These functions are exported so that they can be called from */
173
/* user-provided cache classes; otherwise, they are really part of the */
174
/* cache sub-system internals. */
177
/* must be called by derived FTC_Node_InitFunc routines */
179
FTC_GNode_Init( FTC_GNode node,
180
FT_UInt gindex, /* glyph index for node */
183
/* returns TRUE iff the query's glyph index correspond to the node; */
184
/* this assumes that the "family" and "hash" fields of the query are */
185
/* already correctly set */
187
FTC_GNode_Compare( FTC_GNode gnode,
190
/* call this function to clear a node's family -- this is necessary */
191
/* to implement the `node_remove_faceid' cache method correctly */
193
FTC_GNode_UnselectFamily( FTC_GNode gnode,
196
/* must be called by derived FTC_Node_DoneFunc routines */
198
FTC_GNode_Done( FTC_GNode node,
203
FTC_Family_Init( FTC_Family family,
206
typedef struct FTC_GCacheRec_
209
FTC_MruListRec families;
211
} FTC_GCacheRec, *FTC_GCache;
213
#define FTC_GCACHE( x ) ((FTC_GCache)(x))
216
/* can be used as @FTC_Cache_InitFunc */
217
FT_EXPORT( FT_Error )
218
FTC_GCache_Init( FTC_GCache cache );
221
/* can be used as @FTC_Cache_DoneFunc */
223
FTC_GCache_Done( FTC_GCache cache );
226
/* the glyph cache class adds fields for the family implementation */
227
typedef struct FTC_GCacheClassRec_
229
FTC_CacheClassRec clazz;
230
FTC_MruListClass family_class;
232
} FTC_GCacheClassRec;
234
typedef const FTC_GCacheClassRec* FTC_GCacheClass;
236
#define FTC_GCACHE_CLASS( x ) ((FTC_GCacheClass)(x))
238
#define FTC_CACHE__GCACHE_CLASS( x ) \
239
FTC_GCACHE_CLASS( FTC_CACHE(x)->org_class )
240
#define FTC_CACHE__FAMILY_CLASS( x ) \
241
((FTC_MruListClass) FTC_CACHE__GCACHE_CLASS(x)->family_class)
244
/* convenience function; use it instead of FTC_Manager_Register_Cache */
245
FT_EXPORT( FT_Error )
246
FTC_GCache_New( FTC_Manager manager,
247
FTC_GCacheClass clazz,
248
FTC_GCache *acache );
250
FT_EXPORT( FT_Error )
251
FTC_GCache_Lookup( FTC_GCache cache,
260
#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \
261
gindex, query, node, error ) \
263
FTC_GCache _gcache = FTC_GCACHE( cache ); \
264
FTC_GQuery _gquery = (FTC_GQuery)( query ); \
265
FTC_MruNode_CompareFunc _fcompare = (FTC_MruNode_CompareFunc)(famcmp); \
268
_gquery->gindex = (gindex); \
270
FTC_MRULIST_LOOKUP_CMP( &_gcache->families, _gquery, _fcompare, \
271
_gquery->family, error ); \
273
FTC_CACHE_LOOKUP_CMP( cache, nodecmp, hash, query, node, error ); \
277
#else /* !FTC_INLINE */
279
#define FTC_GCACHE_LOOKUP_CMP( cache, famcmp, nodecmp, hash, \
280
gindex, query, node, error ) \
282
error = FTC_GCache_Lookup( FTC_GCACHE( cache ), hash, gindex, \
283
FTC_GQUERY( query ), (FTC_Node*)&(node) ); \
286
#endif /* !FTC_INLINE */
292
#endif /* __FTCGLYPH_H__ */