xref: /plan9/sys/src/cmd/gs/src/gdevpsf.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 2000, 2001 Aladdin Enterprises.  All rights reserved.
2 
3   This software is provided AS-IS with no warranty, either express or
4   implied.
5 
6   This software is distributed under license and may not be copied,
7   modified or distributed except as expressly authorized under the terms
8   of the license contained in the file LICENSE in this distribution.
9 
10   For more information about licensing, please refer to
11   http://www.ghostscript.com/licensing/. For information on
12   commercial licensing, go to http://www.artifex.com/licensing/ or
13   contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14   San Rafael, CA  94903, U.S.A., +1(415)492-9861.
15 */
16 
17 /* $Id: gdevpsf.h,v 1.27 2004/08/19 19:33:09 stefan Exp $ */
18 /* PostScript/PDF font writing interface */
19 
20 #ifndef gdevpsf_INCLUDED
21 #  define gdevpsf_INCLUDED
22 
23 #include "gsccode.h"
24 #include "gsgdata.h"
25 
26 /* ---------------- Embedded font writing ---------------- */
27 
28 #ifndef gs_font_DEFINED
29 #  define gs_font_DEFINED
30 typedef struct gs_font_s gs_font;
31 #endif
32 #ifndef gs_font_base_DEFINED
33 #  define gs_font_base_DEFINED
34 typedef struct gs_font_base_s gs_font_base;
35 #endif
36 #ifndef stream_DEFINED
37 #  define stream_DEFINED
38 typedef struct stream_s stream;
39 #endif
40 
41 /*
42  * Define the structure used for enumerating the glyphs in a font or a
43  * font subset.  This type is opaque to clients: we declare it here only
44  * so that clients can allocate it on the stack.
45  */
46 typedef struct psf_glyph_enum_s psf_glyph_enum_t;
47 struct psf_glyph_enum_s {
48     gs_font *font;
49     struct su_ {
50 	union sus_ {
51 	    const gs_glyph *list;	/* if subset given by a list */
52 	    const byte *bits;	/* if CID or TT subset given by a bitmap */
53 	} selected;
54 	uint size;
55     } subset;
56     gs_glyph_space_t glyph_space;
57     ulong index;
58     int (*enumerate_next)(psf_glyph_enum_t *, gs_glyph *);
59 };
60 
61 /*
62  * Begin enumerating the glyphs in a font or a font subset.  If subset_size
63  * > 0 but subset_glyphs == 0, enumerate all glyphs in [0 .. subset_size-1]
64  * (as integer glyphs, i.e., offset by gs_min_cid_glyph).
65  */
66 void psf_enumerate_list_begin(psf_glyph_enum_t *ppge, gs_font *font,
67 			      const gs_glyph *subset_list,
68 			      uint subset_size,
69 			      gs_glyph_space_t glyph_space);
70 /* Backward compatibility */
71 #define psf_enumerate_glyphs_begin psf_enumerate_list_begin
72 
73 /* Begin enumerating CID or TT glyphs in a subset given by a bit vector. */
74 /* Note that subset_size is given in bits, not in bytes. */
75 void psf_enumerate_bits_begin(psf_glyph_enum_t *ppge, gs_font *font,
76 			      const byte *subset_bits, uint subset_size,
77 			      gs_glyph_space_t glyph_space);
78 /* Backward compatibility */
79 #define psf_enumerate_cids_begin(ppge, font, bits, size)\
80    psf_enumerate_bits_begin(ppge, font, bits, size, GLYPH_SPACE_NAME)
81 
82 /*
83  * Reset a glyph enumeration.
84  */
85 void psf_enumerate_glyphs_reset(psf_glyph_enum_t *ppge);
86 
87 /*
88  * Enumerate the next glyph in a font or a font subset.
89  * Return 0 if more glyphs, 1 if done, <0 if error.
90  */
91 int psf_enumerate_glyphs_next(psf_glyph_enum_t *ppge, gs_glyph *pglyph);
92 
93 /*
94  * Add composite glyph pieces to a list of glyphs.  Does not sort or
95  * remove duplicates.  max_pieces is the maximum number of pieces that a
96  * single glyph can have: if this value is not known, the caller should
97  * use max_count.
98  */
99 int psf_add_subset_pieces(gs_glyph *glyphs, uint *pcount, uint max_count,
100 			  uint max_pieces, gs_font *font);
101 
102 /*
103  * Sort a list of glyphs and remove duplicates.  Return the number of glyphs
104  * in the result.
105  */
106 int psf_sort_glyphs(gs_glyph *glyphs, int count);
107 
108 /*
109  * Return the index of a given glyph in a sorted list of glyphs, or -1
110  * if the glyph is not present.
111  */
112 int psf_sorted_glyphs_index_of(const gs_glyph *glyphs, int count,
113 			       gs_glyph glyph);
114 /*
115  * Determine whether a sorted list of glyphs includes a given glyph.
116  */
117 bool psf_sorted_glyphs_include(const gs_glyph *glyphs, int count,
118 			       gs_glyph glyph);
119 
120 /*
121  * Define the internal structure that holds glyph information for an
122  * outline-based font to be written.  Currently this only applies to
123  * Type 1, Type 2, and CIDFontType 0 fonts, but someday it might also
124  * be usable with TrueType (Type 42) and CIDFontType 2 fonts.
125  */
126 #define MAX_CFF_MISC_STRINGS 40
127 #define MAX_CFF_STD_STRINGS 500 /* 391 entries used */
128 typedef struct psf_outline_glyphs_s {
129     gs_glyph notdef;
130     /* gs_glyph subset_data[256 * 3 + 1]; *3 for seac, +1 for .notdef */
131     gs_glyph *subset_data;
132     gs_glyph *subset_glyphs;	/* 0 or subset_data */
133     uint subset_size;
134 } psf_outline_glyphs_t;
135 
136 #ifndef gs_font_type1_DEFINED
137 #  define gs_font_type1_DEFINED
138 typedef struct gs_font_type1_s gs_font_type1;
139 #endif
140 
141 /* Define the type for the glyph data callback procedure. */
142 typedef int (*glyph_data_proc_t)(gs_font_base *, gs_glyph,
143 				 gs_glyph_data_t *, gs_font_type1 **);
144 
145 /* Check that all selected glyphs can be written. */
146 int psf_check_outline_glyphs(gs_font_base *pfont,
147 			     psf_glyph_enum_t *ppge,
148 			     glyph_data_proc_t glyph_data);
149 
150 /*
151  * Gather glyph information for a Type 1, Type 2, or CIDFontType 0 font.
152  * Note that the glyph_data procedure returns both the outline string and
153  * a gs_font_type1 (Type 1 or Type 2) font: for Type 1 or Type 2 fonts,
154  * this is the original font, but for CIDFontType 0 fonts, it is the
155  * FDArray element.  If subset_glyphs != 0, this procedure removes
156  * undefined glyphs from the list it builds.
157  */
158 int psf_get_outline_glyphs(psf_outline_glyphs_t *pglyphs,
159 			   gs_font_base *pfont, gs_glyph *subset_glyphs,
160 			   uint subset_size, glyph_data_proc_t glyph_data);
161 
162 /* ------ Exported by gdevpsf1.c ------ */
163 
164 /* Gather glyph information for a Type 1 or Type 2 font. */
165 int psf_type1_glyph_data(gs_font_base *, gs_glyph, gs_glyph_data_t *,
166 			 gs_font_type1 **);
167 int psf_get_type1_glyphs(psf_outline_glyphs_t *pglyphs,
168 			 gs_font_type1 *pfont,
169 			 gs_glyph *subset_glyphs, uint subset_size);
170 
171 /*
172  * Write a Type 1 font definition.  This procedure does not allocate
173  * or free any data.
174  */
175 #define WRITE_TYPE1_EEXEC 1
176 #define WRITE_TYPE1_ASCIIHEX 2  /* use ASCII hex rather than binary */
177 #define WRITE_TYPE1_EEXEC_PAD 4  /* add 512 0s */
178 #define WRITE_TYPE1_EEXEC_MARK 8  /* assume 512 0s will be added */
179 #define WRITE_TYPE1_POSTSCRIPT 16  /* don't observe ATM restrictions */
180 #define WRITE_TYPE1_WITH_LENIV 32  /* don't allow lenIV = -1 */
181 int psf_write_type1_font(stream *s, gs_font_type1 *pfont, int options,
182 			 gs_glyph *subset_glyphs, uint subset_size,
183 			 const gs_const_string *alt_font_name,
184 			 int lengths[3]);
185 
186 /* ------ Exported by gdevpsf2.c ------ */
187 
188 /*
189  * Write a Type 1 or Type 2 font definition as CFF.
190  * This procedure does not allocate or free any data.
191  */
192 #define WRITE_TYPE2_NO_LENIV 1	/* always use lenIV = -1 */
193 #define WRITE_TYPE2_CHARSTRINGS 2 /* convert T1 charstrings to T2 */
194 #define WRITE_TYPE2_AR3 4	/* work around bugs in Acrobat Reader 3 */
195 #define WRITE_TYPE2_NO_GSUBRS 8	/* omit GlobalSubrs */
196 int psf_write_type2_font(stream *s, gs_font_type1 *pfont, int options,
197 			 gs_glyph *subset_glyphs, uint subset_size,
198 			 const gs_const_string *alt_font_name,
199 			 gs_int_rect *FontBBox);
200 
201 #ifndef gs_font_cid0_DEFINED
202 #  define gs_font_cid0_DEFINED
203 typedef struct gs_font_cid0_s gs_font_cid0;
204 #endif
205 
206 /*
207  * Write a CIDFontType 0 font definition as CFF.  The options are
208  * the same as for psf_write_type2_font.  subset_cids is a bit vector of
209  * subset_size bits (not bytes).
210  * This procedure does not allocate or free any data.
211  */
212 int psf_write_cid0_font(stream *s, gs_font_cid0 *pfont, int options,
213 			const byte *subset_cids, uint subset_size,
214 			const gs_const_string *alt_font_name);
215 
216 /* ------ Exported by gdevpsfm.c ------ */
217 
218 /*
219  * Write a CMap in its customary (source) form.
220  * This procedure does not allocate or free any data.
221  */
222 #ifndef gs_cmap_DEFINED
223 #  define gs_cmap_DEFINED
224 typedef struct gs_cmap_s gs_cmap_t;
225 #endif
226 typedef int (*psf_put_name_chars_proc_t)(stream *, const byte *, uint);
227 int psf_write_cmap(const gs_memory_t *mem, stream *s, const gs_cmap_t *pcmap,
228 		   psf_put_name_chars_proc_t put_name_chars,
229 		   const gs_const_string *alt_cmap_name, int font_index_only);
230 /* ------ Exported by gdevpsft.c ------ */
231 
232 /*
233  * Write a TrueType (Type 42) font definition.
234  * This procedure does not allocate or free any data.
235  */
236 #ifndef gs_font_type42_DEFINED
237 #  define gs_font_type42_DEFINED
238 typedef struct gs_font_type42_s gs_font_type42;
239 #endif
240 #define WRITE_TRUETYPE_CMAP 1	/* generate cmap from the Encoding */
241 #define WRITE_TRUETYPE_NAME 2	/* generate name if missing */
242 #define WRITE_TRUETYPE_POST 4	/* generate post if missing */
243 #define WRITE_TRUETYPE_NO_TRIMMED_TABLE 8  /* not OK to use cmap format 6 */
244 #define WRITE_TRUETYPE_HVMTX 16	/* generate [hv]mtx from glyph_info */
245 int psf_write_truetype_font(stream *s, gs_font_type42 *pfont, int options,
246 			    gs_glyph *subset_glyphs, uint subset_size,
247 			    const gs_const_string *alt_font_name);
248 
249 /*
250  * Write a "stripped" TrueType font definition.  All tables are written
251  * verbatim, except for deleting the bogus Adobe marker "tables" gdir, glyx,
252  * and locx, and also deleting glyf and loca.
253  * This procedure does not allocate or free any data.
254  *
255  * The purpose of "stripped" fonts is simply to store all of the non-glyph
256  * information from a TrueType-family font in a structure that can be easily
257  * stored, accessed, and eventually combined with the glyph information.
258  * The only intended client for this function is the font copying code in
259  * gxfcopy.c, q.v.  In particular, "stripped" fonts are not fully valid
260  * fonts because they lack glyph 0 (the .notdef glyph).
261  */
262 int psf_write_truetype_stripped(stream *s, gs_font_type42 *pfont);
263 
264 #ifndef gs_font_cid2_DEFINED
265 #  define gs_font_cid2_DEFINED
266 typedef struct gs_font_cid2_s gs_font_cid2;
267 #endif
268 
269 /*
270  * Write a CIDFontType 2 font definition.  This differs from
271  * psf_write_truetype_font in that the subset, if any, is specified
272  * as a bit vector (as for psf_write_cid0_font) rather than a list of glyphs.
273  * Also, none of the options currently have any effect.  The only tables
274  * written are:
275  *	- The "required" tables: head, hhea, loca, maxp, cvt_, prep, glyf,
276  *	  hmtx, fpgm.
277  *	- If present in the font: post, gasp, kern, vhea, vmtx.
278  * Note that in particular, the cmap, name, and OS/2 tables are omitted.
279  * NOTE: it is the client's responsibility to ensure that if the subset
280  * contains any composite glyphs, the components of the composites are
281  * included explicitly in the subset.
282  * This procedure does not allocate or free any data.
283  */
284 int psf_write_cid2_font(stream *s, gs_font_cid2 *pfont, int options,
285 			const byte *subset_glyphs, uint subset_size,
286 			const gs_const_string *alt_font_name);
287 
288 /*
289  * Write a "stripped" CIDFontType 2 font definition.  This is the same
290  * as an ordinary CIDFontType 2 definition, minus glyf and loca.
291  */
292 int psf_write_cid2_stripped(stream *s, gs_font_cid2 *pfont);
293 
294 /* ------ Exported by gdevpsfx.c ------ */
295 
296 /*
297  * Convert a Type 1 CharString to (unencrypted) Type 2.
298  * This procedure does not allocate or free any data.
299  * NOTE: this procedure expands all Subrs in-line.
300  */
301 int psf_convert_type1_to_type2(stream *s, const gs_glyph_data_t *pgd,
302 			       gs_font_type1 *pfont);
303 
304 #endif /* gdevpsf_INCLUDED */
305