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