]> git.donarmstrong.com Git - lilypond.git/blob - flower/include/parse-afm.hh
51b43b3e1f66124da5b9d2249b19c048a60c044b
[lilypond.git] / flower / include / parse-afm.hh
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.
8  *
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.
13  *
14  * PostScript, Display PostScript, and Adobe are registered trademarks of
15  * Adobe Systems Incorporated.
16  * 
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  * ************************************************************************
26  */
27
28 /* ParseAFM.h
29  *
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. 
37  *
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".
42  *
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.
47  * 
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
54  *
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.
64  * 
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.
71  * 
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. 
74  * 
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
80  */
81
82 #include <stdio.h>
83
84
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
92
93
94
95 /* Flags that can be AND'ed together to specify exactly what
96  * information from the AFM file should be saved.
97  */
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   */
104
105
106 /* Commonly used flags
107  */
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)
118
119
120 /* Possible return codes from the parseFile procedure.
121  * 
122  * ok means there were no problems parsing the file.
123  *
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. 
129  *
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.
132  * 
133  * storageProblem means that there were problems allocating storage for
134  * the data structures that would have contained the AFM data.
135  */
136 #define AFM_ok 0
137 #define AFM_parseError -1
138 #define AFM_earlyEOF -2
139 #define AFM_storageProblem -3
140
141
142
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.
147  */
148
149
150 /* Bounding box definition. Used for the Font AFM_BBox as well as the 
151  * Character AFM_BBox.
152  */
153 typedef struct
154
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;
160
161
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). 
166  */
167 typedef struct
168 {  
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;
187
188
189 /* Ligature definition is a linked list since any character can have
190  * any number of ligatures.
191  */
192 typedef struct _t_ligature
193 {
194     char *succ, *lig;
195     struct _t_ligature *next;
196 } AFM_Ligature;
197
198
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.
203  *
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). 
208  */
209 typedef struct
210 {
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;
218
219
220 /* Track kerning data structure.
221  * The fields of this record are the five values associated with every 
222  * TrackKern entry.
223  *  
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). 
227  */
228 typedef struct 
229 {
230     int degree;  
231     float minPtSize, 
232           minKernAmt, 
233           maxPtSize, 
234           maxKernAmt;
235 } AFM_TrackKernData;
236
237
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.
241  *
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). 
245  */
246 typedef struct 
247 {
248     char *name1;
249     char *name2;
250     int xamt,
251         yamt;
252 } AFM_PairKernData;
253
254
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.
258  * 
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).  
262  */
263 typedef struct
264 {
265     char *AFM_PccName;
266     int deltax,
267         deltay;
268 } AFM_Pcc;
269
270
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.
276  * 
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).  
280  */
281 typedef struct
282 {
283     char *ccName;
284     int numOfPieces;
285     AFM_Pcc *pieces;
286 } AFM_CompCharData;
287
288
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.
294  */
295 typedef struct
296
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;
308
309
310
311 /************************* PROCEDURES ****************************/
312
313 /*  Call this procedure to do the grunt work of parsing an AFM file.
314  *
315  *  "fp" should be a valid file pointer to an AFM file.
316  *
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.
321  *
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.
325  *
326  *  The possible return codes from parseFile are defined above.
327  */
328
329 int AFM_parseFile (FILE *fp, AFM_Font_info **fi, FLAGS flags);
330 void AFM_free (AFM_Font_info *fi);