xref: /plan9/sys/src/cmd/gs/src/gxfcopy.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 2002 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: gxfcopy.h,v 1.11 2004/10/15 18:18:32 igor Exp $ */
18 /* Font copying for high-level output */
19 
20 #ifndef gxfcopy_INCLUDED
21 #  define gxfcopy_INCLUDED
22 
23 #include "gsccode.h"
24 
25 #ifndef gs_font_DEFINED
26 #  define gs_font_DEFINED
27 typedef struct gs_font_s gs_font;
28 #endif
29 
30 #ifndef gs_matrix_DEFINED
31 #  define gs_matrix_DEFINED
32 typedef struct gs_matrix_s gs_matrix;
33 #endif
34 
35 /*
36  * Copy a font, aside from its glyphs.  Note that PostScript-specific data
37  * -- that is, data that do not appear in the C structure that is the
38  * relevant subclass of gs_font -- are NOT copied.  In particular,
39  * Metrics[2], CDevProc, and FontInfo are not copied, except for the
40  * information returned by font->procs.font_info (see the definition of
41  * gs_font_info_t in gxfont.h).
42  *
43  * Note that in some cases the font must have a definition for the "not
44  * defined" glyph, as noted below, or a rangecheck error occurs.
45  *
46  * The following FontTypes are supported:
47  *
48  *	Type 1, Type 2 - Encoding and CharStrings are not copied.  Subrs and
49  *	GlobalSubrs (for CFFs) are copied; OtherSubrs are not copied.  The
50  *	font must have a glyph named .notdef; its definition is copied.
51  *
52  *	Type 42 (TrueType) - Encoding and CharStrings are not copied.  The
53  *	TrueType glyf and loca tables are not copied, nor are the bogus
54  *	Adobe gdir, glyx, and locx "tables".  If the font has a definition
55  *	for a glyph named .notdef (in the CharStrings dictionary), the
56  *	definition is copied.
57  *
58  *	CIDFontType 0 (Type 1/2-based CIDFonts) - the glyph data are not
59  *	copied.  The Type 1/2 subfonts *are* copied, as are the Subrs (both
60  *	local and global).
61  *
62  *	CIDFontType 2 (TrueType-based CIDFonts) - the glyph data and CIDMap
63  *	are not copied.
64  *
65  * The resulting font supports querying (font_info, glyph_info, etc.) and
66  * rendering (glyph_outline, etc.), but it does not support make_font.
67  */
68 int gs_copy_font(gs_font *font, const gs_matrix *orig_matrix,
69 		    gs_memory_t *mem, gs_font **pfont_new);
70 
71 /*
72  * Copy a glyph, including any sub-glyphs.  The destination font ("copied"
73  * argument) must be a font created by gs_copy_font.  The source font
74  * ("font" argument) must have the same FontType as the destination, and in
75  * addition must be "compatible" with it as described under the individual
76  * FontTypes just below; however, gs_copy_glyph does not check
77  * compatibility.
78  *
79  * If any glyph has already been copied but does not have the same
80  * definition as the one being copied now, gs_copy_glyph returns an
81  * invalidaccess error.  If the top-level glyph has already been copied
82  * (with the same definition), gs_copy_glyph returns 1.  Otherwise,
83  * gs_copy_glyph returns 0.
84  *
85  *	Type 1, Type 2 - the destination and source must have the same
86  *	Subrs.  glyph must be a name (not an integer).  Copies the
87  *	CharString entry.  Note that the Type 1/2 'seac' operator requires
88  *	copying not only the sub-glyphs but their Encoding entries as well.
89  *
90  *	Type 42 - the destination and source must have compatible tables
91  *	other than glyf and loca.  In practice this means that the source
92  *	must be the same font that was passed to gs_copy_font.  If glyph is
93  *	an integer, it is interpreted as a GID; if glyph is a name, both
94  *	the CharString entry and the glyph data are copied.
95  *
96  *	CIDFontType 0 - the destination and source must have the same Subrs,
97  *	and the Type 1/2 subfont(s) referenced by the glyph(s) being copied
98  *	must be compatible.  glyph must be a CID.  Copies the CharString.
99  *
100  *	CIDFontType 2 - compatibility is as for Type 42.  glyph must be a
101  *	CID (integer), not a GID.  Copies the glyph data and the CIDMap
102  *	entry.
103  *
104  * Metrics[2] and CDevProc in the source font are ignored.  Currently,
105  * for CIDFontType 2 fonts with MetricsCount != 0, the metrics attached to
106  * the individual glyph outlines are also ignored (not copied).
107  */
108 int gs_copy_glyph(gs_font *font, gs_glyph glyph, gs_font *copied);
109 
110 /*
111  * Copy a glyph with additional checking options.  If options includes
112  * COPY_GLYPH_NO_OLD, then if the top-level glyph has already been copied,
113  * return an invalidaccess error rather than 1.  If options includes
114  * COPY_GLYPH_NO_NEW, then if the top-level glyph has *not* already been
115  * copied, return an undefined error rather than 0.
116  */
117 #define COPY_GLYPH_NO_OLD 1
118 #define COPY_GLYPH_NO_NEW 2
119 #define COPY_GLYPH_BY_INDEX 4
120 int gs_copy_glyph_options(gs_font *font, gs_glyph glyph, gs_font *copied,
121 			  int options);
122 
123 /*
124  * Add an encoding entry to a copied font.  If the given encoding entry is
125  * not empty and is not the same as the new value, gs_copied_font_encode
126  * returns an invalidaccess error.
127  *
128  * The action depends on FontType as follows:
129  *
130  *	Type 1, Type 2 - glyph must be a name, not a CID (integer).  Makes
131  *	an entry in the font's Encoding.  A glyph by that name must exist
132  *	in the copied font.
133  *
134  *	Type 42 - same as Type 1.
135  *
136  *	CIDFontType 0 - gives an error.
137  *
138  *	CIDFontType 2 - gives an error.
139  */
140 int gs_copied_font_add_encoding(gs_font *copied, gs_char chr, gs_glyph glyph);
141 
142 /*
143  * Copy all the glyphs and, if relevant, Encoding entries from a font.  This
144  * is equivalent to copying the glyphs and Encoding entries individually,
145  * and returns errors under the same conditions.
146  */
147 int gs_copy_font_complete(gs_font *font, gs_font *copied);
148 
149 
150 /*
151  * Check whether specified glyphs can be copied from another font.
152  * It means that (1) fonts have same hinting parameters and
153  * (2) font subsets for the specified glyph set don't include different
154  * outlines or metrics. Possible returned values :
155  * 0 (incompatible), 1 (compatible), < 0 (error)
156  */
157 int gs_copied_can_copy_glyphs(const gs_font *cfont, const gs_font *ofont,
158 		    gs_glyph *glyphs, int num_glyphs, int glyphs_step,
159 		    bool check_hinting);
160 
161 /* Extension glyphs may be added to a font to resolve
162    glyph name conflicts while conwerting a PDF Widths into Metrics.
163    This function drops them before writing out an embedded font. */
164 int copied_drop_extension_glyphs(gs_font *cfont);
165 
166 
167 #endif /* gxfcopy_INCLUDED */
168