xref: /plan9/sys/src/cmd/gs/src/gxfont1.h (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
1 /* Copyright (C) 1994, 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: gxfont1.h,v 1.13 2004/09/22 13:52:33 igor Exp $ */
18 /* Type 1 / Type 2 font data definition */
19 
20 #ifndef gxfont1_INCLUDED
21 #  define gxfont1_INCLUDED
22 
23 #include "gstype1.h"		/* for charstring_interpret_proc */
24 #include "gxfixed.h"
25 
26 /*
27  * This is the type-specific information for Adobe Type 1 fonts.
28  * It also includes the information for Type 2 fonts, because
29  * there isn't very much of it and it's less trouble to include here.
30  */
31 
32 #ifndef gs_font_type1_DEFINED
33 #  define gs_font_type1_DEFINED
34 typedef struct gs_font_type1_s gs_font_type1;
35 #endif
36 
37 /*
38  * The zone_table values should be ints, according to the Adobe
39  * specification, but some fonts have arbitrary floats here.
40  */
41 #define zone_table(size)\
42 	struct {\
43 		int count;\
44 		float values[(size)*2];\
45 	}
46 #define float_array(size)\
47 	struct {\
48 		int count;\
49 		float values[size];\
50 	}
51 #define stem_table(size)\
52 	float_array(size)
53 
54 #ifndef gs_type1_data_DEFINED
55 #define gs_type1_data_DEFINED
56 typedef struct gs_type1_data_s gs_type1_data;
57 #endif
58 
59 typedef struct gs_type1_data_procs_s {
60 
61     /* Get the data for any glyph.  Return >= 0 or < 0 as usual. */
62 
63     int (*glyph_data)(gs_font_type1 * pfont, gs_glyph glyph,
64 		      gs_glyph_data_t *pgd);
65 
66     /* Get the data for a Subr.  Return like glyph_data. */
67 
68     int (*subr_data)(gs_font_type1 * pfont, int subr_num, bool global,
69 		     gs_glyph_data_t *pgd);
70 
71     /*
72      * Get the data for a seac character, including the glyph and/or the
73      * outline data.  Any of the pointers for the return values may be 0,
74      * indicating that the corresponding value is not needed.
75      * Return like glyph_data.
76      */
77 
78     int (*seac_data)(gs_font_type1 * pfont, int ccode,
79 		     gs_glyph * pglyph, gs_const_string *gstr, gs_glyph_data_t *pgd);
80 
81     /*
82      * Push (a) value(s) onto the client ('PostScript') stack during
83      * interpretation.  Note that this procedure and the next one take a
84      * closure pointer, not the font pointer, as the first argument.
85      */
86 
87     int (*push_values)(void *callback_data, const fixed *values,
88 		       int count);
89 
90     /* Pop a value from the client stack. */
91 
92     int (*pop_value)(void *callback_data, fixed *value);
93 
94 } gs_type1_data_procs_t;
95 
96 /*
97  * The garbage collector really doesn't want the client data pointer
98  * from a gs_type1_state to point to the gs_type1_data in the middle of
99  * a gs_font_type1, so we make the client data pointer (which is passed
100  * to the callback procedures) point to the gs_font_type1 itself.
101  */
102 struct gs_type1_data_s {
103     /*int PaintType; *//* in gs_font_common */
104     gs_type1_data_procs_t procs;
105     charstring_interpret_proc((*interpret));
106     void *proc_data;		/* data for procs */
107     gs_font_base *parent;	/* the type 9 font, if this font is is a type 9 descendent. */
108     int lenIV;			/* -1 means no encryption */
109 				/* (undocumented feature!) */
110     uint subroutineNumberBias;	/* added to operand of callsubr */
111 				/* (undocumented feature!) */
112 	/* Type 2 additions */
113     uint gsubrNumberBias;	/* added to operand of callgsubr */
114     long initialRandomSeed;
115     fixed defaultWidthX;
116     fixed nominalWidthX;
117 	/* End of Type 2 additions */
118     /* For a description of the following hint information, */
119     /* see chapter 5 of the "Adobe Type 1 Font Format" book. */
120     int BlueFuzz;
121     float BlueScale;
122     float BlueShift;
123 #define max_BlueValues 7
124           zone_table(max_BlueValues) BlueValues;
125     float ExpansionFactor;
126     bool ForceBold;
127 #define max_FamilyBlues 7
128     zone_table(max_FamilyBlues) FamilyBlues;
129 #define max_FamilyOtherBlues 5
130     zone_table(max_FamilyOtherBlues) FamilyOtherBlues;
131     int LanguageGroup;
132 #define max_OtherBlues 5
133     zone_table(max_OtherBlues) OtherBlues;
134     bool RndStemUp;
135     stem_table(1) StdHW;
136     stem_table(1) StdVW;
137 #define max_StemSnap 12
138     stem_table(max_StemSnap) StemSnapH;
139     stem_table(max_StemSnap) StemSnapV;
140     /* Additional information for Multiple Master fonts */
141 #define max_WeightVector 16
142     float_array(max_WeightVector) WeightVector;
143 };
144 
145 #define gs_type1_data_s_DEFINED
146 
147 struct gs_font_type1_s {
148     gs_font_base_common;
149     gs_type1_data data;
150 };
151 
152 extern_st(st_gs_font_type1);
153 #define public_st_gs_font_type1()	/* in gstype1.c */\
154   gs_public_st_suffix_add2_final(st_gs_font_type1, gs_font_type1,\
155     "gs_font_type1", font_type1_enum_ptrs, font_type1_reloc_ptrs,\
156     gs_font_finalize, st_gs_font_base, data.parent, data.proc_data)
157 
158 /* Export font procedures so they can be called from the interpreter. */
159 font_proc_glyph_info(gs_type1_glyph_info);
160 
161 /*
162  * If a Type 1 character is defined with 'seac', store the character codes
163  * in chars[0] and chars[1] and return 1; otherwise, return 0 or <0.
164  * This is exported only for the benefit of font copying.
165  */
166 int gs_type1_piece_codes(/*const*/ gs_font_type1 *pfont,
167 			 const gs_glyph_data_t *pgd, gs_char *chars);
168 
169 #endif /* gxfont1_INCLUDED */
170