beta-0.89.2
[luatex.git] / source / texk / web2c / luatexdir / luafontloader / fontforge / fontforge / ttf.h
blobab2ddac803de7dd20cec5e9ad991a62f99c18881
1 /* Copyright (C) 2001-2008 by George Williams */
2 /*
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are met:
6 * Redistributions of source code must retain the above copyright notice, this
7 * list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
13 * The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "psfont.h" /* for struct fddata */
30 #define MAC_DELETED_GLYPH_NAME "<Delete>"
32 /* Some glyphs have multiple encodings ("A" might be used for Alpha and Cyrillic A) */
33 struct dup {
34 SplineChar *sc;
35 int enc;
36 int uni;
37 struct dup *prev;
40 struct ttfinfo {
41 int emsize; /* ascent + descent? from the head table */
42 int ascent, descent; /* from the hhea table */
43 /* not the usWinAscent from the OS/2 table */
44 int vertical_origin; /* if vmetrics are present */
45 int width_cnt; /* from the hhea table, in the hmtx table */
46 int glyph_cnt; /* from maxp table (or cff table) */
47 unsigned int index_to_loc_is_long:1; /* in head table */
48 unsigned int is_ttc:1; /* Is it a font collection? */
49 unsigned int is_onebyte:1; /* Is it a one byte encoding? */
50 unsigned int twobytesymbol:1; /* it had a symbol encoding which we converted to unicode */
51 unsigned int complainedbeyondglyfend:1; /* Don't complain about this more than once */
52 unsigned int extensionrequested:1; /* Only ask once for a copy of a font containing extension subtables */
53 unsigned int to_order2:1; /* We are to leave the font as truetype (order2) splines, else convert to ps */
54 unsigned int complainedmultname:1; /* Don't complain about this more than once */
55 unsigned int strokedfont: 1; /* painttype==2 for otf */
56 unsigned int use_typo_metrics: 1;
57 unsigned int weight_width_slope_only: 1;
58 unsigned int optimized_for_cleartype: 1;
59 unsigned int apply_lsb: 1;
60 enum openflags openflags;
61 /* Mac fonts platform=0/1, platform specific enc id, roman=0, english is lang code 0 */
62 /* iso platform=2, platform specific enc id, latin1=0/2, no language */
63 /* microsoft platform=3, platform specific enc id, 1, english is lang code 0x??09 */
64 char *copyright; /* from the name table, nameid=0 */
65 char *familyname; /* nameid=1 */
66 char *fullname; /* nameid=4 */
67 char *weight;
68 char *version; /* nameid=5 */
69 char *fontname; /* postscript font name, nameid=6 */
70 char *xuid; /* Only for open type cff fonts */
71 int uniqueid;
72 real italicAngle; /* from post table */
73 int upos, uwidth; /* underline pos, width from post table */
74 real strokewidth;
75 int fstype;
76 struct psdict *private; /* Only for open type cff fonts */
77 EncMap *map;
78 enum uni_interp uni_interp;
79 struct pfminfo pfminfo;
80 short os2_version;
81 short gasp_version;
82 int dupnamestate;
83 struct ttflangname *names;
84 char *fontcomments, *fontlog;
85 char **cvt_names;
86 SplineChar **chars; /* from all over, glyf table for contours */
87 /* cmap table for encodings */
88 /* hmtx table for widths */
89 /* post table for names */
90 /* Or from CFF table for everything in opentype */
91 LayerInfo *layers;
92 int layer_cnt;
93 BDFFont *bitmaps;
94 char *cidregistry, *ordering;
95 int supplement;
96 real cidfontversion;
97 int subfontcnt;
98 SplineFont **subfonts;
99 char *inuse; /* What glyphs are used by this font in the ttc */
101 int numtables;
102 /* BASE */
103 uint32 base_start; /* Offset from sof to start of 'BASE' table */
104 /* CFF */
105 uint32 cff_start; /* Offset from sof to start of postscript compact font format */
106 uint32 cff_length;
107 /* cmap */
108 uint32 encoding_start; /* Offset from sof to start of encoding table */
109 uint32 vs_start; /* Offset within 'cmap' to variant selector table */
110 /* gasp */
111 uint32 gasp_start;
112 /* glyf */
113 uint32 glyph_start; /* Offset from sof to start of glyph table */
114 uint32 glyph_length;
115 /* GDEF */
116 uint32 gdef_start; /* Offset from sof to start of GDEF table (glyph class defn, ligature carets) */
117 uint32 gdef_length;
118 /* GPOS */
119 uint32 gpos_start; /* Offset from sof to start of GPOS table */
120 uint32 gpos_length;
121 /* GSUB */
122 uint32 gsub_start; /* Offset from sof to start of GSUB table */
123 uint32 gsub_length;
124 uint32 g_bounds; /* Filled in with g???_start+g???_length */
125 /* EBDT, bdat */
126 uint32 bitmapdata_start; /* Offset to start of bitmap data */
127 uint32 bitmapdata_length;
128 /* EBLT, bloc */
129 uint32 bitmaploc_start; /* Offset to start of bitmap locator data */
130 uint32 bitmaploc_length;
131 /* head */
132 uint32 head_start;
133 /* hhea */
134 uint32 hhea_start;
135 /* hmtx */
136 uint32 hmetrics_start;
137 /* kern */
138 uint32 kern_start;
139 /* loca */
140 uint32 glyphlocations_start;/* there are glyph_cnt of these, from maxp tab */
141 uint32 loca_length; /* actually glypn_cnt is wrong. Use the table length (divided by size) instead */
142 /* maxp */
143 uint32 maxp_start; /* maximum number of glyphs */
144 uint32 maxp_len;
145 /* name */
146 uint32 copyright_start; /* copyright and fontname */
147 /* post */
148 uint32 postscript_start; /* names for the glyphs, italic angle, etc. */
149 /* OS/2 */
150 uint32 os2_start;
151 /* TYP1 */
152 uint32 typ1_start; /* For Adobe's? Apple's? attempt to stuff a type1 font into an sfnt wrapper */
153 uint32 typ1_length;
154 /* vhea */
155 uint32 vhea_start;
156 /* vmtx */
157 uint32 vmetrics_start;
158 /* VORG */
159 uint32 vorg_start;
161 /* PfEd -- FontForge/PfaEdit specific info */
162 uint32 pfed_start;
163 /* TeX -- TeX table, also non-standard */
164 uint32 tex_start;
165 /* BDF -- BDF properties, also non-standard */
166 uint32 bdf_start;
167 /* FFTM -- FontForge timestamps */
168 uint32 fftm_start;
170 /* MATH Table */
171 uint32 math_start;
172 uint32 math_length;
174 /* Info for instructions */
175 uint32 cvt_start, cvt_len;
176 uint32 prep_start, prep_len;
177 uint32 fpgm_start, fpgm_len;
179 unsigned int one_of_many: 1; /* A TTCF file, or a opentype font with multiple fonts */
180 unsigned int obscomplain: 1; /* We've complained about obsolete format 3 in EBDT table */
181 unsigned int cmpcomplain: 1; /* We've complained about compressed format 4 in EBDT */
182 unsigned int unkcomplain: 1; /* We've complained about unknown formats in EBDT */
183 unsigned int comcomplain: 1; /* We've complained about composit formats in EBDT */
184 unsigned int onlystrikes: 1; /* Only read in the bitmaps, not the outlines */
185 unsigned int onlyonestrike: 1; /* Only read in one bitmap (strike) */
186 unsigned int barecff: 1; /* pay attention to the encoding in the cff file, we won't have a cmap */
188 int platform, specific; /* values of the encoding we chose to use */
190 int anchor_class_cnt; /* For GPOS */
191 int anchor_merge_cnt;
192 AnchorClass *ahead, *alast;
194 KernClass *khead, *klast, *vkhead, *vklast;
196 OTLookup *gpos_lookups, *gsub_lookups, *cur_lookups;
198 struct ttf_table *tabs;
199 FPST *possub;
200 char *chosenname;
201 int macstyle;
202 int lookup_cnt; /* Max lookup in current GPOS/GSUB table */
203 int feature_cnt; /* Max feature in current GPOS/GSUB table */
204 struct fontdict *fd; /* For reading in Type42 fonts. Glyph names in postscript section must be associated with glyphs in TTF section */
205 int savecnt;
206 struct savetab {
207 uint32 tag;
208 uint32 offset;
209 int len;
210 } *savetab;
211 int32 last_size_pos;
212 uint16 design_size;
213 uint16 fontstyle_id;
214 struct otfname *fontstyle_name;
215 uint16 design_range_bottom, design_range_top;
216 struct texdata texdata;
217 int mark_class_cnt;
218 char **mark_classes; /* glyph name list */
219 char **mark_class_names; /* used within ff (utf8) */
220 SplineChar **badgids; /* which use out of range glyph IDs as temporary flags */
221 #ifdef _HAS_LONGLONG
222 long long creationtime; /* seconds since 1970 */
223 long long modificationtime;
224 #else
225 long creationtime;
226 long modificationtime;
227 #endif
228 int gasp_cnt;
229 struct gasp *gasp;
230 struct MATH *math;
231 /* Set of errors we found when loading the font */
232 unsigned int bad_ps_fontname: 1;
233 unsigned int bad_glyph_data: 1;
234 unsigned int bad_cff: 1;
235 unsigned int bad_metrics: 1;
236 unsigned int bad_cmap: 1;
237 unsigned int bad_embedded_bitmap: 1;
238 unsigned int bad_gx: 1;
239 unsigned int bad_ot: 1;
240 unsigned int bad_os2_version: 1;
241 unsigned int bad_sfnt_header: 1;
242 Layer guidelines;
243 struct Base *horiz_base, *vert_base;
246 enum gsub_inusetype { git_normal, git_justinuse, git_findnames };
248 #define MAX_TAB 48
249 struct tabdir {
250 int32 version; /* 0x00010000 */
251 uint16 numtab;
252 uint16 searchRange; /* (Max power of 2 <= numtab) *16 */
253 uint16 entrySel; /* Log2(Max power of 2 <= numtab ) */
254 uint16 rangeShift; /* numtab*16 - searchRange */
255 struct taboff {
256 uint32 tag; /* Table name */
257 uint32 checksum;/* for table */
258 uint32 offset; /* to start of table in file */
259 uint32 length;
260 FILE *data;
261 uint16 dup_of;
262 uint16 orderingval;
263 } tabs[MAX_TAB]; /* room for all the above tables */
264 /* Not in any particular order. */
265 struct taboff *ordered[MAX_TAB]; /* Ordered the way the tables should be output in file */
266 struct taboff *alpha[MAX_TAB]; /* Ordered alphabetically by tag for the ttf header */
269 struct glyphhead {
270 int16 numContours;
271 int16 xmin;
272 int16 ymin;
273 int16 xmax;
274 int16 ymax;
277 struct head {
278 int32 version; /* 0x00010000 */
279 int32 revision; /* 0 */
280 uint32 checksumAdj; /* set to 0, sum entire font, store 0xb1b0afba-sum */
281 uint32 magicNum; /* 0x5f0f3cf5 */
282 uint16 flags; /* 1 */
283 uint16 emunits; /* sf->ascent+sf->descent */
284 int32 createtime[2];/* number of seconds since 1904 */
285 int32 modtime[2];
286 int16 xmin; /* min for entire font */
287 int16 ymin;
288 int16 xmax;
289 int16 ymax;
290 uint16 macstyle; /* 1=>Bold, 2=>Italic */
291 uint16 lowestreadable; /* size in pixels. Say about 10? */
292 int16 dirhint; /* 0=>mixed directional characters, */
293 int16 locais32; /* is the location table 32bits or 16, 0=>16, 1=>32 */
294 int16 glyphformat; /* 0 */
295 uint16 mbz; /* padding */
298 struct hhead {
299 int32 version; /* 0x00010000 */
300 int16 ascender; /* sf->ascender */
301 int16 descender; /* -sf->descender */
302 int16 linegap; /* 0 */
303 int16 maxwidth; /* of all characters */
304 int16 minlsb; /* How is this different from xmin above? */
305 int16 minrsb;
306 int16 maxextent; /* How is this different from xmax above? */
307 int16 caretSlopeRise;/* Uh... let's say 1? */
308 int16 caretSlopeRun;/* Uh... let's say 0 */
309 /* not exactly specified, but FontValidator wants this to match italicangle */
310 int16 mbz[5];
311 int16 metricformat; /* 0 */
312 uint16 numMetrics; /* just set to glyph count */
315 struct hmtx {
316 uint16 width; /* NOTE: TTF only allows positive widths!!! */
317 int16 lsb;
320 struct kern {
321 uint16 version; /* 0 */
322 uint16 ntab; /* 1, number of subtables */
323 /* first (and only) subtable */
324 uint16 stversion; /* 0 */
325 uint16 length; /* length of subtable beginning at &stversion */
326 uint16 coverage; /* 1, (set of flags&format) */
327 uint16 nPairs; /* number of kern pairs */
328 uint16 searchRange; /* (Max power of 2 <= nPairs) *6 */
329 uint16 entrySel; /* Log2(Max power of 2 <= nPairs ) */
330 uint16 rangeShift; /* numtab*6 - searchRange */
331 struct kp {
332 uint16 left; /* left glyph num */
333 uint16 right; /* right glyph num */
334 /* table is ordered by these two above treated as uint32 */
335 int16 offset; /* kern amount */
336 } *kerns; /* Array should be nPairs big */
339 struct maxp {
340 int32 version; /* 0x00010000 */
341 uint16 numGlyphs;
342 uint16 maxPoints; /* max number of points in a simple glyph */
343 uint16 maxContours; /* max number of paths in a simple glyph */
344 uint16 maxCompositPts;
345 uint16 maxCompositCtrs;
346 uint16 maxZones; /* 1 */
347 uint16 maxTwilightPts; /* 0 */
348 uint16 maxStorage; /* 0 */
349 uint16 maxFDEFs; /* 0 */
350 uint16 maxIDEFs; /* 0 */
351 uint16 maxStack; /* 0 */
352 uint16 maxglyphInstr;/* 0 */
353 uint16 maxnumcomponents; /* Maximum number of refs in any composit */
354 uint16 maxcomponentdepth;
355 /* Apple docs say: 0 (if no composits), maximum value 1 (one level of composit) */
356 /* OpenType docs say: 1 (if no composits), any depth allowed */
359 struct nametab {
360 uint16 format; /* 0 */
361 uint16 numrec; /* 1 */
362 uint16 startOfStrings; /* offset from start of table to start of strings */
363 struct namerec {
364 uint16 platform; /* 3 => MS */
365 uint16 specific; /* 1 */
366 uint16 language; /* 0x0409 */
367 uint16 nameid; /* 0=>copyright, 1=>family, 2=>weight, 4=>fullname */
368 /* 5=>version, 6=>postscript name */
369 uint16 strlen;
370 uint16 stroff;
371 } nr[6];
374 struct os2 {
375 uint16 version; /* 1 */
376 int16 avgCharWid; /* average all chars (v3) see v2 definition below */
377 uint16 weightClass; /* 100=>thin, 200=>extra-light, 300=>light, 400=>normal, */
378 /* 500=>Medium, 600=>semi-bold, 700=>bold, 800=>extra-bold, */
379 /* 900=>black */
380 uint16 widthClass; /* 75=>condensed, 100, 125=>expanded */
381 int16 fstype; /* 0x0008 => allow embedded editing */
382 int16 ysubXSize; /* emsize/5 */
383 int16 ysubYSize; /* emsize/5 */
384 int16 ysubXOff; /* 0 */
385 int16 ysubYOff; /* emsize/5 */
386 int16 ysupXSize; /* emsize/5 */
387 int16 ysupYSize; /* emsize/5 */
388 int16 ysupXOff; /* 0 */
389 int16 ysupYOff; /* emsize/5 */
390 int16 yStrikeoutSize; /* 102/2048 *emsize */
391 int16 yStrikeoutPos; /* 530/2048 *emsize */
392 int16 sFamilyClass; /* ??? 0 */
393 /* high order byte is the "class", low order byte the sub class */
394 /* class = 0 => no classification */
395 /* class = 1 => old style serifs */
396 /* subclass 0, no class; 1 ibm rounded; 2 garalde; 3 venetian; 4 mod venitian; 5 dutch modern; 6 dutch trad; 7 contemporary; 8 caligraphic; 15 misc */
397 /* class = 2 => transitional serifs */
398 /* subclass 0, no class; 1 drect line; 2 script; 15 misc */
399 /* class = 3 => modern serifs */
400 /* subclass: 1, italian; 2, script */
401 /* class = 4 => clarendon serifs */
402 /* subclass: 1, clarendon; 2, modern; 3 trad; 4 newspaper; 5 stub; 6 monotone; 7 typewriter */
403 /* class = 5 => slab serifs */
404 /* subclass: 1, monotone; 2, humanist; 3 geometric; 4 swiss; 5 typewriter */
405 /* class = 7 => freeform serifs */
406 /* subclass: 1, modern */
407 /* class = 8 => sans serif */
408 /* subclass: 1, ibm neogrotesque; 2 humanist; 3 low-x rounded; 4 high-x rounded; 5 neo-grotesque; 6 mod neo-grot; 9 typewriter; 10 matrix */
409 /* class = 9 => ornamentals */
410 /* subclass: 1, engraver; 2 black letter; 3 decorative; 4 3D */
411 /* class = 10 => scripts */
412 /* subclass: 1, uncial; 2 brush joined; 3 formal joined; 4 monotone joined; 5 calligraphic; 6 brush unjoined; 7 formal unjoined; 8 monotone unjoined */
413 /* class = 12 => symbolic */
414 /* subclass: 3 mixed serif; 6 old style serif; 7 neo-grotesque sans; */
415 char panose[10]; /* can be set to zero */
416 uint32 unicoderange[4];
417 /* 1<<0=>ascii, 1<<1 => latin1, 2=>100-17f, 3=>180-24f, 4=>250-2af */
418 /* 5=> 2b0-2ff, 6=>300-36f, ... */
419 char achVendID[4]; /* can be zero */
420 uint16 fsSel; /* 1=> italic, 32=>bold, 64 => regular */
421 /* 2=>underscore, 4=>negative, 8->outlined, 16=>strikeout */
422 /* version 4 of OS/2 */
423 /* 128->don't use win_ascent/descent for line spacing */
424 /* 256=>family varies on weight width slope only */
425 /* 512=>oblique (as opposed to italic) */
426 uint16 firstcharindex; /* minimum unicode encoding */
427 uint16 lastcharindex; /* maximum unicode encoding */
428 uint16 ascender; /* font ascender height (not ascent) */
429 uint16 descender; /* font descender height */
430 uint16 linegap; /* 0 */
431 uint16 winascent; /* ymax */
432 uint16 windescent; /* ymin */
433 uint32 ulCodePage[2];
434 /* 1<<0 => latin1, 1<<1=>latin2, cyrillic, greek, turkish, hebrew, arabic */
435 /* 1<<30 => mac, 1<<31 => symbol */
436 /* OTF stuff (version 2 of OS/2) */
437 short xHeight;
438 short capHeight;
439 short defChar;
440 short breakChar;
441 short maxContext;
442 /* V3 of OS/2 has no additional data */
443 /* V4 of OS/2 has no additional data */
445 int v1_avgCharWid; /* 1&2 Weighted average of the lower case letters and space */
446 int v3_avgCharWid; /* 3&4 average over all non-zero width glyphs */
449 struct post {
450 int32 formattype; /* 0x00020000 */
451 int32 italicAngle; /* in fixed format */
452 int16 upos;
453 int16 uwidth;
454 uint32 isfixed;
455 uint32 minmem42;
456 uint32 maxmem42;
457 uint32 minmem1;
458 uint32 maxmem1;
459 uint16 numglyphs;
460 uint16 glyphnameindex[1];
463 struct glyphinfo {
464 struct maxp *maxp; /* this one is given to dumpglyphs, rest blank */
465 uint32 *loca;
466 FILE *glyphs;
467 FILE *hmtx;
468 int hmtxlen;
469 FILE *vmtx;
470 int vmtxlen;
471 int next_glyph;
472 int glyph_len;
473 int xmin, ymin, xmax, ymax;
474 BlueData bd;
475 int strikecnt; /* number of bitmaps to dump */
476 int lasthwidth, lastvwidth; /* encoding of last glyph for which we generate a full metrics entry */
477 int hfullcnt, vfullcnt;
478 int flags;
479 int fixed_width;
480 int32 *bsizes;
481 unsigned int onlybitmaps: 1;
482 unsigned int has_instrs: 1;
483 unsigned int is_ttf: 1;
484 SplineFont *sf;
485 int32 *pointcounts;
486 int *bygid; /* glyph list */
487 int gcnt;
488 int layer;
491 struct vorg {
492 uint16 majorVersion; /* 1 */
493 uint16 minorVersion; /* 0 */
494 short defaultVertOriginY; /* Y coord of default vertical origin in the design coordinate system */
495 uint16 numVertOriginYMetrics; /* exceptions to the above, elements in following array */
496 #if 0
497 struct {
498 uint16 glyphindex; /* ordered */
499 short vertOrigin;
500 } origins[];
501 #endif
504 struct alltabs {
505 struct tabdir tabdir;
506 struct head head;
507 struct hhead hhead;
508 struct hhead vhead;
509 struct maxp maxp;
510 struct os2 os2;
511 struct vorg vorg;
512 FILE *loca;
513 int localen;
514 FILE *name;
515 int namelen;
516 FILE *post;
517 int postlen;
518 FILE *gpos; /* Used instead of kern for opentype (and other glyph positioning) */
519 int gposlen;
520 FILE *gsub; /* Used for ligatures and other substitutions */
521 int gsublen;
522 FILE *gdef; /* If we use mark to base we need this to tell the text processor what things are marks (the opentype docs say it is optional. They are wrong) */
523 int gdeflen;
524 FILE *kern;
525 int kernlen;
526 FILE *cmap;
527 int cmaplen;
528 FILE *headf;
529 int headlen;
530 FILE *hheadf;
531 int hheadlen;
532 FILE *maxpf;
533 int maxplen;
534 FILE *os2f;
535 int os2len;
536 FILE *math;
537 int mathlen;
538 FILE *base;
539 int baselen;
540 FILE *cvtf;
541 int cvtlen;
542 FILE *fpgmf; /* Copied from an original ttf file and dumped out. Never generated */
543 int fpgmlen;
544 FILE *prepf; /* Copied from an original ttf file and dumped out. Never generated */
545 int preplen;
546 FILE *vheadf;
547 int vheadlen;
548 FILE *vorgf;
549 int vorglen;
550 FILE *gaspf;
551 int gasplen;
552 FILE *cfff;
553 int cfflen;
554 FILE *sidf;
555 FILE *sidh;
556 FILE *charset;
557 FILE *encoding;
558 FILE *globalsubrs;
559 FILE *private;
560 FILE *charstrings;
561 FILE *fdselect;
562 FILE *fdarray;
563 FILE *bdat; /* might be EBDT */
564 int bdatlen;
565 FILE *bloc; /* might be EBLC */
566 int bloclen;
567 FILE *ebsc;
568 int ebsclen;
569 FILE *pfed;
570 int pfedlen;
571 FILE *tex;
572 int texlen;
573 FILE *bdf;
574 int bdflen;
575 FILE *fftmf;
576 int fftmlen;
577 FILE *dsigf;
578 int dsiglen;
579 FILE *hdmxf;
580 int hdmxlen;
581 int defwid, nomwid;
582 int sidcnt;
583 int lenpos;
584 int privatelen;
585 unsigned int sidlongoffset: 1;
586 unsigned int cfflongoffset: 1;
587 unsigned int applemode: 1; /* Where apple & ms differ do things apple's way (bitmaps, name table PostScript) */
588 unsigned int opentypemode: 1; /* Where apple & ms differ do things opentype's way (bitmaps, name table PostScript) */
589 /* If both are set then try to generate both types of tables. Some things can't be fudged though (name table postscript) */
590 unsigned int msbitmaps: 1;
591 unsigned int applebitmaps: 1;
592 unsigned int otbbitmaps: 1;
593 unsigned int isotf: 1;
594 unsigned int error: 1;
595 struct glyphinfo gi;
596 int isfixed;
597 struct fd2data *fds;
598 int next_strid;
600 int next_lookup; /* for doing nested lookups in contextual features */
601 short *gn_sid;
602 enum fontformat format;
603 int fontstyle_name_strid; /* For GPOS 'size' */
604 SplineFont *sf;
605 EncMap *map;
606 struct ttf_table *oldcvt;
607 int oldcvtlen;
610 struct subhead { uint16 first, cnt, delta, rangeoff; }; /* a sub header in 8/16 cmap table */
612 enum touchflags { tf_x=1, tf_y=2, tf_d=4, tf_endcontour=0x80, tf_startcontour=0x40 };
614 struct contexttree {
615 int depth;
616 int branch_cnt; /* count of subbranches of this node */
617 struct ct_branch {
618 uint16 classnum;
619 struct contexttree *branch;
620 } *branches;
621 struct fpst_rule *ends_here;
622 int rule_cnt; /* count of rules which are active here */
623 struct ct_subs {
624 struct fpst_rule *rule;
625 struct contexttree *branch;/* if the rule ends here this will be null */
626 uint16 thisclassnum;
627 } *rules;
628 int pending_pos;
629 OTLookup *applymarkedsubs;
630 OTLookup *applycursubs;
631 uint16 marked_index, cur_index;
632 uint8 markme;
633 int state, next_state;
634 struct contexttree *parent;
637 /* TrueType Composite glyph flags */
638 #define _ARGS_ARE_WORDS 1
639 #define _ARGS_ARE_XY 2
640 #define _ROUND 4 /* round offsets so componant is on grid */
641 #define _SCALE 8
642 /* 0x10 is reserved */
643 #define _MORE 0x20
644 #define _XY_SCALE 0x40
645 #define _MATRIX 0x80
646 #define _INSTR 0x100
647 #define _USE_MY_METRICS 0x200
648 #define _OVERLAP_COMPOUND 0x400 /* Used in Apple GX fonts */
649 /* Means the components overlap (which? this one and what other?) */
650 /* Described in OpenType specs, not by Apple */
651 /* amusingly, Apple supports but MS does not */
652 /* MS says they support this after Win 2000 */
653 #define _SCALED_OFFSETS 0x800 /* Use Apple definition of offset interpretation */
654 #define _UNSCALED_OFFSETS 0x1000 /* Use MS definition */
656 extern int ttfFixupRef(SplineChar **chars,int i);
658 /* Open type Advanced Typography Tables */
659 extern void otf_dumpgpos(struct alltabs *at, SplineFont *sf);
660 extern void otf_dumpgsub(struct alltabs *at, SplineFont *sf);
661 extern void otf_dumpgdef(struct alltabs *at, SplineFont *sf);
662 extern void otf_dumpbase(struct alltabs *at, SplineFont *sf);
663 extern void otf_dump_dummydsig(struct alltabs *at, SplineFont *sf);
664 extern int gdefclass(SplineChar *sc);
666 extern void ttf_dumpkerns(struct alltabs *at, SplineFont *sf);
668 /* TrueType instructions */
669 extern struct ttf_table *SFFindTable(SplineFont *sf,uint32 tag);
670 extern int TTF__getcvtval(SplineFont *sf,int val);
671 extern int TTF_getcvtval(SplineFont *sf,int val);
672 extern void SCinitforinstrs(SplineChar *sc);
673 extern int SSAddPoints(SplineSet *ss,int ptcnt,BasePoint *bp, char *flags);
675 /* Used by both otf and apple */
676 extern int LigCaretCnt(SplineChar *sc);
677 extern uint16 *ClassesFromNames(SplineFont *sf,char **classnames,int class_cnt,
678 int numGlyphs, SplineChar ***glyphs, int apple_kc);
679 extern SplineChar **SFGlyphsFromNames(SplineFont *sf,char *names);
682 extern void AnchorClassOrder(SplineFont *sf);
683 extern SplineChar **EntryExitDecompose(SplineFont *sf,AnchorClass *ac,
684 struct glyphinfo *gi);
685 extern void AnchorClassDecompose(SplineFont *sf,AnchorClass *_ac, int classcnt, int *subcnts,
686 SplineChar ***marks,SplineChar ***base,
687 SplineChar ***lig,SplineChar ***mkmk,
688 struct glyphinfo *gi);
690 #ifdef _HAS_LONGLONG
691 extern void cvt_unix_to_1904( long long time, int32 result[2]);
692 #else
693 extern void cvt_unix_to_1904( long time, int32 result[2]);
694 #endif
697 /* Non-standard tables */
698 /* My PfEd table for FontForge/PfaEdit specific info */
699 extern void pfed_dump(struct alltabs *at, SplineFont *sf);
700 extern void pfed_read(FILE *ttf,struct ttfinfo *info);
701 /* The TeX table, to contain stuff the TeX people want */
702 extern void tex_dump(struct alltabs *at, SplineFont *sf);
703 extern void tex_read(FILE *ttf,struct ttfinfo *info);
704 /* The BDF table, to contain bdf properties the X people want */
705 extern int ttf_bdf_dump(SplineFont *sf,struct alltabs *at,int32 *sizes);
706 extern void ttf_bdf_read(FILE *ttf,struct ttfinfo *info);
707 /* The FFTM table, to some timestamps I'd like */
708 extern int ttf_fftm_dump(SplineFont *sf,struct alltabs *at);
710 /* The MATH table */
711 extern void otf_dump_math(struct alltabs *at, SplineFont *sf);
712 extern void otf_read_math(FILE *ttf,struct ttfinfo *info);
713 extern void otf_read_math_used(FILE *ttf,struct ttfinfo *info);
714 extern void GuessNamesFromMATH(FILE *ttf,struct ttfinfo *info);
716 /* Parsing advanced typography */
717 extern void readttfkerns(FILE *ttf,struct ttfinfo *info);
718 extern void readttfgsubUsed(FILE *ttf,struct ttfinfo *info);
719 extern void GuessNamesFromGSUB(FILE *ttf,struct ttfinfo *info);
720 extern void readttfgpossub(FILE *ttf,struct ttfinfo *info,int gpos);
721 extern void readttfgdef(FILE *ttf,struct ttfinfo *info);
722 extern void readttfbase(FILE *ttf,struct ttfinfo *info);
724 extern struct otfname *FindAllLangEntries(FILE *ttf, struct ttfinfo *info, int id );
726 /* Known font parameters for 'TeX ' table (fontdims, spacing params, whatever you want to call them) */
727 /* Used by all fonts */
728 #define TeX_Slant CHR('S','l','n','t')
729 #define TeX_Space CHR('S','p','a','c')
730 #define TeX_Stretch CHR('S','t','r','e')
731 #define TeX_Shrink CHR('S','h','n','k')
732 #define TeX_XHeight CHR('X','H','g','t')
733 #define TeX_Quad CHR('Q','u','a','d')
734 /* Used by text fonts */
735 #define TeX_ExtraSp CHR('E','x','S','p')
736 /* Used by all math fonts */
737 #define TeX_MathSp CHR('M','t','S','p')
738 /* Used by math fonts */
739 #define TeX_Num1 CHR('N','u','m','1')
740 #define TeX_Num2 CHR('N','u','m','2')
741 #define TeX_Num3 CHR('N','u','m','3')
742 #define TeX_Denom1 CHR('D','n','m','1')
743 #define TeX_Denom2 CHR('D','n','m','2')
744 #define TeX_Sup1 CHR('S','u','p','1')
745 #define TeX_Sup2 CHR('S','u','p','2')
746 #define TeX_Sup3 CHR('S','u','p','3')
747 #define TeX_Sub1 CHR('S','u','b','1')
748 #define TeX_Sub2 CHR('S','u','b','2')
749 #define TeX_SupDrop CHR('S','p','D','p')
750 #define TeX_SubDrop CHR('S','b','D','p')
751 #define TeX_Delim1 CHR('D','l','m','1')
752 #define TeX_Delim2 CHR('D','l','m','2')
753 #define TeX_AxisHeight CHR('A','x','H','t')
754 /* Used by math extension fonts */
755 #define TeX_DefRuleThick CHR('R','l','T','k')
756 #define TeX_BigOpSpace1 CHR('B','O','S','1')
757 #define TeX_BigOpSpace2 CHR('B','O','S','2')
758 #define TeX_BigOpSpace3 CHR('B','O','S','3')
759 #define TeX_BigOpSpace4 CHR('B','O','S','4')
760 #define TeX_BigOpSpace5 CHR('B','O','S','5')
762 extern void SFDummyUpCIDs(struct glyphinfo *gi,SplineFont *sf);