summaryrefslogtreecommitdiff
path: root/include/freetype/cache/ftccache.h
blob: 701b13eb0eec0b524cb6fdacfe03e3fdde82708d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
/***************************************************************************/
/*                                                                         */
/*  ftccache.h                                                             */
/*                                                                         */
/*    FreeType internal cache interface (specification).                   */
/*                                                                         */
/*  Copyright 2000-2001, 2002 by                                           */
/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
/*                                                                         */
/*  This file is part of the FreeType project, and may only be used,       */
/*  modified, and distributed under the terms of the FreeType project      */
/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
/*  this file you indicate that you have read the license and              */
/*  understand and accept it fully.                                        */
/*                                                                         */
/***************************************************************************/


#ifndef __FTCCACHE_H__
#define __FTCCACHE_H__


/* define to allow cache lookup inlining */
#define  FTC_CACHE_USE_INLINE


FT_BEGIN_HEADER

  /* handle to cache object */
  typedef struct FTC_CacheRec_*  FTC_Cache;

  /* handle to cache class */
  typedef const struct FTC_Cache_ClassRec_*  FTC_Cache_Class;

  /* handle to cache node family */
  typedef struct FTC_FamilyRec_*  FTC_Family;

  /* handle to cache root query */
  typedef struct FTC_QueryRec_*  FTC_Query;


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                   CACHE NODE DEFINITIONS                      *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  /*************************************************************************/
  /*                                                                       */
  /* Each cache controls one or more cache nodes.  Each node is part of    */
  /* the global_lru list of the manager.  Its `data' field however is used */
  /* as a reference count for now.                                         */
  /*                                                                       */
  /* A node can be anything, depending on the type of information held by  */
  /* the cache.  It can be an individual glyph image, a set of bitmaps     */
  /* glyphs for a given size, some metrics, etc.                           */
  /*                                                                       */
  /*************************************************************************/

  /* structure size should be 20 bytes on 32-bits machines */
  typedef struct  FTC_NodeRec_
  {
    FTC_Node   mru_next;     /* circular mru list pointer           */
    FTC_Node   mru_prev;     /* circular mru list pointer           */
    FTC_Node   link;         /* used for hashing                    */
    FT_UInt32  hash;         /* used for hashing too                */
    FT_UShort  fam_index;    /* index of family the node belongs to */
    FT_Short   ref_count;    /* reference count for this node       */

  } FTC_NodeRec;


#define FTC_NODE( x )    ( (FTC_Node)(x) )
#define FTC_NODE_P( x )  ( (FTC_Node*)(x) )


  /*************************************************************************/
  /*                                                                       */
  /* These functions are exported so that they can be called from          */
  /* user-provided cache classes; otherwise, they are really part of the   */
  /* cache sub-system internals.                                           */
  /*                                                                       */

  /* can be used as a FTC_Node_DoneFunc */
  FT_EXPORT( void )
  ftc_node_done( FTC_Node   node,
                 FTC_Cache  cache );

  /* reserved for manager's use */
  FT_EXPORT( void )
  ftc_node_destroy( FTC_Node     node,
                    FTC_Manager  manager );


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                   CACHE QUERY DEFINITIONS                     *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  /* A structure modelling a cache node query.  The following fields must  */
  /* all be set by the @FTC_Family_CompareFunc method of a cache's family  */
  /* list.                                                                 */
  /*                                                                       */
  typedef struct  FTC_QueryRec_
  {
    FTC_Family  family;
    FT_UFast    hash;

  } FTC_QueryRec;


#define FTC_QUERY( x )    ( (FTC_Query)(x) )
#define FTC_QUERY_P( x )  ( (FTC_Query*)(x) )


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                   CACHE FAMILY DEFINITIONS                    *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  typedef struct  FTC_FamilyRec_
  {
    FT_LruNodeRec  lru;
    FTC_Cache      cache;
    FT_UInt        num_nodes;
    FT_UInt        fam_index;

  } FTC_FamilyRec;


#define FTC_FAMILY( x )    ( (FTC_Family)(x) )
#define FTC_FAMILY_P( x )  ( (FTC_Family*)(x) )


  /*************************************************************************/
  /*                                                                       */
  /* These functions are exported so that they can be called from          */
  /* user-provided cache classes; otherwise, they are really part of the   */
  /* cache sub-system internals.                                           */
  /*                                                                       */

  /* must be called by any FTC_Node_InitFunc routine */
  FT_EXPORT( FT_Error )
  ftc_family_init( FTC_Family  family,
                   FTC_Query   query,
                   FTC_Cache   cache );


  /* can be used as a FTC_Family_DoneFunc; otherwise, must be called */
  /* by any family finalizer function                                */
  FT_EXPORT( void )
  ftc_family_done( FTC_Family  family );


  /*************************************************************************/
  /*************************************************************************/
  /*****                                                               *****/
  /*****                       CACHE DEFINITIONS                       *****/
  /*****                                                               *****/
  /*************************************************************************/
  /*************************************************************************/

  /* each cache really implements a dynamic hash table to manage its nodes */
  typedef struct  FTC_CacheRec_
  {
    FTC_Manager          manager;
    FT_Memory            memory;
    FTC_Cache_Class      clazz;

    FT_UInt              cache_index;  /* in manager's table         */
    FT_Pointer           cache_data;   /* used by cache node methods */

    FT_UFast             p;
    FT_UFast             mask;
    FT_Long              slack;
    FTC_Node*            buckets;

    FT_LruList_ClassRec  family_class;
    FT_LruList           families;

  } FTC_CacheRec;


#define FTC_CACHE( x )    ( (FTC_Cache)(x) )
#define FTC_CACHE_P( x )  ( (FTC_Cache*)(x) )


  /* initialize a given cache */
  typedef FT_Error
  (*FTC_Cache_InitFunc)( FTC_Cache  cache );

  /* clear a cache */
  typedef void
  (*FTC_Cache_ClearFunc)( FTC_Cache  cache );

  /* finalize a given cache */
  typedef void
  (*FTC_Cache_DoneFunc)( FTC_Cache  cache );


  typedef FT_Error
  (*FTC_Family_InitFunc)( FTC_Family  family,
                          FTC_Query   query,
                          FTC_Cache   cache );

  typedef FT_Int
  (*FTC_Family_CompareFunc)( FTC_Family  family,
                             FTC_Query   query );

  typedef void
  (*FTC_Family_DoneFunc)( FTC_Family  family,
                          FTC_Cache   cache );

  /* initialize a new cache node */
  typedef FT_Error
  (*FTC_Node_InitFunc)( FTC_Node    node,
                        FT_Pointer  type,
                        FTC_Cache   cache );

  /* compute the weight of a given cache node */
  typedef FT_ULong
  (*FTC_Node_WeightFunc)( FTC_Node   node,
                          FTC_Cache  cache );

  /* compare a node to a given key pair */
  typedef FT_Bool
  (*FTC_Node_CompareFunc)( FTC_Node    node,
                           FT_Pointer  key,
                           FTC_Cache   cache );

  /* finalize a given cache node */
  typedef void
  (*FTC_Node_DoneFunc)( FTC_Node   node,
                        FTC_Cache  cache );


  typedef struct  FTC_Cache_ClassRec_
  {
    FT_UInt                 cache_size;
    FTC_Cache_InitFunc      cache_init;
    FTC_Cache_ClearFunc     cache_clear;
    FTC_Cache_DoneFunc      cache_done;

    FT_UInt                 family_size;
    FTC_Family_InitFunc     family_init;
    FTC_Family_CompareFunc  family_compare;
    FTC_Family_DoneFunc     family_done;

    FT_UInt                 node_size;
    FTC_Node_InitFunc       node_init;
    FTC_Node_WeightFunc     node_weight;
    FTC_Node_CompareFunc    node_compare;
    FTC_Node_DoneFunc       node_done;

  } FTC_Cache_ClassRec;


  /* */


  /*************************************************************************/
  /*                                                                       */
  /* These functions are exported so that they can be called from          */
  /* user-provided cache classes; otherwise, they are really part of the   */
  /* cache sub-system internals.                                           */
  /*                                                                       */

  /* can be used directly as FTC_Cache_DoneFunc(), or called by custom */
  /* cache finalizers                                                  */
  FT_EXPORT( void )
  ftc_cache_done( FTC_Cache  cache );

  /* can be used directly as FTC_Cache_ClearFunc(), or called by custom */
  /* cache clear routines                                               */
  FT_EXPORT( void )
  ftc_cache_clear( FTC_Cache  cache );

  /* initalize the hash table within the cache */
  FT_EXPORT( FT_Error )
  ftc_cache_init( FTC_Cache  cache );

  /* can be called when the key's hash value has been computed */
  FT_EXPORT( FT_Error )
  ftc_cache_lookup( FTC_Cache  cache,
                    FTC_Query  query,
                    FTC_Node  *anode );

 /* */

FT_END_HEADER


#endif /* __FTCCACHE_H__ */


/* END */