1bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/***************************************************************************/
2bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/*                                                                         */
3bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/*  ftcmanag.h                                                             */
4bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/*                                                                         */
5bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/*    FreeType Cache Manager (specification).                              */
6bff90fb5ec88ad7fdfb6d1d2f5a5719c20a2c5dcOlivier Bailly/*                                                                         */
7727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/*  Copyright 2000-2001, 2003, 2004, 2006, 2010, 2013 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;
97727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Offset           max_weight;
98727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease    FT_Offset           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