📄 ftccache.c
字号:
/***************************************************************************//* *//* 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 + -