blob: c4046812ddc53620fad00f15075902e5aed3f170 [file] [log] [blame]
Werner Lemberg328abf32003-12-24 13:37:58 +00001/***************************************************************************/
2/* */
3/* ftcglyph.c */
4/* */
5/* FreeType Glyph Image (FT_Glyph) cache (body). */
6/* */
Werner Lemberg9adeab62016-01-13 11:54:10 +01007/* Copyright 2000-2016 by */
Werner Lemberg328abf32003-12-24 13:37:58 +00008/* 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#include <ft2build.h>
suzuki toshiya38b272f2011-01-09 22:49:07 +090020#include FT_INTERNAL_OBJECTS_H
Werner Lemberg328abf32003-12-24 13:37:58 +000021#include FT_CACHE_H
David Turner256de4b2006-03-20 12:10:24 +000022#include "ftcglyph.h"
Werner Lemberg328abf32003-12-24 13:37:58 +000023#include FT_ERRORS_H
Werner Lemberg328abf32003-12-24 13:37:58 +000024
Werner Lemberg09370c82004-02-17 18:41:58 +000025#include "ftccback.h"
Werner Lemberg328abf32003-12-24 13:37:58 +000026#include "ftcerror.h"
27
28
29 /* create a new chunk node, setting its cache index and ref count */
Werner Lemberg6c5b6172006-03-22 15:30:41 +000030 FT_LOCAL_DEF( void )
Werner Lemberg328abf32003-12-24 13:37:58 +000031 FTC_GNode_Init( FTC_GNode gnode,
32 FT_UInt gindex,
33 FTC_Family family )
34 {
35 gnode->family = family;
36 gnode->gindex = gindex;
37 family->num_nodes++;
38 }
39
40
Werner Lemberg6c5b6172006-03-22 15:30:41 +000041 FT_LOCAL_DEF( void )
Werner Lemberg80cfbd72003-12-26 07:26:08 +000042 FTC_GNode_UnselectFamily( FTC_GNode gnode,
43 FTC_Cache cache )
Werner Lemberg328abf32003-12-24 13:37:58 +000044 {
45 FTC_Family family = gnode->family;
46
Werner Lemberg80cfbd72003-12-26 07:26:08 +000047
Werner Lemberg328abf32003-12-24 13:37:58 +000048 gnode->family = NULL;
Werner Lembergb9ff4152004-11-19 10:35:52 +000049 if ( family && --family->num_nodes == 0 )
David Turner5ab41362004-07-18 07:15:18 +000050 FTC_FAMILY_FREE( family, cache );
Werner Lemberg328abf32003-12-24 13:37:58 +000051 }
52
53
Werner Lemberg6c5b6172006-03-22 15:30:41 +000054 FT_LOCAL_DEF( void )
Werner Lemberg328abf32003-12-24 13:37:58 +000055 FTC_GNode_Done( FTC_GNode gnode,
56 FTC_Cache cache )
57 {
58 /* finalize the node */
59 gnode->gindex = 0;
60
61 FTC_GNode_UnselectFamily( gnode, cache );
62 }
63
64
Werner Lemberg09370c82004-02-17 18:41:58 +000065 FT_LOCAL_DEF( FT_Bool )
Werner Lemberge260d252004-05-17 09:25:04 +000066 ftc_gnode_compare( FTC_Node ftcgnode,
67 FT_Pointer ftcgquery,
suzuki toshiya38b272f2011-01-09 22:49:07 +090068 FTC_Cache cache,
69 FT_Bool* list_changed )
Werner Lemberg09370c82004-02-17 18:41:58 +000070 {
Werner Lemberge260d252004-05-17 09:25:04 +000071 FTC_GNode gnode = (FTC_GNode)ftcgnode;
72 FTC_GQuery gquery = (FTC_GQuery)ftcgquery;
73 FT_UNUSED( cache );
74
Werner Lembergfefd8742004-06-12 13:21:20 +000075
suzuki toshiya38b272f2011-01-09 22:49:07 +090076 if ( list_changed )
77 *list_changed = FALSE;
Werner Lemberg64ed3032009-12-20 18:12:57 +010078 return FT_BOOL( gnode->family == gquery->family &&
79 gnode->gindex == gquery->gindex );
David Turnerb83239b2004-06-09 21:07:49 +000080 }
Werner Lemberge260d252004-05-17 09:25:04 +000081
David Turnerb83239b2004-06-09 21:07:49 +000082
suzuki toshiya52a1e472011-01-09 20:47:37 +090083#ifdef FTC_INLINE
84
Werner Lemberg6c5b6172006-03-22 15:30:41 +000085 FT_LOCAL_DEF( FT_Bool )
David Turnerb83239b2004-06-09 21:07:49 +000086 FTC_GNode_Compare( FTC_GNode gnode,
suzuki toshiya62d116f2011-01-09 22:38:10 +090087 FTC_GQuery gquery,
suzuki toshiya38b272f2011-01-09 22:49:07 +090088 FTC_Cache cache,
89 FT_Bool* list_changed )
David Turnerb83239b2004-06-09 21:07:49 +000090 {
Werner Lemberg3757b1e2011-01-13 10:33:04 +010091 return ftc_gnode_compare( FTC_NODE( gnode ), gquery,
92 cache, list_changed );
Werner Lemberg09370c82004-02-17 18:41:58 +000093 }
94
suzuki toshiya52a1e472011-01-09 20:47:37 +090095#endif
Werner Lemberg09370c82004-02-17 18:41:58 +000096
Werner Lemberg328abf32003-12-24 13:37:58 +000097 /*************************************************************************/
98 /*************************************************************************/
99 /***** *****/
100 /***** CHUNK SETS *****/
101 /***** *****/
102 /*************************************************************************/
103 /*************************************************************************/
104
Werner Lemberg6c5b6172006-03-22 15:30:41 +0000105 FT_LOCAL_DEF( void )
Werner Lemberg328abf32003-12-24 13:37:58 +0000106 FTC_Family_Init( FTC_Family family,
107 FTC_Cache cache )
108 {
Werner Lemberg2e9d2662016-01-12 21:40:53 +0100109 FTC_GCacheClass clazz = FTC_CACHE_GCACHE_CLASS( cache );
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000110
Werner Lemberg328abf32003-12-24 13:37:58 +0000111
112 family->clazz = clazz->family_class;
113 family->num_nodes = 0;
114 family->cache = cache;
115 }
116
117
David Turnerb83239b2004-06-09 21:07:49 +0000118 FT_LOCAL_DEF( FT_Error )
119 ftc_gcache_init( FTC_Cache ftccache )
Werner Lemberg328abf32003-12-24 13:37:58 +0000120 {
David Turnerb83239b2004-06-09 21:07:49 +0000121 FTC_GCache cache = (FTC_GCache)ftccache;
122 FT_Error error;
Werner Lemberg328abf32003-12-24 13:37:58 +0000123
Werner Lembergfefd8742004-06-12 13:21:20 +0000124
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000125 error = FTC_Cache_Init( FTC_CACHE( cache ) );
Werner Lemberg328abf32003-12-24 13:37:58 +0000126 if ( !error )
127 {
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000128 FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class;
Werner Lemberg328abf32003-12-24 13:37:58 +0000129
130 FTC_MruList_Init( &cache->families,
131 clazz->family_class,
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000132 0, /* no maximum here! */
Werner Lemberg328abf32003-12-24 13:37:58 +0000133 cache,
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000134 FTC_CACHE( cache )->memory );
Werner Lemberg328abf32003-12-24 13:37:58 +0000135 }
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000136
Werner Lemberg328abf32003-12-24 13:37:58 +0000137 return error;
138 }
139
140
Werner Lemberg6c5b6172006-03-22 15:30:41 +0000141#if 0
142
143 FT_LOCAL_DEF( FT_Error )
David Turnerb83239b2004-06-09 21:07:49 +0000144 FTC_GCache_Init( FTC_GCache cache )
Werner Lemberg09370c82004-02-17 18:41:58 +0000145 {
Werner Lembergfefd8742004-06-12 13:21:20 +0000146 return ftc_gcache_init( FTC_CACHE( cache ) );
Werner Lemberg328abf32003-12-24 13:37:58 +0000147 }
148
Werner Lemberg6c5b6172006-03-22 15:30:41 +0000149#endif /* 0 */
150
Werner Lemberg328abf32003-12-24 13:37:58 +0000151
Werner Lemberg09370c82004-02-17 18:41:58 +0000152 FT_LOCAL_DEF( void )
Werner Lemberge260d252004-05-17 09:25:04 +0000153 ftc_gcache_done( FTC_Cache ftccache )
Werner Lemberg09370c82004-02-17 18:41:58 +0000154 {
Werner Lemberge260d252004-05-17 09:25:04 +0000155 FTC_GCache cache = (FTC_GCache)ftccache;
156
157
David Turnerb83239b2004-06-09 21:07:49 +0000158 FTC_Cache_Done( (FTC_Cache)cache );
159 FTC_MruList_Done( &cache->families );
Werner Lemberg09370c82004-02-17 18:41:58 +0000160 }
161
162
Werner Lemberg6c5b6172006-03-22 15:30:41 +0000163#if 0
164
165 FT_LOCAL_DEF( void )
Werner Lembergfefd8742004-06-12 13:21:20 +0000166 FTC_GCache_Done( FTC_GCache cache )
167 {
168 ftc_gcache_done( FTC_CACHE( cache ) );
169 }
170
Werner Lemberg6c5b6172006-03-22 15:30:41 +0000171#endif /* 0 */
Werner Lembergfefd8742004-06-12 13:21:20 +0000172
Werner Lemberg6c5b6172006-03-22 15:30:41 +0000173
174 FT_LOCAL_DEF( FT_Error )
Werner Lemberg328abf32003-12-24 13:37:58 +0000175 FTC_GCache_New( FTC_Manager manager,
176 FTC_GCacheClass clazz,
177 FTC_GCache *acache )
178 {
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000179 return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz,
180 (FTC_Cache*)acache );
Werner Lemberg328abf32003-12-24 13:37:58 +0000181 }
182
183
Werner Lemberg6c5b6172006-03-22 15:30:41 +0000184#ifndef FTC_INLINE
185
186 FT_LOCAL_DEF( FT_Error )
Werner Lemberg328abf32003-12-24 13:37:58 +0000187 FTC_GCache_Lookup( FTC_GCache cache,
Werner Lemberg3aaebe32015-02-23 08:20:27 +0100188 FT_Offset hash,
Werner Lemberg328abf32003-12-24 13:37:58 +0000189 FT_UInt gindex,
190 FTC_GQuery query,
191 FTC_Node *anode )
192 {
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000193 FT_Error error;
194
Werner Lemberg328abf32003-12-24 13:37:58 +0000195
196 query->gindex = gindex;
197
198 FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error );
199 if ( !error )
David Turner5ab41362004-07-18 07:15:18 +0000200 {
201 FTC_Family family = query->family;
202
Werner Lemberg3fb70ba2004-07-19 20:02:35 +0000203
204 /* prevent the family from being destroyed too early when an */
205 /* out-of-memory condition occurs during glyph node initialization. */
David Turner5ab41362004-07-18 07:15:18 +0000206 family->num_nodes++;
207
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000208 error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode );
Werner Lemberg328abf32003-12-24 13:37:58 +0000209
Werner Lembergb9ff4152004-11-19 10:35:52 +0000210 if ( --family->num_nodes == 0 )
David Turner5ab41362004-07-18 07:15:18 +0000211 FTC_FAMILY_FREE( family, cache );
212 }
Werner Lemberg328abf32003-12-24 13:37:58 +0000213 return error;
214 }
215
Werner Lemberg6c5b6172006-03-22 15:30:41 +0000216#endif /* !FTC_INLINE */
217
Werner Lemberg328abf32003-12-24 13:37:58 +0000218
219/* END */