⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ftccache.c

📁 一个Xpdf应用的例子
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************************************************************//*                                                                         *//*  ftccache.c                                                             *//*                                                                         *//*    The FreeType internal cache interface (body).                        *//*                                                                         *//*  Copyright 2000-2001 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.                                        *//*                                                                         *//***************************************************************************/#include <ft2build.h>#include FT_CACHE_MANAGER_H#include FT_INTERNAL_OBJECTS_H#include FT_INTERNAL_DEBUG_H#include "ftcerror.h"  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                   CACHE NODE DEFINITIONS                      *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/  FT_EXPORT_DEF( void )  ftc_node_done( FTC_Node   node,                 FTC_Cache  cache )  {    FTC_Family       family;    FTC_FamilyEntry  entry;    entry  = cache->manager->families.entries + node->fam_index;    family = entry->family;    /* remove from parent set table - eventually destroy the set */    if ( --family->num_nodes == 0 )      FT_LruList_Remove( cache->families, (FT_LruNode) family );  }  /* add a new node to the head of the manager's circular MRU list */  static void  ftc_node_mru_link( FTC_Node     node,                     FTC_Manager  manager )  {    FTC_Node  first = manager->nodes_list;    if ( first )    {      node->mru_prev = first->mru_prev;      node->mru_next = first;      first->mru_prev->mru_next = node;      first->mru_prev           = node;    }    else    {      node->mru_next = node;      node->mru_prev = node;    }    manager->nodes_list = node;    manager->num_nodes++;  }  /* remove a node from the manager's MRU list */  static void  ftc_node_mru_unlink( FTC_Node     node,                       FTC_Manager  manager )  {    FTC_Node  prev  = node->mru_prev;    FTC_Node  next  = node->mru_next;    FTC_Node  first = manager->nodes_list;    prev->mru_next = next;    next->mru_prev = prev;    if ( node->mru_next == first )    {      /* this is the last node in the list; update its head pointer */      if ( node == first )        manager->nodes_list = NULL;      else        first->mru_prev = prev;    }    node->mru_next = NULL;    node->mru_prev = NULL;    manager->num_nodes--;  }  /* move a node to the head of the manager's MRU list */  static void  ftc_node_mru_up( FTC_Node     node,                   FTC_Manager  manager )  {    FTC_Node  first = manager->nodes_list;    if ( node != first )    {      ftc_node_mru_unlink( node, manager );      ftc_node_mru_link( node, manager );    }  }  /* remove a node from its cache's hash table */  static void  ftc_node_hash_unlink( FTC_Node   node,                        FTC_Cache  cache )  {    FTC_Node  *pnode = cache->buckets + ( node->hash % cache->size );    for (;;)    {      if ( *pnode == NULL )      {        FT_ERROR(( "FreeType.cache.hash_unlink: unknown node!\n" ));        return;      }      if ( *pnode == node )      {        *pnode     = node->link;        node->link = NULL;        cache->nodes--;        return;      }      pnode = &(*pnode)->link;    }  }  /* add a node to the "top" of its cache's hash table */  static void  ftc_node_hash_link( FTC_Node   node,                      FTC_Cache  cache )  {    FTC_Node  *pnode = cache->buckets + ( node->hash % cache->size );    node->link = *pnode;    *pnode     = node;    cache->nodes++;  }  /* remove a node from the cache manager */  FT_EXPORT_DEF( void )  ftc_node_destroy( FTC_Node     node,                    FTC_Manager  manager )  {    FT_Memory        memory  = manager->library->memory;    FTC_Cache        cache;    FTC_FamilyEntry  entry;    FTC_Cache_Class  clazz;#ifdef FT_DEBUG_ERROR    /* find node's cache */    if ( node->fam_index >= manager->families.count )    {      FT_ERROR(( "ftc_node_destroy: invalid node handle\n" ));      return;    }#endif    entry = manager->families.entries + node->fam_index;    cache = entry->cache;#ifdef FT_DEBUG_ERROR    if ( cache == NULL )    {      FT_ERROR(( "ftc_node_destroy: invalid node handle\n" ));      return;    }#endif    clazz = cache->clazz;    manager->cur_weight -= clazz->node_weight( node, cache );    /* remove node from mru list */    ftc_node_mru_unlink( node, manager );    /* remove node from cache's hash table */    ftc_node_hash_unlink( node, cache );    /* now finalize it */    if ( clazz->node_done )      clazz->node_done( node, cache );    FREE( node );    /* check, just in case of general corruption :-) */    if ( manager->num_nodes == 0 )      FT_ERROR(( "ftc_node_destroy: invalid cache node count! = %d\n",                  manager->num_nodes ));  }  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                   CACHE FAMILY DEFINITIONS                    *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/  FT_EXPORT_DEF( FT_Error )  ftc_family_init( FTC_Family  family,                   FTC_Query   query,                   FTC_Cache   cache )  {    FT_Error         error;    FTC_Manager      manager = cache->manager;    FT_Memory        memory  = manager->library->memory;    FTC_FamilyEntry  entry;    family->cache     = cache;    family->num_nodes = 0;    /* now add to manager's family table */    error = ftc_family_table_alloc( &manager->families, memory, &entry );    if ( !error )    {      entry->cache      = cache;      entry->family     = family;      family->fam_index = entry->index;      query->family = family;   /* save family in query */    }    return error;  }  FT_EXPORT_DEF( void )  ftc_family_done( FTC_Family  family )  {    FTC_Manager  manager = family->cache->manager;    /* remove from manager's family table */    ftc_family_table_free( &manager->families, family->fam_index );  }  /*************************************************************************/  /*************************************************************************/  /*****                                                               *****/  /*****                    ABSTRACT CACHE CLASS                       *****/  /*****                                                               *****/  /*************************************************************************/  /*************************************************************************/#define FTC_PRIMES_MIN  7#define FTC_PRIMES_MAX  13845163  static const FT_UInt  ftc_primes[] =  {    7,    11,    19,    37,    73,    109,    163,    251,    367,    557,    823,    1237,    1861,    2777,    4177,    6247,    9371,    14057,    21089,    31627,    47431,    71143,    106721,    160073,    240101,    360163,    540217,    810343,    1215497,    1823231,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -