xref: /plan9-contrib/sys/src/cmd/gs/src/gxfcache.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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