topical media & game development

talk show tell print

lib-of-vs-libs-free-type-2.1.4-include-freetype2-freetype-cache-ftccache.h / h



  
************************************************************************

  
  /*                                                                         */
  /*  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 */
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.