release commit
[lilypond.git] / flower / include / parse-afm.hh
blob51b43b3e1f66124da5b9d2249b19c048a60c044b
1 /* Modified 1999 Morten Welinder:
2 * 1. ANSI prototype.
3 * 2. parseFileFree function.
4 */
5 // 2000 HWN: AFM_ prefixes.
6 /*
7 * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved.
9 * This file may be freely copied and redistributed as long as:
10 * 1) This entire notice continues to be included in the file,
11 * 2) If the file has been modified in any way, a notice of such
12 * modification is conspicuously indicated.
14 * PostScript, Display PostScript, and Adobe are registered trademarks of
15 * Adobe Systems Incorporated.
17 * ************************************************************************
18 * THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO CHANGE WITHOUT
19 * NOTICE, AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY ADOBE SYSTEMS
20 * INCORPORATED. ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY OR
21 * LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO WARRANTY OF ANY
22 * KIND (EXPRESS, IMPLIED OR STATUTORY) WITH RESPECT TO THIS INFORMATION,
23 * AND EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
25 * ************************************************************************
28 /* ParseAFM.h
30 * This header file is used in conjuction with the parseAFM.c file.
31 * Together these files provide the functionality to parse Adobe Font
32 * Metrics files and store the information in predefined data structures.
33 * It is intended to work with an application program that needs font metric
34 * information. The program can be used as is by making a procedure call to
35 * parse an AFM file and have the data stored, or an application developer
36 * may wish to customize the code.
38 * This header file defines the data structures used as well as the key
39 * strings that are currently recognized by this version of the AFM parser.
40 * This program is based on the document "Adobe Font Metrics Files,
41 * Specification Version 2.0".
43 * AFM files are separated into distinct sections of different data. Because
44 * of this, the parseAFM program can parse a specified file to only save
45 * certain sections of information based on the application's needs. A record
46 * containing the requested information will be returned to the application.
48 * AFM files are divided into five sections of data:
49 * 1) The Global Font Information
50 * 2) The Character Metrics Information
51 * 3) The Track Kerning Data
52 * 4) The Pair-Wise Kerning Data
53 * 5) The Composite Character Data
55 * Basically, the application can request any of these sections independent
56 * of what other sections are requested. In addition, in recognizing that
57 * many applications will want ONLY the x-width of characters and not all
58 * of the other character metrics information, there is a way to receive
59 * only the width information so as not to pay the storage cost for the
60 * unwanted data. An application should never request both the
61 * "quick and dirty" char metrics (widths only) and the Character Metrics
62 * Information since the Character Metrics Information will contain all
63 * of the character widths as well.
65 * There is a procedure in parseAFM.c, called parseFile, that can be
66 * called from any application wishing to get information from the AFM File.
67 * This procedure expects 3 parameters: a vaild file descriptor, a pointer
68 * to a (FontInfo *) variable (for which space will be allocated and then
69 * will be filled in with the data requested), and a mask specifying
70 * which data from the AFM File should be saved in the FontInfo structure.
72 * The flags that can be used to set the appropriate mask are defined below.
73 * In addition, several commonly used masks have already been defined.
75 * History:
76 * original: DSM Thu Oct 20 17:39:59 PDT 1988
77 * modified: DSM Mon Jul 3 14:17:50 PDT 1989
78 * - added 'storageProblem' return code
79 * - fixed typos
82 #include <stdio.h>
85 /* your basic constants */
86 #define TRUE 1
87 #define FALSE 0
88 #define EOL '\n' /* end-of-line indicator */
89 #define MAX_NAME 4096 /* max length for identifiers */
90 #define BOOL int
91 #define FLAGS int
95 /* Flags that can be AND'ed together to specify exactly what
96 * information from the AFM file should be saved.
98 #define P_G 0x01 /* 0000 0001 */ /* Global Font Info */
99 #define P_W 0x02 /* 0000 0010 */ /* Character Widths ONLY */
100 #define P_M 0x06 /* 0000 0110 */ /* All Char Metric Info */
101 #define P_P 0x08 /* 0000 1000 */ /* Pair Kerning Info */
102 #define P_T 0x10 /* 0001 0000 */ /* Track Kerning Info */
103 #define P_C 0x20 /* 0010 0000 */ /* Composite Char Info */
106 /* Commonly used flags
108 #define P_GW\
109 (P_G | P_W)
110 #define P_GM\
111 (P_G | P_M)
112 #define P_GMP\
113 (P_G | P_M | P_P)
114 #define P_GMK\
115 (P_G | P_M | P_P | P_T)
116 #define P_GALL\
117 (P_G | P_M | P_P | P_T | P_C)
120 /* Possible return codes from the parseFile procedure.
122 * ok means there were no problems parsing the file.
124 * parseError means that there was some kind of parsing error, but the
125 * parser went on. This could include problems like the count for any given
126 * section does not add up to how many entries there actually were, or
127 * there was a key that was not recognized. The return record may contain
128 * vaild data or it may not.
130 * earlyEOF means that an End of File was encountered before expected. This
131 * may mean that the AFM file had been truncated, or improperly formed.
133 * storageProblem means that there were problems allocating storage for
134 * the data structures that would have contained the AFM data.
136 #define AFM_ok 0
137 #define AFM_parseError -1
138 #define AFM_earlyEOF -2
139 #define AFM_storageProblem -3
143 /************************* TYPES *********************************/
144 /* Below are all of the data structure definitions. These structures
145 * try to map as closely as possible to grouping and naming of data
146 * in the AFM Files.
150 /* Bounding box definition. Used for the Font AFM_BBox as well as the
151 * Character AFM_BBox.
153 typedef struct
155 int llx; /* lower left x-position */
156 int lly; /* lower left y-position */
157 int urx; /* upper right x-position */
158 int ury; /* upper right y-position */
159 } AFM_BBox;
162 /* Global Font information.
163 * The key that each field is associated with is in comments. For an
164 * explanation about each key and its value please refer to the AFM
165 * documentation (full title & version given above).
167 typedef struct
169 char *afmVersion; /* key: StartFontMetrics */
170 char *fontName; /* key: FontName */
171 char *fullName; /* key: FullName */
172 char *familyName; /* key: FamilyName */
173 char *weight; /* key: Weight */
174 float italicAngle; /* key: ItalicAngle */
175 BOOL isFixedPitch; /* key: IsFixedPitch */
176 AFM_BBox fontBBox; /* key: FontBBox */
177 int underlinePosition; /* key: UnderlinePosition */
178 int underlineThickness; /* key: UnderlineThickness */
179 char *version; /* key: Version */
180 char *notice; /* key: Notice */
181 char *encodingScheme; /* key: EncodingScheme */
182 int capHeight; /* key: CapHeight */
183 int xHeight; /* key: XHeight */
184 int ascender; /* key: Ascender */
185 int descender; /* key: Descender */
186 } AFM_GlobalFontInfo;
189 /* Ligature definition is a linked list since any character can have
190 * any number of ligatures.
192 typedef struct _t_ligature
194 char *succ, *lig;
195 struct _t_ligature *next;
196 } AFM_Ligature;
199 /* Character Metric Information. This structure is used only if ALL
200 * character metric information is requested. If only the character
201 * widths is requested, then only an array of the character x-widths
202 * is returned.
204 * The key that each field is associated with is in comments. For an
205 * explanation about each key and its value please refer to the
206 * Character Metrics section of the AFM documentation (full title
207 * & version given above).
209 typedef struct
211 int code, /* key: C */
212 wx, /* key: WX */
213 wy; /* together wx and wy are associated with key: W */
214 char *name; /* key: N */
215 AFM_BBox charBBox; /* key: B */
216 AFM_Ligature *ligs; /* key: L (linked list; not a fixed number of Ls */
217 } AFM_CharMetricInfo;
220 /* Track kerning data structure.
221 * The fields of this record are the five values associated with every
222 * TrackKern entry.
224 * For an explanation about each value please refer to the
225 * Track Kerning section of the AFM documentation (full title
226 * & version given above).
228 typedef struct
230 int degree;
231 float minPtSize,
232 minKernAmt,
233 maxPtSize,
234 maxKernAmt;
235 } AFM_TrackKernData;
238 /* Pair Kerning data structure.
239 * The fields of this record are the four values associated with every
240 * KP entry. For KPX entries, the yamt will be zero.
242 * For an explanation about each value please refer to the
243 * Pair Kerning section of the AFM documentation (full title
244 * & version given above).
246 typedef struct
248 char *name1;
249 char *name2;
250 int xamt,
251 yamt;
252 } AFM_PairKernData;
255 /* AFM_Pcc is a piece of a composite character. This is a sub structure of a
256 * AFM_CompCharData described below.
257 * These fields will be filled in with the values from the key AFM_Pcc.
259 * For an explanation about each key and its value please refer to the
260 * Composite Character section of the AFM documentation (full title
261 * & version given above).
263 typedef struct
265 char *AFM_PccName;
266 int deltax,
267 deltay;
268 } AFM_Pcc;
271 /* Composite Character Information data structure.
272 * The fields ccName and numOfPieces are filled with the values associated
273 * with the key CC. The field pieces points to an array (size = numOfPieces)
274 * of information about each of the parts of the composite character. That
275 * array is filled in with the values from the key AFM_Pcc.
277 * For an explanation about each key and its value please refer to the
278 * Composite Character section of the AFM documentation (full title
279 * & version given above).
281 typedef struct
283 char *ccName;
284 int numOfPieces;
285 AFM_Pcc *pieces;
286 } AFM_CompCharData;
289 /* FontInfo
290 * Record type containing pointers to all of the other data
291 * structures containing information about a font.
292 * A a record of this type is filled with data by the
293 * parseFile function.
295 typedef struct
297 AFM_GlobalFontInfo *gfi; /* ptr to a AFM_GlobalFontInfo record */
298 int *cwi; /* ptr to 256 element array of just char widths */
299 int numOfChars; /* number of entries in char metrics array */
300 AFM_CharMetricInfo *cmi; /* ptr to char metrics array */
301 int numOfTracks; /* number to entries in track kerning array */
302 AFM_TrackKernData *tkd; /* ptr to track kerning array */
303 int numOfPairs; /* number to entries in pair kerning array */
304 AFM_PairKernData *pkd; /* ptr to pair kerning array */
305 int numOfComps; /* number to entries in comp char array */
306 AFM_CompCharData *ccd; /* ptr to comp char array */
307 } AFM_Font_info;
311 /************************* PROCEDURES ****************************/
313 /* Call this procedure to do the grunt work of parsing an AFM file.
315 * "fp" should be a valid file pointer to an AFM file.
317 * "fi" is a pointer to a pointer to a FontInfo record sturcture
318 * (defined above). Storage for the FontInfo structure will be
319 * allocated in parseFile and the structure will be filled in
320 * with the requested data from the AFM File.
322 * "flags" is a mask with bits set representing what data should
323 * be saved. Defined above are valid flags that can be used to set
324 * the mask, as well as a few commonly used masks.
326 * The possible return codes from parseFile are defined above.
329 int AFM_parseFile (FILE *fp, AFM_Font_info **fi, FLAGS flags);
330 void AFM_free (AFM_Font_info *fi);