1bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/***************************************************************************/ 2bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 3bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* ftcmanag.h */ 4bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 5bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* FreeType Cache Manager (specification). */ 6bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 7bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* Copyright 2000-2001, 2003, 2004, 2006, 2010 by */ 8bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 10bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* This file is part of the FreeType project, and may only be used, */ 11bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* modified, and distributed under the terms of the FreeType project */ 12bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* this file you indicate that you have read the license and */ 14bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* understand and accept it fully. */ 15bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* */ 16bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/***************************************************************************/ 17bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 18bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 19bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 20bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 21bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* A cache manager is in charge of the following: */ 22bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 23bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* - Maintain a mapping between generic FTC_FaceIDs and live FT_Face */ 24bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* objects. The mapping itself is performed through a user-provided */ 25bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* callback. However, the manager maintains a small cache of FT_Face */ 26bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* and FT_Size objects in order to speed up things considerably. */ 27bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 28bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* - Manage one or more cache objects. Each cache is in charge of */ 29bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* holding a varying number of `cache nodes'. Each cache node */ 30bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* represents a minimal amount of individually accessible cached */ 31bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* data. For example, a cache node can be an FT_Glyph image */ 32bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* containing a vector outline, or some glyph metrics, or anything */ 33bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* else. */ 34bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 35bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* Each cache node has a certain size in bytes that is added to the */ 36bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* total amount of `cache memory' within the manager. */ 37bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 38bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* All cache nodes are located in a global LRU list, where the oldest */ 39bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* node is at the tail of the list. */ 40bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 41bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* Each node belongs to a single cache, and includes a reference */ 42bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* count to avoid destroying it (due to caching). */ 43bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 44bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 45bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 46bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 47bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 48bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 49bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 50bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 51bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 52bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /********* *********/ 53bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /********* WARNING, THIS IS BETA CODE. *********/ 54bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /********* *********/ 55bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 56bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 57bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 58bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 59bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 60bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 61bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 62bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#ifndef __FTCMANAG_H__ 63bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define __FTCMANAG_H__ 64bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 65bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 66bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#include <ft2build.h> 67bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#include FT_CACHE_H 68bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#include "ftcmru.h" 69bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#include "ftccache.h" 70bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 71bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 72bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier BaillyFT_BEGIN_HEADER 73bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 74bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 75bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 76bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 77bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* <Section> */ 78bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* cache_subsystem */ 79bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 80bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 81bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 82bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 83bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define FTC_MAX_FACES_DEFAULT 2 84bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define FTC_MAX_SIZES_DEFAULT 4 85bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define FTC_MAX_BYTES_DEFAULT 200000L /* ~200kByte by default */ 86bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 87bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* maximum number of caches registered in a single manager */ 88bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define FTC_MAX_CACHES 16 89bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 90bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 91bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly typedef struct FTC_ManagerRec_ 92bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly { 93bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Library library; 94bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Memory memory; 95bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 96bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_Node nodes_list; 97bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ULong max_weight; 98bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_ULong cur_weight; 99bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt num_nodes; 100bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 101bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_Cache caches[FTC_MAX_CACHES]; 102bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt num_caches; 103bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 104bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_MruListRec faces; 105bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_MruListRec sizes; 106bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 107bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_Pointer request_data; 108bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_Face_Requester request_face; 109bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 110bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly } FTC_ManagerRec; 111bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 112bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 113bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /*************************************************************************/ 114bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 115bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* <Function> */ 116bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* FTC_Manager_Compress */ 117bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 118bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* <Description> */ 119bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* This function is used to check the state of the cache manager if */ 120bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* its `num_bytes' field is greater than its `max_bytes' field. It */ 121bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* will flush as many old cache nodes as possible (ignoring cache */ 122bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* nodes with a non-zero reference count). */ 123bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 124bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* <InOut> */ 125bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* manager :: A handle to the cache manager. */ 126bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 127bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* <Note> */ 128bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* Client applications should not call this function directly. It is */ 129bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* normally invoked by specific cache implementations. */ 130bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 131bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* The reason this function is exported is to allow client-specific */ 132bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* cache classes. */ 133bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 134bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL( void ) 135bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_Manager_Compress( FTC_Manager manager ); 136bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 137bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 138bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* try to flush `count' old nodes from the cache; return the number 139bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly * of really flushed nodes 140bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly */ 141bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL( FT_UInt ) 142bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_Manager_FlushN( FTC_Manager manager, 143bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_UInt count ); 144bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 145bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 146bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* this must be used internally for the moment */ 147bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FT_LOCAL( FT_Error ) 148bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_Manager_RegisterCache( FTC_Manager manager, 149bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_CacheClass clazz, 150bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly FTC_Cache *acache ); 151bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 152bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 153bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 154bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define FTC_SCALER_COMPARE( a, b ) \ 155bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ( (a)->face_id == (b)->face_id && \ 156bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly (a)->width == (b)->width && \ 157bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly (a)->height == (b)->height && \ 158bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ((a)->pixel != 0) == ((b)->pixel != 0) && \ 159bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ( (a)->pixel || \ 160bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ( (a)->x_res == (b)->x_res && \ 161bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly (a)->y_res == (b)->y_res ) ) ) 162bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 163bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#define FTC_SCALER_HASH( q ) \ 164bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ( _FTC_FACE_ID_HASH( (q)->face_id ) + \ 165bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly (q)->width + (q)->height*7 + \ 166bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly ( (q)->pixel ? 0 : ( (q)->x_res*33 ^ (q)->y_res*61 ) ) ) 167bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 168bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly /* */ 169bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 170bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier BaillyFT_END_HEADER 171bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 172bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly#endif /* __FTCMANAG_H__ */ 173bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 174bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly 175bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/* END */ 176