1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324
|
/*
* parseAFM.h,v
*
* (c) Copyright 1991-1994 Adobe Systems Incorporated.
* All rights reserved.
*
* Permission to use, copy, modify, distribute, and sublicense this software
* and its documentation for any purpose and without fee is hereby granted,
* provided that the above copyright notices appear in all copies and that
* both those copyright notices and this permission notice appear in
* supporting documentation and that the name of Adobe Systems Incorporated
* not be used in advertising or publicity pertaining to distribution of the
* software without specific, written prior permission. No trademark license
* to use the Adobe trademarks is hereby granted. If the Adobe trademark
* "Display PostScript"(tm) is used to describe this software, its
* functionality or for any other purpose, such use shall be limited to a
* statement that this software works in conjunction with the Display
* PostScript system. Proper trademark attribution to reflect Adobe's
* ownership of the trademark shall be given whenever any such reference to
* the Display PostScript system is made.
*
* ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
* ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
* ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
* TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
* NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
* PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
*
* Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
* Incorporated which may be registered in certain jurisdictions
*
* Author: Adobe Systems Incorporated
*/
/***************************************************************
**
** This header file is used in conjuction with the parseAFM.c file.
** Together these files provide the functionality to parse Adobe Font
** Metrics files and store the information in predefined data structures.
** It is intended to work with an application program that needs font metric
** information. The program can be used as is by making a procedure call to
** parse an AFM file and have the data stored, or an application developer
** may wish to customize the code.
**
** This header file defines the data structures used as well as the key
** strings that are currently recognized by this version of the AFM parser.
** This program is based on the document "Adobe Font Metrics Files,
** Specification Version 2.0".
**
** AFM files are separated into distinct sections of different data. Because
** of this, the parseAFM program can parse a specified file to only save
** certain sections of information based on the application's needs. A record
** containing the requested information will be returned to the application.
**
** AFM files are divided into five sections of data:
** 1) The Global Font Information
** 2) The Character Metrics Information
** 3) The Track Kerning Data
** 4) The Pair-Wise Kerning Data
** 5) The Composite Character Data
**
** Basically, the application can request any of these sections independent
** of what other sections are requested. In addition, in recognizing that
** many applications will want ONLY the x-width of characters and not all
** of the other character metrics information, there is a way to receive
** only the width information so as not to pay the storage cost for the
** unwanted data. An application should never request both the
** "quick and dirty" char metrics (widths only) and the Character Metrics
** Information since the Character Metrics Information will contain all
** of the character widths as well.
**
** There is a procedure in parseAFM.c, called parseFile, that can be
** called from any application wishing to get information from the AFM File.
** This procedure expects 3 parameters: a vaild file descriptor, a pointer
** to a (AFMFontInfo *) variable (for which space will be allocated and then
** will be filled in with the data requested), and a mask specifying
** which data from the AFM File should be saved in the AFMFontInfo structure.
**
** The flags that can be used to set the appropriate mask are defined below.
** In addition, several commonly used masks have already been defined.
**
** History:
** original: DSM Thu Oct 20 17:39:59 PDT 1988
** modified: DSM Mon Jul 3 14:17:50 PDT 1989
** - added 'storageProblem' return code
** - fixed typos
**
**************************************************************/
#include <stdio.h>
/*
** Flags that can be AND'ed together to specify exactly what
** information from the AFM file should be saved.
*/
#define AFM_G 0x01 /* 0000 0001 */ /* Global Font Info */
#define AFM_W 0x02 /* 0000 0010 */ /* Character Widths ONLY */
#define AFM_M 0x06 /* 0000 0110 */ /* All Char Metric Info */
#define AFM_P 0x08 /* 0000 1000 */ /* Pair Kerning Info */
#define AFM_T 0x10 /* 0001 0000 */ /* Track Kerning Info */
#define AFM_C 0x20 /* 0010 0000 */ /* Composite Char Info */
/*
** Commonly used flags
*/
#define AFM_GW (AFM_G | AFM_W)
#define AFM_GM (AFM_G | AFM_M)
#define AFM_GMP (AFM_G | AFM_M | AFM_P)
#define AFM_GMK (AFM_G | AFM_M | AFM_P | AFM_T)
#define AFM_ALL (AFM_G | AFM_M | AFM_P | AFM_T | AFM_C)
/*
** Possible return codes from the AFMParseFile procedure.
**
** afm_ok means there were no problems parsing the file.
**
** afm_parseError means that there was some kind of parsing error, but the
** parser went on. This could include problems like the count for any given
** section does not add up to how many entries there actually were, or
** there was a key that was not recognized. The return record may contain
** vaild data or it may not.
**
** afm_earlyEOF means that an End of File was encountered before expected. This
** may mean that the AFM file had been truncated, or improperly formed.
**
** afm_storageProblem means that there were problems allocating storage for
** the data structures that would have contained the AFM data.
*/
#define afm_ok 0
#define afm_parseError -1
#define afm_earlyEOF -2
#define afm_storageProblem -3
/************************* TYPES ********************************/
/*
** Below are all of the data structure definitions. These structures
** try to map as closely as possible to grouping and naming of data
** in the AFM Files.
*/
/*
** Bounding box definition. Used for the Font BBox as well as the
** Character BBox.
*/
typedef struct
{
int llx; /* lower left x-position */
int lly; /* lower left y-position */
int urx; /* upper right x-position */
int ury; /* upper right y-position */
} AFMBBox;
/*
** Global Font information.
** The key that each field is associated with is in comments. For an
** explanation about each key and its value please refer to the AFM
** documentation (full title & version given above).
*/
typedef struct
{
char *afmVersion; /* key: StartFontMetrics */
char *fontName; /* key: FontName */
char *fullName; /* key: FullName */
char *familyName; /* key: FamilyName */
char *weight; /* key: Weight */
float italicAngle; /* key: ItalicAngle */
int isFixedPitch; /* key: IsFixedPitch */
AFMBBox fontBBox; /* key: FontBBox */
int underlinePosition; /* key: UnderlinePosition */
int underlineThickness; /* key: UnderlineThickness */
char *version; /* key: Version */
char *notice; /* key: Notice */
char *encodingScheme; /* key: EncodingScheme */
int capHeight; /* key: CapHeight */
int xHeight; /* key: XHeight */
int ascender; /* key: Ascender */
int descender; /* key: Descender */
} AFMGlobalFontInfo;
/*
** Ligature definition is a linked list since any character can have
** any number of ligatures.
*/
typedef struct _t_ligature
{
char *succ, *lig;
struct _t_ligature *next;
} AFMLigature;
/*
** Character Metric Information. This structure is used only if ALL
** character metric information is requested. If only the character
** widths is requested, then only an array of the character x-widths
** is returned.
**
** The key that each field is associated with is in comments. For an
** explanation about each key and its value please refer to the
** Character Metrics section of the AFM documentation (full title
** & version given above).
*/
typedef struct
{
int code, /* key: C */
wx, /* key: WX */
wy; /* together wx and wy are associated with key: W */
char *name; /* key: N */
AFMBBox charBBox; /* key: B */
AFMLigature *ligs; /* key: L (linked list; not a fixed number of Ls */
} AFMCharMetricInfo;
/*
** Track kerning data structure.
** The fields of this record are the five values associated with every
** TrackKern entry.
**
** For an explanation about each value please refer to the
** Track Kerning section of the AFM documentation (full title
** & version given above).
*/
typedef struct
{
int degree;
float minPtSize,
minKernAmt,
maxPtSize,
maxKernAmt;
} AFMTrackKernData;
/*
** Pair Kerning data structure.
** The fields of this record are the four values associated with every
** KP entry. For KPX entries, the yamt will be zero.
**
** For an explanation about each value please refer to the
** Pair Kerning section of the AFM documentation (full title
** & version given above).
*/
typedef struct
{
char *name1;
char *name2;
int xamt,
yamt;
} AFMPairKernData;
/*
** PCC is a piece of a composite character. This is a sub structure of a
** compCharData described below.
** These fields will be filled in with the values from the key PCC.
**
** For an explanation about each key and its value please refer to the
** Composite Character section of the AFM documentation (full title
** & version given above).
*/
typedef struct
{
char *pccName;
int deltax,
deltay;
} AFMPcc;
/*
** Composite Character Information data structure.
** The fields ccName and numOfPieces are filled with the values associated
** with the key CC. The field pieces points to an array (size = numOfPieces)
** of information about each of the parts of the composite character. That
** array is filled in with the values from the key PCC.
**
** For an explanation about each key and its value please refer to the
** Composite Character section of the AFM documentation (full title
** & version given above).
*/
typedef struct
{
char *ccName;
int numOfPieces;
AFMPcc *pieces;
} AFMCompCharData;
/*
** AFMFontInfo
** Record type containing pointers to all of the other data
** structures containing information about a font.
** A a record of this type is filled with data by the
** parseFile function.
*/
typedef struct
{
AFMGlobalFontInfo *gfi; /* ptr to a GlobalAFMFontInfo record */
float *cwi; /* ptr to 256 element array of char widths */
int numOfChars; /* number of entries in char metrics array */
AFMCharMetricInfo *cmi; /* ptr to char metrics array */
int numOfTracks; /* number to entries in track kerning array */
AFMTrackKernData *tkd; /* ptr to track kerning array */
int numOfPairs; /* number to entries in pair kerning array */
AFMPairKernData *pkd; /* ptr to pair kerning array */
int numOfComps; /* number to entries in comp char array */
AFMCompCharData *ccd; /* ptr to comp char array */
} AFMFontInfo;
/************************* PROCEDURES ***************************/
/*
** Call this procedure to do the grunt work of parsing an AFM file.
**
** "fp" should be a valid file pointer to an AFM file.
**
** "fi" is a pointer to a pointer to a AFMFontInfo record sturcture
** (defined above). Storage for the AFMFontInfo structure will be
** allocated in parseFile and the structure will be filled in
** with the requested data from the AFM File.
**
** "flags" is a mask with bits set representing what data should
** be saved. Defined above are valid flags that can be used to set
** the mask, as well as a few commonly used masks.
**
** The possible return codes from AFMParseFile are defined above.
*/
extern int AFMParseFile ( /* FILE *fp; AFMFontInfo **fi; int flags; */ );
|