xref: /inferno-os/include/freetype/cache/ftccache.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth /***************************************************************************/
2*37da2899SCharles.Forsyth /*                                                                         */
3*37da2899SCharles.Forsyth /*  ftccache.h                                                             */
4*37da2899SCharles.Forsyth /*                                                                         */
5*37da2899SCharles.Forsyth /*    FreeType internal cache interface (specification).                   */
6*37da2899SCharles.Forsyth /*                                                                         */
7*37da2899SCharles.Forsyth /*  Copyright 2000-2001, 2002 by                                           */
8*37da2899SCharles.Forsyth /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
9*37da2899SCharles.Forsyth /*                                                                         */
10*37da2899SCharles.Forsyth /*  This file is part of the FreeType project, and may only be used,       */
11*37da2899SCharles.Forsyth /*  modified, and distributed under the terms of the FreeType project      */
12*37da2899SCharles.Forsyth /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
13*37da2899SCharles.Forsyth /*  this file you indicate that you have read the license and              */
14*37da2899SCharles.Forsyth /*  understand and accept it fully.                                        */
15*37da2899SCharles.Forsyth /*                                                                         */
16*37da2899SCharles.Forsyth /***************************************************************************/
17*37da2899SCharles.Forsyth 
18*37da2899SCharles.Forsyth 
19*37da2899SCharles.Forsyth #ifndef __FTCCACHE_H__
20*37da2899SCharles.Forsyth #define __FTCCACHE_H__
21*37da2899SCharles.Forsyth 
22*37da2899SCharles.Forsyth 
23*37da2899SCharles.Forsyth /* define to allow cache lookup inlining */
24*37da2899SCharles.Forsyth #define  FTC_CACHE_USE_INLINE
25*37da2899SCharles.Forsyth 
26*37da2899SCharles.Forsyth 
27*37da2899SCharles.Forsyth FT_BEGIN_HEADER
28*37da2899SCharles.Forsyth 
29*37da2899SCharles.Forsyth   /* handle to cache object */
30*37da2899SCharles.Forsyth   typedef struct FTC_CacheRec_*  FTC_Cache;
31*37da2899SCharles.Forsyth 
32*37da2899SCharles.Forsyth   /* handle to cache class */
33*37da2899SCharles.Forsyth   typedef const struct FTC_Cache_ClassRec_*  FTC_Cache_Class;
34*37da2899SCharles.Forsyth 
35*37da2899SCharles.Forsyth   /* handle to cache node family */
36*37da2899SCharles.Forsyth   typedef struct FTC_FamilyRec_*  FTC_Family;
37*37da2899SCharles.Forsyth 
38*37da2899SCharles.Forsyth   /* handle to cache root query */
39*37da2899SCharles.Forsyth   typedef struct FTC_QueryRec_*  FTC_Query;
40*37da2899SCharles.Forsyth 
41*37da2899SCharles.Forsyth 
42*37da2899SCharles.Forsyth   /*************************************************************************/
43*37da2899SCharles.Forsyth   /*************************************************************************/
44*37da2899SCharles.Forsyth   /*****                                                               *****/
45*37da2899SCharles.Forsyth   /*****                   CACHE NODE DEFINITIONS                      *****/
46*37da2899SCharles.Forsyth   /*****                                                               *****/
47*37da2899SCharles.Forsyth   /*************************************************************************/
48*37da2899SCharles.Forsyth   /*************************************************************************/
49*37da2899SCharles.Forsyth 
50*37da2899SCharles.Forsyth   /*************************************************************************/
51*37da2899SCharles.Forsyth   /*                                                                       */
52*37da2899SCharles.Forsyth   /* Each cache controls one or more cache nodes.  Each node is part of    */
53*37da2899SCharles.Forsyth   /* the global_lru list of the manager.  Its `data' field however is used */
54*37da2899SCharles.Forsyth   /* as a reference count for now.                                         */
55*37da2899SCharles.Forsyth   /*                                                                       */
56*37da2899SCharles.Forsyth   /* A node can be anything, depending on the type of information held by  */
57*37da2899SCharles.Forsyth   /* the cache.  It can be an individual glyph image, a set of bitmaps     */
58*37da2899SCharles.Forsyth   /* glyphs for a given size, some metrics, etc.                           */
59*37da2899SCharles.Forsyth   /*                                                                       */
60*37da2899SCharles.Forsyth   /*************************************************************************/
61*37da2899SCharles.Forsyth 
62*37da2899SCharles.Forsyth   /* structure size should be 20 bytes on 32-bits machines */
63*37da2899SCharles.Forsyth   typedef struct  FTC_NodeRec_
64*37da2899SCharles.Forsyth   {
65*37da2899SCharles.Forsyth     FTC_Node   mru_next;     /* circular mru list pointer           */
66*37da2899SCharles.Forsyth     FTC_Node   mru_prev;     /* circular mru list pointer           */
67*37da2899SCharles.Forsyth     FTC_Node   link;         /* used for hashing                    */
68*37da2899SCharles.Forsyth     FT_UInt32  hash;         /* used for hashing too                */
69*37da2899SCharles.Forsyth     FT_UShort  fam_index;    /* index of family the node belongs to */
70*37da2899SCharles.Forsyth     FT_Short   ref_count;    /* reference count for this node       */
71*37da2899SCharles.Forsyth 
72*37da2899SCharles.Forsyth   } FTC_NodeRec;
73*37da2899SCharles.Forsyth 
74*37da2899SCharles.Forsyth 
75*37da2899SCharles.Forsyth #define FTC_NODE( x )    ( (FTC_Node)(x) )
76*37da2899SCharles.Forsyth #define FTC_NODE_P( x )  ( (FTC_Node*)(x) )
77*37da2899SCharles.Forsyth 
78*37da2899SCharles.Forsyth 
79*37da2899SCharles.Forsyth   /*************************************************************************/
80*37da2899SCharles.Forsyth   /*                                                                       */
81*37da2899SCharles.Forsyth   /* These functions are exported so that they can be called from          */
82*37da2899SCharles.Forsyth   /* user-provided cache classes; otherwise, they are really part of the   */
83*37da2899SCharles.Forsyth   /* cache sub-system internals.                                           */
84*37da2899SCharles.Forsyth   /*                                                                       */
85*37da2899SCharles.Forsyth 
86*37da2899SCharles.Forsyth   /* can be used as a FTC_Node_DoneFunc */
87*37da2899SCharles.Forsyth   FT_EXPORT( void )
88*37da2899SCharles.Forsyth   ftc_node_done( FTC_Node   node,
89*37da2899SCharles.Forsyth                  FTC_Cache  cache );
90*37da2899SCharles.Forsyth 
91*37da2899SCharles.Forsyth   /* reserved for manager's use */
92*37da2899SCharles.Forsyth   FT_EXPORT( void )
93*37da2899SCharles.Forsyth   ftc_node_destroy( FTC_Node     node,
94*37da2899SCharles.Forsyth                     FTC_Manager  manager );
95*37da2899SCharles.Forsyth 
96*37da2899SCharles.Forsyth 
97*37da2899SCharles.Forsyth   /*************************************************************************/
98*37da2899SCharles.Forsyth   /*************************************************************************/
99*37da2899SCharles.Forsyth   /*****                                                               *****/
100*37da2899SCharles.Forsyth   /*****                   CACHE QUERY DEFINITIONS                     *****/
101*37da2899SCharles.Forsyth   /*****                                                               *****/
102*37da2899SCharles.Forsyth   /*************************************************************************/
103*37da2899SCharles.Forsyth   /*************************************************************************/
104*37da2899SCharles.Forsyth 
105*37da2899SCharles.Forsyth   /* A structure modelling a cache node query.  The following fields must  */
106*37da2899SCharles.Forsyth   /* all be set by the @FTC_Family_CompareFunc method of a cache's family  */
107*37da2899SCharles.Forsyth   /* list.                                                                 */
108*37da2899SCharles.Forsyth   /*                                                                       */
109*37da2899SCharles.Forsyth   typedef struct  FTC_QueryRec_
110*37da2899SCharles.Forsyth   {
111*37da2899SCharles.Forsyth     FTC_Family  family;
112*37da2899SCharles.Forsyth     FT_UFast    hash;
113*37da2899SCharles.Forsyth 
114*37da2899SCharles.Forsyth   } FTC_QueryRec;
115*37da2899SCharles.Forsyth 
116*37da2899SCharles.Forsyth 
117*37da2899SCharles.Forsyth #define FTC_QUERY( x )    ( (FTC_Query)(x) )
118*37da2899SCharles.Forsyth #define FTC_QUERY_P( x )  ( (FTC_Query*)(x) )
119*37da2899SCharles.Forsyth 
120*37da2899SCharles.Forsyth 
121*37da2899SCharles.Forsyth   /*************************************************************************/
122*37da2899SCharles.Forsyth   /*************************************************************************/
123*37da2899SCharles.Forsyth   /*****                                                               *****/
124*37da2899SCharles.Forsyth   /*****                   CACHE FAMILY DEFINITIONS                    *****/
125*37da2899SCharles.Forsyth   /*****                                                               *****/
126*37da2899SCharles.Forsyth   /*************************************************************************/
127*37da2899SCharles.Forsyth   /*************************************************************************/
128*37da2899SCharles.Forsyth 
129*37da2899SCharles.Forsyth   typedef struct  FTC_FamilyRec_
130*37da2899SCharles.Forsyth   {
131*37da2899SCharles.Forsyth     FT_LruNodeRec  lru;
132*37da2899SCharles.Forsyth     FTC_Cache      cache;
133*37da2899SCharles.Forsyth     FT_UInt        num_nodes;
134*37da2899SCharles.Forsyth     FT_UInt        fam_index;
135*37da2899SCharles.Forsyth 
136*37da2899SCharles.Forsyth   } FTC_FamilyRec;
137*37da2899SCharles.Forsyth 
138*37da2899SCharles.Forsyth 
139*37da2899SCharles.Forsyth #define FTC_FAMILY( x )    ( (FTC_Family)(x) )
140*37da2899SCharles.Forsyth #define FTC_FAMILY_P( x )  ( (FTC_Family*)(x) )
141*37da2899SCharles.Forsyth 
142*37da2899SCharles.Forsyth 
143*37da2899SCharles.Forsyth   /*************************************************************************/
144*37da2899SCharles.Forsyth   /*                                                                       */
145*37da2899SCharles.Forsyth   /* These functions are exported so that they can be called from          */
146*37da2899SCharles.Forsyth   /* user-provided cache classes; otherwise, they are really part of the   */
147*37da2899SCharles.Forsyth   /* cache sub-system internals.                                           */
148*37da2899SCharles.Forsyth   /*                                                                       */
149*37da2899SCharles.Forsyth 
150*37da2899SCharles.Forsyth   /* must be called by any FTC_Node_InitFunc routine */
151*37da2899SCharles.Forsyth   FT_EXPORT( FT_Error )
152*37da2899SCharles.Forsyth   ftc_family_init( FTC_Family  family,
153*37da2899SCharles.Forsyth                    FTC_Query   query,
154*37da2899SCharles.Forsyth                    FTC_Cache   cache );
155*37da2899SCharles.Forsyth 
156*37da2899SCharles.Forsyth 
157*37da2899SCharles.Forsyth   /* can be used as a FTC_Family_DoneFunc; otherwise, must be called */
158*37da2899SCharles.Forsyth   /* by any family finalizer function                                */
159*37da2899SCharles.Forsyth   FT_EXPORT( void )
160*37da2899SCharles.Forsyth   ftc_family_done( FTC_Family  family );
161*37da2899SCharles.Forsyth 
162*37da2899SCharles.Forsyth 
163*37da2899SCharles.Forsyth   /*************************************************************************/
164*37da2899SCharles.Forsyth   /*************************************************************************/
165*37da2899SCharles.Forsyth   /*****                                                               *****/
166*37da2899SCharles.Forsyth   /*****                       CACHE DEFINITIONS                       *****/
167*37da2899SCharles.Forsyth   /*****                                                               *****/
168*37da2899SCharles.Forsyth   /*************************************************************************/
169*37da2899SCharles.Forsyth   /*************************************************************************/
170*37da2899SCharles.Forsyth 
171*37da2899SCharles.Forsyth   /* each cache really implements a dynamic hash table to manage its nodes */
172*37da2899SCharles.Forsyth   typedef struct  FTC_CacheRec_
173*37da2899SCharles.Forsyth   {
174*37da2899SCharles.Forsyth     FTC_Manager          manager;
175*37da2899SCharles.Forsyth     FT_Memory            memory;
176*37da2899SCharles.Forsyth     FTC_Cache_Class      clazz;
177*37da2899SCharles.Forsyth 
178*37da2899SCharles.Forsyth     FT_UInt              cache_index;  /* in manager's table         */
179*37da2899SCharles.Forsyth     FT_Pointer           cache_data;   /* used by cache node methods */
180*37da2899SCharles.Forsyth 
181*37da2899SCharles.Forsyth     FT_UFast             p;
182*37da2899SCharles.Forsyth     FT_UFast             mask;
183*37da2899SCharles.Forsyth     FT_Long              slack;
184*37da2899SCharles.Forsyth     FTC_Node*            buckets;
185*37da2899SCharles.Forsyth 
186*37da2899SCharles.Forsyth     FT_LruList_ClassRec  family_class;
187*37da2899SCharles.Forsyth     FT_LruList           families;
188*37da2899SCharles.Forsyth 
189*37da2899SCharles.Forsyth   } FTC_CacheRec;
190*37da2899SCharles.Forsyth 
191*37da2899SCharles.Forsyth 
192*37da2899SCharles.Forsyth #define FTC_CACHE( x )    ( (FTC_Cache)(x) )
193*37da2899SCharles.Forsyth #define FTC_CACHE_P( x )  ( (FTC_Cache*)(x) )
194*37da2899SCharles.Forsyth 
195*37da2899SCharles.Forsyth 
196*37da2899SCharles.Forsyth   /* initialize a given cache */
197*37da2899SCharles.Forsyth   typedef FT_Error
198*37da2899SCharles.Forsyth   (*FTC_Cache_InitFunc)( FTC_Cache  cache );
199*37da2899SCharles.Forsyth 
200*37da2899SCharles.Forsyth   /* clear a cache */
201*37da2899SCharles.Forsyth   typedef void
202*37da2899SCharles.Forsyth   (*FTC_Cache_ClearFunc)( FTC_Cache  cache );
203*37da2899SCharles.Forsyth 
204*37da2899SCharles.Forsyth   /* finalize a given cache */
205*37da2899SCharles.Forsyth   typedef void
206*37da2899SCharles.Forsyth   (*FTC_Cache_DoneFunc)( FTC_Cache  cache );
207*37da2899SCharles.Forsyth 
208*37da2899SCharles.Forsyth 
209*37da2899SCharles.Forsyth   typedef FT_Error
210*37da2899SCharles.Forsyth   (*FTC_Family_InitFunc)( FTC_Family  family,
211*37da2899SCharles.Forsyth                           FTC_Query   query,
212*37da2899SCharles.Forsyth                           FTC_Cache   cache );
213*37da2899SCharles.Forsyth 
214*37da2899SCharles.Forsyth   typedef FT_Int
215*37da2899SCharles.Forsyth   (*FTC_Family_CompareFunc)( FTC_Family  family,
216*37da2899SCharles.Forsyth                              FTC_Query   query );
217*37da2899SCharles.Forsyth 
218*37da2899SCharles.Forsyth   typedef void
219*37da2899SCharles.Forsyth   (*FTC_Family_DoneFunc)( FTC_Family  family,
220*37da2899SCharles.Forsyth                           FTC_Cache   cache );
221*37da2899SCharles.Forsyth 
222*37da2899SCharles.Forsyth   /* initialize a new cache node */
223*37da2899SCharles.Forsyth   typedef FT_Error
224*37da2899SCharles.Forsyth   (*FTC_Node_InitFunc)( FTC_Node    node,
225*37da2899SCharles.Forsyth                         FT_Pointer  type,
226*37da2899SCharles.Forsyth                         FTC_Cache   cache );
227*37da2899SCharles.Forsyth 
228*37da2899SCharles.Forsyth   /* compute the weight of a given cache node */
229*37da2899SCharles.Forsyth   typedef FT_ULong
230*37da2899SCharles.Forsyth   (*FTC_Node_WeightFunc)( FTC_Node   node,
231*37da2899SCharles.Forsyth                           FTC_Cache  cache );
232*37da2899SCharles.Forsyth 
233*37da2899SCharles.Forsyth   /* compare a node to a given key pair */
234*37da2899SCharles.Forsyth   typedef FT_Bool
235*37da2899SCharles.Forsyth   (*FTC_Node_CompareFunc)( FTC_Node    node,
236*37da2899SCharles.Forsyth                            FT_Pointer  key,
237*37da2899SCharles.Forsyth                            FTC_Cache   cache );
238*37da2899SCharles.Forsyth 
239*37da2899SCharles.Forsyth   /* finalize a given cache node */
240*37da2899SCharles.Forsyth   typedef void
241*37da2899SCharles.Forsyth   (*FTC_Node_DoneFunc)( FTC_Node   node,
242*37da2899SCharles.Forsyth                         FTC_Cache  cache );
243*37da2899SCharles.Forsyth 
244*37da2899SCharles.Forsyth 
245*37da2899SCharles.Forsyth   typedef struct  FTC_Cache_ClassRec_
246*37da2899SCharles.Forsyth   {
247*37da2899SCharles.Forsyth     FT_UInt                 cache_size;
248*37da2899SCharles.Forsyth     FTC_Cache_InitFunc      cache_init;
249*37da2899SCharles.Forsyth     FTC_Cache_ClearFunc     cache_clear;
250*37da2899SCharles.Forsyth     FTC_Cache_DoneFunc      cache_done;
251*37da2899SCharles.Forsyth 
252*37da2899SCharles.Forsyth     FT_UInt                 family_size;
253*37da2899SCharles.Forsyth     FTC_Family_InitFunc     family_init;
254*37da2899SCharles.Forsyth     FTC_Family_CompareFunc  family_compare;
255*37da2899SCharles.Forsyth     FTC_Family_DoneFunc     family_done;
256*37da2899SCharles.Forsyth 
257*37da2899SCharles.Forsyth     FT_UInt                 node_size;
258*37da2899SCharles.Forsyth     FTC_Node_InitFunc       node_init;
259*37da2899SCharles.Forsyth     FTC_Node_WeightFunc     node_weight;
260*37da2899SCharles.Forsyth     FTC_Node_CompareFunc    node_compare;
261*37da2899SCharles.Forsyth     FTC_Node_DoneFunc       node_done;
262*37da2899SCharles.Forsyth 
263*37da2899SCharles.Forsyth   } FTC_Cache_ClassRec;
264*37da2899SCharles.Forsyth 
265*37da2899SCharles.Forsyth 
266*37da2899SCharles.Forsyth   /* */
267*37da2899SCharles.Forsyth 
268*37da2899SCharles.Forsyth 
269*37da2899SCharles.Forsyth   /*************************************************************************/
270*37da2899SCharles.Forsyth   /*                                                                       */
271*37da2899SCharles.Forsyth   /* These functions are exported so that they can be called from          */
272*37da2899SCharles.Forsyth   /* user-provided cache classes; otherwise, they are really part of the   */
273*37da2899SCharles.Forsyth   /* cache sub-system internals.                                           */
274*37da2899SCharles.Forsyth   /*                                                                       */
275*37da2899SCharles.Forsyth 
276*37da2899SCharles.Forsyth   /* can be used directly as FTC_Cache_DoneFunc(), or called by custom */
277*37da2899SCharles.Forsyth   /* cache finalizers                                                  */
278*37da2899SCharles.Forsyth   FT_EXPORT( void )
279*37da2899SCharles.Forsyth   ftc_cache_done( FTC_Cache  cache );
280*37da2899SCharles.Forsyth 
281*37da2899SCharles.Forsyth   /* can be used directly as FTC_Cache_ClearFunc(), or called by custom */
282*37da2899SCharles.Forsyth   /* cache clear routines                                               */
283*37da2899SCharles.Forsyth   FT_EXPORT( void )
284*37da2899SCharles.Forsyth   ftc_cache_clear( FTC_Cache  cache );
285*37da2899SCharles.Forsyth 
286*37da2899SCharles.Forsyth   /* initalize the hash table within the cache */
287*37da2899SCharles.Forsyth   FT_EXPORT( FT_Error )
288*37da2899SCharles.Forsyth   ftc_cache_init( FTC_Cache  cache );
289*37da2899SCharles.Forsyth 
290*37da2899SCharles.Forsyth   /* can be called when the key's hash value has been computed */
291*37da2899SCharles.Forsyth   FT_EXPORT( FT_Error )
292*37da2899SCharles.Forsyth   ftc_cache_lookup( FTC_Cache  cache,
293*37da2899SCharles.Forsyth                     FTC_Query  query,
294*37da2899SCharles.Forsyth                     FTC_Node  *anode );
295*37da2899SCharles.Forsyth 
296*37da2899SCharles.Forsyth  /* */
297*37da2899SCharles.Forsyth 
298*37da2899SCharles.Forsyth FT_END_HEADER
299*37da2899SCharles.Forsyth 
300*37da2899SCharles.Forsyth 
301*37da2899SCharles.Forsyth #endif /* __FTCCACHE_H__ */
302*37da2899SCharles.Forsyth 
303*37da2899SCharles.Forsyth 
304*37da2899SCharles.Forsyth /* END */
305