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