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