17dd7cddfSDavid du Colombier /* Copyright (C) 1992, 1995, 1997, 1999 Aladdin Enterprises. All rights reserved. 27dd7cddfSDavid du Colombier 3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or 4*593dc095SDavid du Colombier implied. 57dd7cddfSDavid du Colombier 6*593dc095SDavid du Colombier This software is distributed under license and may not be copied, 7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms 8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution. 97dd7cddfSDavid du Colombier 10*593dc095SDavid du Colombier For more information about licensing, please refer to 11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on 12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or 13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110, 14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861. 157dd7cddfSDavid du Colombier */ 167dd7cddfSDavid du Colombier 17*593dc095SDavid du Colombier /* $Id: gxfcache.h,v 1.27 2004/08/19 19:33:09 stefan Exp $ */ 187dd7cddfSDavid du Colombier /* Font and character cache definitions and procedures */ 197dd7cddfSDavid du Colombier /* Requires gsfont.h */ 207dd7cddfSDavid du Colombier 217dd7cddfSDavid du Colombier #ifndef gxfcache_INCLUDED 227dd7cddfSDavid du Colombier # define gxfcache_INCLUDED 237dd7cddfSDavid du Colombier 24*593dc095SDavid du Colombier #include "gsccode.h" 257dd7cddfSDavid du Colombier #include "gsuid.h" 267dd7cddfSDavid du Colombier #include "gsxfont.h" 277dd7cddfSDavid du Colombier #include "gxbcache.h" 28*593dc095SDavid du Colombier #include "gxfixed.h" 297dd7cddfSDavid du Colombier #include "gxftype.h" 307dd7cddfSDavid du Colombier 317dd7cddfSDavid du Colombier /* ------ Font/matrix pair cache entry ------ */ 327dd7cddfSDavid du Colombier 33*593dc095SDavid du Colombier #ifndef gs_font_DEFINED 34*593dc095SDavid du Colombier # define gs_font_DEFINED 35*593dc095SDavid du Colombier typedef struct gs_font_s gs_font; 36*593dc095SDavid du Colombier #endif 377dd7cddfSDavid du Colombier #ifndef cached_fm_pair_DEFINED 387dd7cddfSDavid du Colombier # define cached_fm_pair_DEFINED 397dd7cddfSDavid du Colombier typedef struct cached_fm_pair_s cached_fm_pair; 407dd7cddfSDavid du Colombier #endif 41*593dc095SDavid du Colombier #ifndef gs_matrix_DEFINED 42*593dc095SDavid du Colombier # define gs_matrix_DEFINED 43*593dc095SDavid du Colombier typedef struct gs_matrix_s gs_matrix; 44*593dc095SDavid du Colombier #endif 45*593dc095SDavid du Colombier 46*593dc095SDavid du Colombier #ifndef ttfFont_DEFINED 47*593dc095SDavid du Colombier # define ttfFont_DEFINED 48*593dc095SDavid du Colombier typedef struct ttfFont_s ttfFont; 49*593dc095SDavid du Colombier #endif 50*593dc095SDavid du Colombier #ifndef gx_ttfReader_DEFINED 51*593dc095SDavid du Colombier # define gx_ttfReader_DEFINED 52*593dc095SDavid du Colombier typedef struct gx_ttfReader_s gx_ttfReader; 53*593dc095SDavid du Colombier #endif 54*593dc095SDavid du Colombier #ifndef ttfInterpreter_DEFINED 55*593dc095SDavid du Colombier # define ttfInterpreter_DEFINED 56*593dc095SDavid du Colombier typedef struct ttfInterpreter_s ttfInterpreter; 57*593dc095SDavid du Colombier #endif 58*593dc095SDavid du Colombier #ifndef gx_device_spot_analyzer_DEFINED 59*593dc095SDavid du Colombier # define gx_device_spot_analyzer_DEFINED 60*593dc095SDavid du Colombier typedef struct gx_device_spot_analyzer_s gx_device_spot_analyzer; 61*593dc095SDavid du Colombier #endif 62*593dc095SDavid du Colombier #ifndef gs_state_DEFINED 63*593dc095SDavid du Colombier # define gs_state_DEFINED 64*593dc095SDavid du Colombier typedef struct gs_state_s gs_state; 65*593dc095SDavid du Colombier #endif 66*593dc095SDavid du Colombier 677dd7cddfSDavid du Colombier 687dd7cddfSDavid du Colombier /* 697dd7cddfSDavid du Colombier * Define the entry for a cached (font,matrix) pair. If the UID 707dd7cddfSDavid du Colombier * is valid, the font pointer may be 0, since we keep entries even for 717dd7cddfSDavid du Colombier * fonts unloaded by a restore if they have valid UIDs; in this case, 727dd7cddfSDavid du Colombier * we also need the FontType as part of the key. 737dd7cddfSDavid du Colombier * Note that because of the dependency on StrokeWidth, we can't cache 747dd7cddfSDavid du Colombier * fonts with non-zero PaintType. 757dd7cddfSDavid du Colombier * We can't use the address of the pair for the hash value, 767dd7cddfSDavid du Colombier * since the GC may move pairs in storage, so we create a hash 777dd7cddfSDavid du Colombier * when we allocate the pair initially. 787dd7cddfSDavid du Colombier */ 797dd7cddfSDavid du Colombier struct cached_fm_pair_s { 807dd7cddfSDavid du Colombier gs_font *font; /* base font */ 817dd7cddfSDavid du Colombier gs_uid UID; /* font UniqueID or XUID */ 827dd7cddfSDavid du Colombier font_type FontType; /* (part of key if UID is valid) */ 837dd7cddfSDavid du Colombier uint hash; /* hash for this pair */ 847dd7cddfSDavid du Colombier float mxx, mxy, myx, myy; /* transformation */ 857dd7cddfSDavid du Colombier int num_chars; /* # of cached chars with this */ 867dd7cddfSDavid du Colombier /* f/m pair */ 877dd7cddfSDavid du Colombier bool xfont_tried; /* true if we looked up an xfont */ 887dd7cddfSDavid du Colombier gx_xfont *xfont; /* the xfont (if any) */ 897dd7cddfSDavid du Colombier gs_memory_t *memory; /* the allocator for the xfont */ 907dd7cddfSDavid du Colombier uint index; /* index of this pair in mdata */ 91*593dc095SDavid du Colombier ttfFont *ttf; /* True Type interpreter data. */ 92*593dc095SDavid du Colombier gx_ttfReader *ttr; /* True Type interpreter data. */ 93*593dc095SDavid du Colombier bool design_grid; /* A charpath font face. */ 947dd7cddfSDavid du Colombier }; 957dd7cddfSDavid du Colombier 967dd7cddfSDavid du Colombier #define private_st_cached_fm_pair() /* in gxccman.c */\ 97*593dc095SDavid du Colombier gs_private_st_ptrs5(st_cached_fm_pair, cached_fm_pair,\ 987dd7cddfSDavid du Colombier "cached_fm_pair", fm_pair_enum_ptrs, fm_pair_reloc_ptrs,\ 99*593dc095SDavid du Colombier font, UID.xvalues, xfont, ttf, ttr) 1007dd7cddfSDavid du Colombier #define private_st_cached_fm_pair_elt() /* in gxccman.c */\ 1017dd7cddfSDavid du Colombier gs_private_st_element(st_cached_fm_pair_element, cached_fm_pair,\ 1027dd7cddfSDavid du Colombier "cached_fm_pair[]", fm_pair_element_enum_ptrs, fm_pair_element_reloc_ptrs,\ 1037dd7cddfSDavid du Colombier st_cached_fm_pair) 1047dd7cddfSDavid du Colombier /* If font == 0 and UID is invalid, this is a free entry. */ 1057dd7cddfSDavid du Colombier #define fm_pair_is_free(pair)\ 1067dd7cddfSDavid du Colombier ((pair)->font == 0 && !uid_is_valid(&(pair)->UID)) 1077dd7cddfSDavid du Colombier #define fm_pair_set_free(pair)\ 1087dd7cddfSDavid du Colombier ((pair)->font = 0, uid_set_invalid(&(pair)->UID)) 1097dd7cddfSDavid du Colombier #define fm_pair_init(pair)\ 1107dd7cddfSDavid du Colombier (fm_pair_set_free(pair), (pair)->xfont_tried = false, (pair)->xfont = 0) 1117dd7cddfSDavid du Colombier 1127dd7cddfSDavid du Colombier /* The font/matrix pair cache itself. */ 1137dd7cddfSDavid du Colombier typedef struct fm_pair_cache_s { 1147dd7cddfSDavid du Colombier uint msize, mmax; /* # of cached font/matrix pairs */ 1157dd7cddfSDavid du Colombier cached_fm_pair *mdata; 1167dd7cddfSDavid du Colombier uint mnext; /* rover for allocating font/matrix pairs */ 1177dd7cddfSDavid du Colombier } fm_pair_cache; 1187dd7cddfSDavid du Colombier 1197dd7cddfSDavid du Colombier /* ------ Character cache entry ------- */ 1207dd7cddfSDavid du Colombier 1217dd7cddfSDavid du Colombier /* Define the allocation chunk type. */ 1227dd7cddfSDavid du Colombier typedef gx_bits_cache_chunk char_cache_chunk; 1237dd7cddfSDavid du Colombier 1247dd7cddfSDavid du Colombier /* 1257dd7cddfSDavid du Colombier * This is a subclass of the entry in a general bitmap cache. 1267dd7cddfSDavid du Colombier * The character cache contains both used and free blocks. 1277dd7cddfSDavid du Colombier * All blocks have a common header; free blocks have ONLY the header. 1287dd7cddfSDavid du Colombier */ 1297dd7cddfSDavid du Colombier typedef gx_cached_bits_head cached_char_head; 1307dd7cddfSDavid du Colombier 1317dd7cddfSDavid du Colombier #define cc_head_is_free(cch) cb_head_is_free(cch) 1327dd7cddfSDavid du Colombier #define cc_head_set_free(cch) cb_head_set_free(cch) 1337dd7cddfSDavid du Colombier /* 1347dd7cddfSDavid du Colombier * Define the cache entry for an individual character. 1357dd7cddfSDavid du Colombier * The bits, if any, immediately follow the structure; 1367dd7cddfSDavid du Colombier * characters with only xfont definitions may not have bits. 1377dd7cddfSDavid du Colombier * An entry is 'real' if it is not free and if pair != 0. 1387dd7cddfSDavid du Colombier * We maintain the invariant that at least one of the following must be true 1397dd7cddfSDavid du Colombier * for all real entries: 1407dd7cddfSDavid du Colombier * - cc_has_bits(cc); 1417dd7cddfSDavid du Colombier * - cc->xglyph != gx_no_xglyph && cc_pair(cc)->xfont != 0. 1427dd7cddfSDavid du Colombier */ 1437dd7cddfSDavid du Colombier #ifndef cached_char_DEFINED 1447dd7cddfSDavid du Colombier # define cached_char_DEFINED 1457dd7cddfSDavid du Colombier typedef struct cached_char_s cached_char; 1467dd7cddfSDavid du Colombier 1477dd7cddfSDavid du Colombier #endif 1487dd7cddfSDavid du Colombier struct cached_char_s { 1497dd7cddfSDavid du Colombier 1507dd7cddfSDavid du Colombier /* The code, font/matrix pair, wmode, and depth */ 1517dd7cddfSDavid du Colombier /* are the 'key' in the cache. */ 1527dd7cddfSDavid du Colombier /* gx_cached_bits_common includes depth. */ 1537dd7cddfSDavid du Colombier 1547dd7cddfSDavid du Colombier gx_cached_bits_common; /* (must be first) */ 1557dd7cddfSDavid du Colombier #define cc_depth(cc) ((cc)->cb_depth) 1567dd7cddfSDavid du Colombier #define cc_set_depth(cc, d) ((cc)->cb_depth = (d)) 1577dd7cddfSDavid du Colombier cached_fm_pair *pair; 158*593dc095SDavid du Colombier bool linked; 1597dd7cddfSDavid du Colombier #define cc_pair(cc) ((cc)->pair) 1607dd7cddfSDavid du Colombier #define cc_set_pair_only(cc, p) ((cc)->pair = (p)) 1617dd7cddfSDavid du Colombier gs_glyph code; /* glyph code */ 1627dd7cddfSDavid du Colombier byte wmode; /* writing mode (0 or 1) */ 1637dd7cddfSDavid du Colombier 1647dd7cddfSDavid du Colombier /* The following are neither 'key' nor 'value'. */ 1657dd7cddfSDavid du Colombier 1667dd7cddfSDavid du Colombier char_cache_chunk *chunk; /* chunk where this char */ 1677dd7cddfSDavid du Colombier /* is allocated */ 1687dd7cddfSDavid du Colombier uint loc; /* relative location in chunk */ 1697dd7cddfSDavid du Colombier uint pair_index; /* index of pair in mdata */ 170*593dc095SDavid du Colombier gs_fixed_point subpix_origin; /* glyph origin offset modulo pixel */ 1717dd7cddfSDavid du Colombier 1727dd7cddfSDavid du Colombier /* The rest of the structure is the 'value'. */ 1737dd7cddfSDavid du Colombier /* gx_cached_bits_common has width, height, raster, */ 1747dd7cddfSDavid du Colombier /* shift (not used here), id. */ 1757dd7cddfSDavid du Colombier 1767dd7cddfSDavid du Colombier #define cc_raster(cc) ((cc)->raster) 1777dd7cddfSDavid du Colombier #define cc_set_raster(cc, r) ((cc)->raster = (r)) 1787dd7cddfSDavid du Colombier gx_xglyph xglyph; /* the xglyph for the xfont, if any */ 1797dd7cddfSDavid du Colombier gs_fixed_point wxy; /* width in device coords */ 1807dd7cddfSDavid du Colombier gs_fixed_point offset; /* (-llx, -lly) in device coords */ 1817dd7cddfSDavid du Colombier }; 1827dd7cddfSDavid du Colombier 1837dd7cddfSDavid du Colombier #define cc_is_free(cc) cc_head_is_free(&(cc)->head) 1847dd7cddfSDavid du Colombier #define cc_set_free(cc) cc_head_set_free(&(cc)->head) 1857dd7cddfSDavid du Colombier #define cc_set_pair(cc, p)\ 1867dd7cddfSDavid du Colombier ((cc)->pair_index = ((cc)->pair = (p))->index) 1877dd7cddfSDavid du Colombier #define cc_has_bits(cc) ((cc)->id != gx_no_bitmap_id) 1887dd7cddfSDavid du Colombier /* 1897dd7cddfSDavid du Colombier * Memory management for cached_chars is a little unusual. 1907dd7cddfSDavid du Colombier * cached_chars are never instantiated on their own; a pointer to 1917dd7cddfSDavid du Colombier * a cached_char points into the middle of a cache chunk. 1927dd7cddfSDavid du Colombier * Consequently, such pointers can't be traced or relocated 1937dd7cddfSDavid du Colombier * in the usual way. What we do instead is allocate the cache 1947dd7cddfSDavid du Colombier * outside garbage-collectable space; we do all the tracing and relocating 1957dd7cddfSDavid du Colombier * of pointers *from* the cache (currently only the head.pair pointer) 1967dd7cddfSDavid du Colombier * when we trace or relocate the font "directory" that owns the cache. 1977dd7cddfSDavid du Colombier * 1987dd7cddfSDavid du Colombier * Since cached_chars are (currently) never instantiated on their own, 1997dd7cddfSDavid du Colombier * they only have a descriptor so that cached_char_ptr can trace them. 2007dd7cddfSDavid du Colombier */ 2017dd7cddfSDavid du Colombier #define private_st_cached_char() /* in gxccman.c */\ 2027dd7cddfSDavid du Colombier gs_private_st_composite(st_cached_char, cached_char, "cached_char",\ 2037dd7cddfSDavid du Colombier cached_char_enum_ptrs, cached_char_reloc_ptrs) 2047dd7cddfSDavid du Colombier #define private_st_cached_char_ptr() /* in gxccman.c */\ 2057dd7cddfSDavid du Colombier gs_private_st_composite(st_cached_char_ptr, cached_char *,\ 2067dd7cddfSDavid du Colombier "cached_char *", cc_ptr_enum_ptrs, cc_ptr_reloc_ptrs) 2077dd7cddfSDavid du Colombier #define private_st_cached_char_ptr_elt() /* in gxccman.c */\ 2087dd7cddfSDavid du Colombier gs_private_st_element(st_cached_char_ptr_element, cached_char *,\ 2097dd7cddfSDavid du Colombier "cached_char *[]", cc_ptr_element_enum_ptrs, cc_ptr_element_reloc_ptrs,\ 2107dd7cddfSDavid du Colombier st_cached_char_ptr) 2117dd7cddfSDavid du Colombier 2127dd7cddfSDavid du Colombier /* 2137dd7cddfSDavid du Colombier * Define the alignment and size of the cache structures. 2147dd7cddfSDavid du Colombier */ 2157dd7cddfSDavid du Colombier #define align_cached_char_mod align_cached_bits_mod 2167dd7cddfSDavid du Colombier #define sizeof_cached_char\ 2177dd7cddfSDavid du Colombier ROUND_UP(sizeof(cached_char), align_cached_char_mod) 2187dd7cddfSDavid du Colombier #define cc_bits(cc) ((byte *)(cc) + sizeof_cached_char) 2197dd7cddfSDavid du Colombier #define cc_const_bits(cc) ((const byte *)(cc) + sizeof_cached_char) 2207dd7cddfSDavid du Colombier 2217dd7cddfSDavid du Colombier /* Define the hash index for a (glyph, fm_pair) key. */ 2227dd7cddfSDavid du Colombier #define chars_head_index(glyph, pair)\ 2237dd7cddfSDavid du Colombier ((uint)(glyph) * 59 + (pair)->hash * 73) /* scramble it a bit */ 2247dd7cddfSDavid du Colombier 2257dd7cddfSDavid du Colombier /* ------ Character cache ------ */ 2267dd7cddfSDavid du Colombier 2277dd7cddfSDavid du Colombier /* 2287dd7cddfSDavid du Colombier * So that we can find all the entries in the cache without 2297dd7cddfSDavid du Colombier * following chains of pointers, we use open hashing rather than 2307dd7cddfSDavid du Colombier * chained hashing for the lookup table. 2317dd7cddfSDavid du Colombier */ 2327dd7cddfSDavid du Colombier typedef struct char_cache_s { 2337dd7cddfSDavid du Colombier /* gx_bits_cache_common provides chunks, cnext, */ 2347dd7cddfSDavid du Colombier /* bsize, csize. */ 2357dd7cddfSDavid du Colombier gx_bits_cache_common; 2367dd7cddfSDavid du Colombier gs_memory_t *struct_memory; 2377dd7cddfSDavid du Colombier gs_memory_t *bits_memory; 2387dd7cddfSDavid du Colombier cached_char **table; /* hash table */ 2397dd7cddfSDavid du Colombier uint table_mask; /* (a power of 2 -1) */ 2407dd7cddfSDavid du Colombier uint bmax; /* max bsize */ 2417dd7cddfSDavid du Colombier uint cmax; /* max csize */ 2427dd7cddfSDavid du Colombier uint bspace; /* space allocated for chunks */ 2437dd7cddfSDavid du Colombier uint lower; /* min size at which cached chars */ 2447dd7cddfSDavid du Colombier /* should be stored compressed */ 2457dd7cddfSDavid du Colombier uint upper; /* max size of a single cached char */ 2467dd7cddfSDavid du Colombier gs_glyph_mark_proc_t mark_glyph; 2477dd7cddfSDavid du Colombier void *mark_glyph_data; /* closure data */ 2487dd7cddfSDavid du Colombier } char_cache; 2497dd7cddfSDavid du Colombier 2507dd7cddfSDavid du Colombier /* ------ Font/character cache ------ */ 2517dd7cddfSDavid du Colombier 2527dd7cddfSDavid du Colombier /* A font "directory" (font/character cache manager). */ 2537dd7cddfSDavid du Colombier #ifndef gs_font_dir_DEFINED 2547dd7cddfSDavid du Colombier # define gs_font_dir_DEFINED 2557dd7cddfSDavid du Colombier typedef struct gs_font_dir_s gs_font_dir; 2567dd7cddfSDavid du Colombier #endif 2577dd7cddfSDavid du Colombier struct gs_font_dir_s { 2587dd7cddfSDavid du Colombier 2597dd7cddfSDavid du Colombier /* Original (unscaled) fonts */ 2607dd7cddfSDavid du Colombier 2617dd7cddfSDavid du Colombier gs_font *orig_fonts; 2627dd7cddfSDavid du Colombier 2637dd7cddfSDavid du Colombier /* Scaled font cache */ 2647dd7cddfSDavid du Colombier 2657dd7cddfSDavid du Colombier gs_font *scaled_fonts; /* list of recently scaled fonts */ 2667dd7cddfSDavid du Colombier uint ssize, smax; 2677dd7cddfSDavid du Colombier 2687dd7cddfSDavid du Colombier /* Font/matrix pair cache */ 2697dd7cddfSDavid du Colombier 2707dd7cddfSDavid du Colombier fm_pair_cache fmcache; 2717dd7cddfSDavid du Colombier 2727dd7cddfSDavid du Colombier /* Character cache */ 2737dd7cddfSDavid du Colombier 2747dd7cddfSDavid du Colombier char_cache ccache; 2757dd7cddfSDavid du Colombier /* Scanning cache for GC */ 2767dd7cddfSDavid du Colombier uint enum_index; /* index (N) */ 2777dd7cddfSDavid du Colombier uint enum_offset; /* ccache.table[offset] is N'th non-zero entry */ 278*593dc095SDavid du Colombier 279*593dc095SDavid du Colombier /* User parameter AlignToPixels. */ 280*593dc095SDavid du Colombier bool align_to_pixels; 281*593dc095SDavid du Colombier 282*593dc095SDavid du Colombier /* A table for converting glyphs to Unicode */ 283*593dc095SDavid du Colombier void *glyph_to_unicode_table; /* closure data */ 284*593dc095SDavid du Colombier 285*593dc095SDavid du Colombier /* An allocator for extension structures */ 286*593dc095SDavid du Colombier gs_memory_t *memory; 287*593dc095SDavid du Colombier ttfInterpreter *tti; 288*593dc095SDavid du Colombier /* User parameter GridFitTT. */ 289*593dc095SDavid du Colombier uint grid_fit_tt; 290*593dc095SDavid du Colombier gx_device_spot_analyzer *san; 291*593dc095SDavid du Colombier int (*global_glyph_code)(const gs_memory_t *mem, gs_const_string *gstr, gs_glyph *pglyph); 2927dd7cddfSDavid du Colombier }; 2937dd7cddfSDavid du Colombier 2947dd7cddfSDavid du Colombier #define private_st_font_dir() /* in gsfont.c */\ 2957dd7cddfSDavid du Colombier gs_private_st_composite(st_font_dir, gs_font_dir, "gs_font_dir",\ 2967dd7cddfSDavid du Colombier font_dir_enum_ptrs, font_dir_reloc_ptrs) 2977dd7cddfSDavid du Colombier 2987dd7cddfSDavid du Colombier /* Enumerate the pointers in a font directory, except for orig_fonts. */ 2997dd7cddfSDavid du Colombier #define font_dir_do_ptrs(m)\ 3007dd7cddfSDavid du Colombier /*m(-,orig_fonts)*/ m(0,scaled_fonts) m(1,fmcache.mdata)\ 301*593dc095SDavid du Colombier m(2,ccache.table) m(3,ccache.mark_glyph_data)\ 302*593dc095SDavid du Colombier m(4,glyph_to_unicode_table) m(5,tti) m(6,san) 303*593dc095SDavid du Colombier #define st_font_dir_max_ptrs 7 3047dd7cddfSDavid du Colombier 3057dd7cddfSDavid du Colombier /* Character cache procedures (in gxccache.c and gxccman.c) */ 306*593dc095SDavid du Colombier int gx_char_cache_alloc(gs_memory_t * struct_mem, gs_memory_t * bits_mem, 3077dd7cddfSDavid du Colombier gs_font_dir * pdir, uint bmax, uint mmax, 308*593dc095SDavid du Colombier uint cmax, uint upper); 309*593dc095SDavid du Colombier void gx_char_cache_init(gs_font_dir *); 310*593dc095SDavid du Colombier void gx_purge_selected_cached_chars(gs_font_dir *, 311*593dc095SDavid du Colombier bool(*)(const gs_memory_t *, cached_char *, void *), void *); 312*593dc095SDavid du Colombier void gx_compute_char_matrix(const gs_matrix *char_tm, const gs_log2_scale_point *log2_scale, 313*593dc095SDavid du Colombier float *mxx, float *mxy, float *myx, float *myy); 314*593dc095SDavid du Colombier void gx_compute_ccache_key(gs_font * pfont, const gs_matrix *char_tm, 315*593dc095SDavid du Colombier const gs_log2_scale_point *log2_scale, bool design_grid, 316*593dc095SDavid du Colombier float *mxx, float *mxy, float *myx, float *myy); 317*593dc095SDavid du Colombier int gx_lookup_fm_pair(gs_font * pfont, const gs_matrix *char_tm, 318*593dc095SDavid du Colombier const gs_log2_scale_point *log2_scale, bool design_grid, cached_fm_pair **ppair); 319*593dc095SDavid du Colombier int gx_add_fm_pair(register gs_font_dir * dir, gs_font * font, const gs_uid * puid, 320*593dc095SDavid du Colombier const gs_matrix * char_tm, const gs_log2_scale_point *log2_scale, 321*593dc095SDavid du Colombier bool design_grid, cached_fm_pair **ppair); 322*593dc095SDavid du Colombier void gx_lookup_xfont(const gs_state *, cached_fm_pair *, int); 323*593dc095SDavid du Colombier void gs_purge_fm_pair(gs_font_dir *, cached_fm_pair *, int); 324*593dc095SDavid du Colombier void gs_purge_font_from_char_caches(gs_font_dir *, const gs_font *); 3257dd7cddfSDavid du Colombier 3267dd7cddfSDavid du Colombier #endif /* gxfcache_INCLUDED */ 327