Evince
Evince is a document viewer capable of displaying multiple and single page document formats like PDF and Postscript.
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
afmparse.h
Go to the documentation of this file.
1 /* modified for MDVI -- some names changed to avoid conflicts with T1lib */
2 /*
3  * (C) 1988, 1989 by Adobe Systems Incorporated. All rights reserved.
4  *
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.
9  *
10  * PostScript, Display PostScript, and Adobe are registered trademarks of
11  * Adobe Systems Incorporated.
12  *
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  * ************************************************************************
22  */
23 
24 /* ParseAFM.h
25  *
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.
33  *
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".
38  *
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.
43  *
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
50  *
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.
60  *
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.
67  *
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.
70  *
71  * History:
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
75  * - fixed typos
76  */
77 #ifndef _MDVI_PARSEAFM_H
78 #define _MDVI_PARSEAFM_H 1
79 
80 #include "sysdeps.h"
81 
82 #include <stdio.h>
83 
84 /* your basic constants */
85 #define TRUE 1
86 #define FALSE 0
87 #define EOL '\n' /* end-of-line indicator */
88 #define MAX_NAME 4096 /* max length for identifiers */
89 #define BOOL int
90 #define FLAGS int
91 
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 */
100 
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)
107 
108 /* Possible return codes from the parseFile procedure.
109  *
110  * ok means there were no problems parsing the file.
111  *
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.
117  *
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.
120  *
121  * storageProblem means that there were problems allocating storage for
122  * the data structures that would have contained the AFM data.
123  */
124 #define ok 0
125 #define parseError -1
126 #define earlyEOF -2
127 #define storageProblem -3
128 
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
132  * in the AFM Files.
133  */
134 
135 /* Bounding box definition. Used for the Font BBox as well as the
136  * Character BBox.
137  */
138 typedef struct
139 {
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 */
144 } BBox;
145 
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).
150  */
151 typedef struct
152 {
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 */
171 
172 /* Ligature definition is a linked list since any character can have
173  * any number of ligatures.
174  */
175 typedef struct _t_ligature
176 {
177  char *succ, *lig;
178  struct _t_ligature *next;
179 } Ligature;
180 
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
184  * is returned.
185  *
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).
190  */
191 typedef struct
192 {
193  int code, /* key: C */
194  wx, /* key: WX */
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 */
200 
201 /* Track kerning data structure.
202  * The fields of this record are the five values associated with every
203  * TrackKern entry.
204  *
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).
208  */
209 typedef struct
210 {
211  int degree;
212  float minPtSize,
213  minKernAmt,
214  maxPtSize,
215  maxKernAmt;
216 } TrackKernData;
217 
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.
221  *
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).
225  */
226 typedef struct
227 {
228  char *name1;
229  char *name2;
230  int xamt,
231  yamt;
232 } PairKernData;
233 
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.
237  *
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).
241  */
242 typedef struct
243 {
244  char *pccName;
245  int deltax,
246  deltay;
247 } Pcc;
248 
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.
254  *
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).
258  */
259 typedef struct
260 {
261  char *ccName;
264 } CompCharData;
265 
266 /* FontInfo
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.
271  */
272 typedef struct
273 {
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 */
284 } FontInfo;
285 
286 /************************* PROCEDURES ****************************/
287 
288 /* Call this procedure to do the grunt work of parsing an AFM file.
289  *
290  * "fp" should be a valid file pointer to an AFM file.
291  *
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.
296  *
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.
300  *
301  * The possible return codes from parseFile are defined above.
302  */
303 
304 extern int afm_parse_file __PROTO((FILE *, FontInfo **, FLAGS));
305 extern void afm_free_fontinfo __PROTO((FontInfo *));
306 
307 #endif /* _MDVI_PARSEAFM_H */