#ifndef METRICS_H #define METRICS_H #define ONOFFSIZE(n) ((((n+7)/8)+sizeof(long)-1)/sizeof(long)*sizeof(long)) #define OnCurve(arr, n) !((arr[(USHORT)(n)>>5]) & (ULONG)(1UL<<((USHORT)(n) % 32UL))) #define SetOffPoint(arr, n) arr[(unsigned)(n)/sizeof(arr[0])/8] |= \ 1UL<<((unsigned)(n) % (sizeof(arr[0])*8)) #define SetOnPoint(arr, n) arr[(unsigned)(n)/sizeof(arr[0])/8] &= \ ~(1UL<<((unsigned)(n) % (sizeof(arr[0])*8UL))) #define USEMETRICS 0 #define DEFAULTMETRICS 1 #define F8D8 256 #define MAXSNAP (USHORT)12 #define MAXBLUE (USHORT)20 #define UNDEF_CVT 0 #define ENDOFPATH -1 #define NORANGE -2 #define ARGSIZE 2000 #define PGMSIZE 3000 #define DEFAULTMATRIX NULL #define F16D16BASE (1L<<19L) #define F16D16HALF (1L<<18L) #define F16D16PPM 524 typedef int funit; typedef struct { funit x; funit y; } Point; typedef struct Outline { struct Outline *next; /* Next path of the glyph. */ USHORT count; /* Number of 'pts', 'onoff' and 'map'. */ Point *pts; /* X/Y coordinates. */ ULONG *onoff; /* On/Off curve point bit flags. */ } Outline; typedef struct StemS { struct StemS *next; funit offset; funit width; short i1; short i2; } Stem; typedef struct Stem3S { struct Stem3S *next; Stem stem1; Stem stem2; Stem stem3; } Stem3; typedef struct FlexS { struct FlexS *next; funit civ; Point pos; Point midpos; Point startpos; USHORT start; USHORT mid; USHORT end; } Flex; typedef struct { Stem *vstems; Stem *hstems; Stem3 *vstems3; Stem3 *hstems3; Flex *flex; } Hints; typedef struct Composite { struct Composite *next; funit asbx; funit aw; funit adx; funit ady; const char *achar; const char *bchar; char *cchar; struct encoding *oenc; } Composite; typedef struct T1Glyph { char *name; Point lsb; Point width; Outline *paths; Hints hints; } T1Glyph; typedef struct StemWidth { funit width; USHORT storage; } StemWidth; typedef struct WeightControl { StemWidth *vwidths; USHORT cnt_vw; USHORT max_vw; StemWidth *hwidths; USHORT cnt_hw; USHORT max_hw; USHORT storage; } WeightControl; struct CVTPos { funit y; USHORT cvt; }; typedef struct StemPos { struct CVTPos *pos; USHORT cnt; USHORT blue_cvt; } StemPos; typedef struct AlignmentControl { StemPos top[MAXBLUE/2]; StemPos bottom[MAXBLUE/2]; USHORT cvt; } AlignmentControl; typedef struct Blues { funit bluevalues[MAXBLUE]; USHORT blue_cnt; funit otherblues[MAXBLUE]; USHORT oblue_cnt; funit familyblues[MAXBLUE]; USHORT family_cvt[MAXBLUE/2]; USHORT fblue_cnt; funit familyotherblues[MAXBLUE]; USHORT familyother_cvt[MAXBLUE/2]; USHORT foblue_cnt; short blueShift; /* /BlueShift * F8D8 */ UBYTE blueFuzz; UBYTE blueScale; /* /BlueScale * 1000 */ AlignmentControl align; } Blues; struct kerning { UBYTE left; UBYTE right; funit delta; }; struct T1Metrics { char *date; char *copyright; char *name; char *id; char *notice; char *fullname; char *weight; char *family; struct { USHORT ver; USHORT rev; } version; f16d16 angle; funit avgCharWidth; funit underline; funit uthick; funit stdhw; funit stdvw; funit defstdhw; funit defstdvw; funit stemsnaph[MAXSNAP]; USHORT snaph_cnt; funit stemsnapv[MAXSNAP]; USHORT snapv_cnt; UBYTE forcebold; UBYTE pitchfam; USHORT fixedPitch; USHORT flags; USHORT tmweight; funit ascent; funit descent; funit intLeading; funit extLeading; funit superoff; funit supersize; funit suboff; funit subsize; funit strikeoff; funit strikesize; UBYTE firstChar; UBYTE lastChar; UBYTE DefaultChar; UBYTE BreakChar; UBYTE CharSet; funit *widths; /* Advance widths. */ struct kerning *kerns; USHORT kernsize; WeightControl stems; Blues blues; funit upem; f16d16 *fmatrix; UBYTE pgm[PGMSIZE]; short args[ARGSIZE]; struct encoding *encoding; USHORT encSize; Composite *seac; Composite *used_seac; }; /****** MACROS */ #define GetUPEM(t1m) (t1m->upem) #define GetFontMatrix(t1m) (t1m->fmatrix) #define GetStdVW(t1m) (t1m->stdvw) #define GetStdHW(t1m) (t1m->stdhw) #define GetDefStdVW(t1m) (t1m->defstdvw) #define GetDefStdHW(t1m) (t1m->defstdhw) #define SetDefStdVW(t1m, width) t1m->defstdvw = width #define SetDefStdHW(t1m, width) t1m->defstdhw = width #define GetCodeStack(t1m) t1m->pgm #define GetArgStack(t1m) t1m->args #define GetWeight(t1m) &(t1m->stems) #define ForceBold(t1m) t1m->forcebold #define GetAlignment(t1m) &(t1m->blues.align) #define GetBlues(t1m) &(t1m->blues) #define CurrentEncoding(t1m) t1m->encoding #define EncodingSize(t1m) t1m->encSize #define Composites(t1m) t1m->seac #define SyntheticOblique(t1m) (t1m->fmatrix && t1m->fmatrix[2]) #endif