blob: 70474e3337b1a86233045349cb265659cb32cd8f [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 Lemberg09370c82004-02-17 18:41:58 +00007/* Copyright 2000-2001, 2003, 2004 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>
20#include FT_CACHE_H
David Turner256de4b2006-03-20 12:10:24 +000021#include "ftcglyph.h"
Werner Lemberg328abf32003-12-24 13:37:58 +000022#include FT_ERRORS_H
23#include FT_INTERNAL_OBJECTS_H
24#include FT_INTERNAL_DEBUG_H
25
Werner Lemberg09370c82004-02-17 18:41:58 +000026#include "ftccback.h"
Werner Lemberg328abf32003-12-24 13:37:58 +000027#include "ftcerror.h"
28
29
30 /* create a new chunk node, setting its cache index and ref count */
31 FT_EXPORT_DEF( void )
32 FTC_GNode_Init( FTC_GNode gnode,
33 FT_UInt gindex,
34 FTC_Family family )
35 {
36 gnode->family = family;
37 gnode->gindex = gindex;
38 family->num_nodes++;
39 }
40
41
42 FT_EXPORT_DEF( void )
Werner Lemberg80cfbd72003-12-26 07:26:08 +000043 FTC_GNode_UnselectFamily( FTC_GNode gnode,
44 FTC_Cache cache )
Werner Lemberg328abf32003-12-24 13:37:58 +000045 {
46 FTC_Family family = gnode->family;
47
Werner Lemberg80cfbd72003-12-26 07:26:08 +000048
Werner Lemberg328abf32003-12-24 13:37:58 +000049 gnode->family = NULL;
Werner Lembergb9ff4152004-11-19 10:35:52 +000050 if ( family && --family->num_nodes == 0 )
David Turner5ab41362004-07-18 07:15:18 +000051 FTC_FAMILY_FREE( family, cache );
Werner Lemberg328abf32003-12-24 13:37:58 +000052 }
53
54
55 FT_EXPORT_DEF( void )
56 FTC_GNode_Done( FTC_GNode gnode,
57 FTC_Cache cache )
58 {
59 /* finalize the node */
60 gnode->gindex = 0;
61
62 FTC_GNode_UnselectFamily( gnode, cache );
63 }
64
65
Werner Lemberg09370c82004-02-17 18:41:58 +000066 FT_LOCAL_DEF( FT_Bool )
Werner Lemberge260d252004-05-17 09:25:04 +000067 ftc_gnode_compare( FTC_Node ftcgnode,
68 FT_Pointer ftcgquery,
69 FTC_Cache cache )
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
David Turnerb83239b2004-06-09 21:07:49 +000076 return FT_BOOL( gnode->family == gquery->family &&
77 gnode->gindex == gquery->gindex );
78 }
Werner Lemberge260d252004-05-17 09:25:04 +000079
David Turnerb83239b2004-06-09 21:07:49 +000080
81 FT_EXPORT_DEF( FT_Bool )
82 FTC_GNode_Compare( FTC_GNode gnode,
83 FTC_GQuery gquery )
84 {
Werner Lembergfefd8742004-06-12 13:21:20 +000085 return ftc_gnode_compare( FTC_NODE( gnode ), gquery, NULL );
Werner Lemberg09370c82004-02-17 18:41:58 +000086 }
87
88
Werner Lemberg328abf32003-12-24 13:37:58 +000089 /*************************************************************************/
90 /*************************************************************************/
91 /***** *****/
92 /***** CHUNK SETS *****/
93 /***** *****/
94 /*************************************************************************/
95 /*************************************************************************/
96
97 FT_EXPORT_DEF( void )
98 FTC_Family_Init( FTC_Family family,
99 FTC_Cache cache )
100 {
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000101 FTC_GCacheClass clazz = FTC_CACHE__GCACHE_CLASS( cache );
102
Werner Lemberg328abf32003-12-24 13:37:58 +0000103
104 family->clazz = clazz->family_class;
105 family->num_nodes = 0;
106 family->cache = cache;
107 }
108
109
David Turnerb83239b2004-06-09 21:07:49 +0000110 FT_LOCAL_DEF( FT_Error )
111 ftc_gcache_init( FTC_Cache ftccache )
Werner Lemberg328abf32003-12-24 13:37:58 +0000112 {
David Turnerb83239b2004-06-09 21:07:49 +0000113 FTC_GCache cache = (FTC_GCache)ftccache;
114 FT_Error error;
Werner Lemberg328abf32003-12-24 13:37:58 +0000115
Werner Lembergfefd8742004-06-12 13:21:20 +0000116
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000117 error = FTC_Cache_Init( FTC_CACHE( cache ) );
Werner Lemberg328abf32003-12-24 13:37:58 +0000118 if ( !error )
119 {
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000120 FTC_GCacheClass clazz = (FTC_GCacheClass)FTC_CACHE( cache )->org_class;
Werner Lemberg328abf32003-12-24 13:37:58 +0000121
122 FTC_MruList_Init( &cache->families,
123 clazz->family_class,
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000124 0, /* no maximum here! */
Werner Lemberg328abf32003-12-24 13:37:58 +0000125 cache,
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000126 FTC_CACHE( cache )->memory );
Werner Lemberg328abf32003-12-24 13:37:58 +0000127 }
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000128
Werner Lemberg328abf32003-12-24 13:37:58 +0000129 return error;
130 }
131
132
David Turnerb83239b2004-06-09 21:07:49 +0000133 FT_EXPORT_DEF( FT_Error )
134 FTC_GCache_Init( FTC_GCache cache )
Werner Lemberg09370c82004-02-17 18:41:58 +0000135 {
Werner Lembergfefd8742004-06-12 13:21:20 +0000136 return ftc_gcache_init( FTC_CACHE( cache ) );
Werner Lemberg328abf32003-12-24 13:37:58 +0000137 }
138
139
Werner Lemberg09370c82004-02-17 18:41:58 +0000140 FT_LOCAL_DEF( void )
Werner Lemberge260d252004-05-17 09:25:04 +0000141 ftc_gcache_done( FTC_Cache ftccache )
Werner Lemberg09370c82004-02-17 18:41:58 +0000142 {
Werner Lemberge260d252004-05-17 09:25:04 +0000143 FTC_GCache cache = (FTC_GCache)ftccache;
144
145
David Turnerb83239b2004-06-09 21:07:49 +0000146 FTC_Cache_Done( (FTC_Cache)cache );
147 FTC_MruList_Done( &cache->families );
Werner Lemberg09370c82004-02-17 18:41:58 +0000148 }
149
150
Werner Lembergfefd8742004-06-12 13:21:20 +0000151 FT_EXPORT_DEF( void )
152 FTC_GCache_Done( FTC_GCache cache )
153 {
154 ftc_gcache_done( FTC_CACHE( cache ) );
155 }
156
157
Werner Lemberg328abf32003-12-24 13:37:58 +0000158 FT_EXPORT_DEF( FT_Error )
159 FTC_GCache_New( FTC_Manager manager,
160 FTC_GCacheClass clazz,
161 FTC_GCache *acache )
162 {
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000163 return FTC_Manager_RegisterCache( manager, (FTC_CacheClass)clazz,
164 (FTC_Cache*)acache );
Werner Lemberg328abf32003-12-24 13:37:58 +0000165 }
166
167
168 FT_EXPORT_DEF( FT_Error )
169 FTC_GCache_Lookup( FTC_GCache cache,
170 FT_UInt32 hash,
171 FT_UInt gindex,
172 FTC_GQuery query,
173 FTC_Node *anode )
174 {
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000175 FT_Error error;
176
Werner Lemberg328abf32003-12-24 13:37:58 +0000177
178 query->gindex = gindex;
179
180 FTC_MRULIST_LOOKUP( &cache->families, query, query->family, error );
181 if ( !error )
David Turner5ab41362004-07-18 07:15:18 +0000182 {
183 FTC_Family family = query->family;
184
Werner Lemberg3fb70ba2004-07-19 20:02:35 +0000185
186 /* prevent the family from being destroyed too early when an */
187 /* out-of-memory condition occurs during glyph node initialization. */
David Turner5ab41362004-07-18 07:15:18 +0000188 family->num_nodes++;
189
Werner Lemberg80cfbd72003-12-26 07:26:08 +0000190 error = FTC_Cache_Lookup( FTC_CACHE( cache ), hash, query, anode );
Werner Lemberg328abf32003-12-24 13:37:58 +0000191
Werner Lembergb9ff4152004-11-19 10:35:52 +0000192 if ( --family->num_nodes == 0 )
David Turner5ab41362004-07-18 07:15:18 +0000193 FTC_FAMILY_FREE( family, cache );
194 }
Werner Lemberg328abf32003-12-24 13:37:58 +0000195 return error;
196 }
197
198
199/* END */