1 /* modified for MDVI -- some names changed to avoid conflicts with T1lib */
3 * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved.
5 * This file may be freely copied and redistributed as long as:
6 * 1) This entire notice continues to be included in the file,
7 * 2) If the file has been modified in any way, a notice of such
8 * modification is conspicuously indicated.
10 * PostScript, Display PostScript, and Adobe are registered trademarks of
11 * Adobe Systems Incorporated.
13 * ************************************************************************
14 * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
15 * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
16 * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
17 * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
18 * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
19 * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
21 * ************************************************************************
26 * This header file is used in conjuction with the parseAFM.c file.
27 * Together these files provide the functionality to parse Adobe Font
28 * Metrics files and store the information in predefined data structures.
29 * It is intended to work with an application program that needs font metric
30 * information. The program can be used as is by making a procedure call to
31 * parse an AFM file and have the data stored, or an application developer
32 * may wish to customize the code.
34 * This header file defines the data structures used as well as the key
35 * strings that are currently recognized by this version of the AFM parser.
36 * This program is based on the document "Adobe Font Metrics Files,
37 * Specification Version 2.0".
39 * AFM files are separated into distinct sections of different data. Because
40 * of this, the parseAFM program can parse a specified file to only save
41 * certain sections of information based on the application's needs. A record
42 * containing the requested information will be returned to the application.
44 * AFM files are divided into five sections of data:
45 * 1) The Global Font Information
46 * 2) The Character Metrics Information
47 * 3) The Track Kerning Data
48 * 4) The Pair-Wise Kerning Data
49 * 5) The Composite Character Data
51 * Basically, the application can request any of these sections independent
52 * of what other sections are requested. In addition, in recognizing that
53 * many applications will want ONLY the x-width of characters and not all
54 * of the other character metrics information, there is a way to receive
55 * only the width information so as not to pay the storage cost for the
56 * unwanted data. An application should never request both the
57 * "quick and dirty" char metrics (widths only) and the Character Metrics
58 * Information since the Character Metrics Information will contain all
59 * of the character widths as well.
61 * There is a procedure in parseAFM.c, called parseFile, that can be
62 * called from any application wishing to get information from the AFM File.
63 * This procedure expects 3 parameters: a vaild file descriptor, a pointer
64 * to a (FontInfo *) variable (for which space will be allocated and then
65 * will be filled in with the data requested), and a mask specifying
66 * which data from the AFM File should be saved in the FontInfo structure.
68 * The flags that can be used to set the appropriate mask are defined below.
69 * In addition, several commonly used masks have already been defined.
72 * original: DSM Thu Oct 20 17:39:59 PDT 1988
73 * modified: DSM Mon Jul 3 14:17:50 PDT 1989
74 * - added 'storageProblem' return code
77 #ifndef _MDVI_PARSEAFM_H
78 #define _MDVI_PARSEAFM_H 1
84 /* your basic constants */
87 #define EOL '\n' /* end-of-line indicator */
88 #define MAX_NAME 4096 /* max length for identifiers */
92 /* Flags that can be AND'ed together to specify exactly what
93 * information from the AFM file should be saved. */
94 #define P_G 0x01 /* 0000 0001 */ /* Global Font Info */
95 #define P_W 0x02 /* 0000 0010 */ /* Character Widths ONLY */
96 #define P_M 0x06 /* 0000 0110 */ /* All Char Metric Info */
97 #define P_P 0x08 /* 0000 1000 */ /* Pair Kerning Info */
98 #define P_T 0x10 /* 0001 0000 */ /* Track Kerning Info */
99 #define P_C 0x20 /* 0010 0000 */ /* Composite Char Info */
101 /* Commonly used flags */
102 #define P_GW (P_G | P_W)
103 #define P_GM (P_G | P_M)
104 #define P_GMP (P_G | P_M | P_P)
105 #define P_GMK (P_G | P_M | P_P | P_T)
106 #define P_ALL (P_G | P_M | P_P | P_T | P_C)
108 /* Possible return codes from the parseFile procedure.
110 * ok means there were no problems parsing the file.
112 * parseError means that there was some kind of parsing error, but the
113 * parser went on. This could include problems like the count for any given
114 * section does not add up to how many entries there actually were, or
115 * there was a key that was not recognized. The return record may contain
116 * vaild data or it may not.
118 * earlyEOF means that an End of File was encountered before expected. This
119 * may mean that the AFM file had been truncated, or improperly formed.
121 * storageProblem means that there were problems allocating storage for
122 * the data structures that would have contained the AFM data.
125 #define parseError -1
127 #define storageProblem -3
129 /************************* TYPES *********************************/
130 /* Below are all of the data structure definitions. These structures
131 * try to map as closely as possible to grouping and naming of data
135 /* Bounding box definition. Used for the Font BBox as well as the
140 int llx; /* lower left x-position */
141 int lly; /* lower left y-position */
142 int urx; /* upper right x-position */
143 int ury; /* upper right y-position */
146 /* Global Font information.
147 * The key that each field is associated with is in comments. For an
148 * explanation about each key and its value please refer to the AFM
149 * documentation (full title & version given above).
153 char *afmVersion; /* key: StartFontMetrics */
154 char *fontName; /* key: FontName */
155 char *fullName; /* key: FullName */
156 char *familyName; /* key: FamilyName */
157 char *weight; /* key: Weight */
158 float italicAngle; /* key: ItalicAngle */
159 BOOL isFixedPitch; /* key: IsFixedPitch */
160 BBox fontBBox; /* key: FontBBox */
161 int underlinePosition; /* key: UnderlinePosition */
162 int underlineThickness; /* key: UnderlineThickness */
163 char *version; /* key: Version */
164 char *notice; /* key: Notice */
165 char *encodingScheme; /* key: EncodingScheme */
166 int capHeight; /* key: CapHeight */
167 int xHeight; /* key: XHeight */
168 int ascender; /* key: Ascender */
169 int descender; /* key: Descender */
172 /* Ligature definition is a linked list since any character can have
173 * any number of ligatures.
175 typedef struct _t_ligature
178 struct _t_ligature *next;
181 /* Character Metric Information. This structure is used only if ALL
182 * character metric information is requested. If only the character
183 * widths is requested, then only an array of the character x-widths
186 * The key that each field is associated with is in comments. For an
187 * explanation about each key and its value please refer to the
188 * Character Metrics section of the AFM documentation (full title
189 * & version given above).
193 int code, /* key: C */
195 wy; /* together wx and wy are associated with key: W */
196 char *name; /* key: N */
197 BBox charBBox; /* key: B */
198 Ligature *ligs; /* key: L (linked list; not a fixed number of Ls */
201 /* Track kerning data structure.
202 * The fields of this record are the five values associated with every
205 * For an explanation about each value please refer to the
206 * Track Kerning section of the AFM documentation (full title
207 * & version given above).
218 /* Pair Kerning data structure.
219 * The fields of this record are the four values associated with every
220 * KP entry. For KPX entries, the yamt will be zero.
222 * For an explanation about each value please refer to the
223 * Pair Kerning section of the AFM documentation (full title
224 * & version given above).
234 /* PCC is a piece of a composite character. This is a sub structure of a
235 * compCharData described below.
236 * These fields will be filled in with the values from the key PCC.
238 * For an explanation about each key and its value please refer to the
239 * Composite Character section of the AFM documentation (full title
240 * & version given above).
249 /* Composite Character Information data structure.
250 * The fields ccName and numOfPieces are filled with the values associated
251 * with the key CC. The field pieces points to an array (size = numOfPieces)
252 * of information about each of the parts of the composite character. That
253 * array is filled in with the values from the key PCC.
255 * For an explanation about each key and its value please refer to the
256 * Composite Character section of the AFM documentation (full title
257 * & version given above).
267 * Record type containing pointers to all of the other data
268 * structures containing information about a font.
269 * A a record of this type is filled with data by the
270 * parseFile function.
274 GlobalFontInfo *gfi; /* ptr to a GlobalFontInfo record */
275 int *cwi; /* ptr to 256 element array of just char widths */
276 int numOfChars; /* number of entries in char metrics array */
277 CharMetricInfo *cmi; /* ptr to char metrics array */
278 int numOfTracks; /* number to entries in track kerning array */
279 TrackKernData *tkd; /* ptr to track kerning array */
280 int numOfPairs; /* number to entries in pair kerning array */
281 PairKernData *pkd; /* ptr to pair kerning array */
282 int numOfComps; /* number to entries in comp char array */
283 CompCharData *ccd; /* ptr to comp char array */
286 /************************* PROCEDURES ****************************/
288 /* Call this procedure to do the grunt work of parsing an AFM file.
290 * "fp" should be a valid file pointer to an AFM file.
292 * "fi" is a pointer to a pointer to a FontInfo record sturcture
293 * (defined above). Storage for the FontInfo structure will be
294 * allocated in parseFile and the structure will be filled in
295 * with the requested data from the AFM File.
297 * "flags" is a mask with bits set representing what data should
298 * be saved. Defined above are valid flags that can be used to set
299 * the mask, as well as a few commonly used masks.
301 * The possible return codes from parseFile are defined above.
304 extern int afm_parse_file __PROTO((FILE *, FontInfo **, FLAGS));
305 extern void afm_free_fontinfo __PROTO((FontInfo *));
307 #endif /* _MDVI_PARSEAFM_H */