1 /* 2 * see COPYRIGHT 3 */ 4 5 6 /* glyph entry, one drawing command */ 7 typedef struct gentry { 8 /* this list links all GENTRYs of a GLYPH sequentially */ 9 struct gentry *next; /* double linked list */ 10 struct gentry *prev; 11 12 /* this list links all GENTRYs of one contour - 13 * of types GE_LINE and GE_CURVE only 14 * bkwd is also reused: in the very first entry (normally 15 * of type GE_MOVE) it points to g->entries 16 */ 17 struct gentry *cntr[2]; /* double-linked circular list */ 18 /* convenience handles */ 19 #define bkwd cntr[0] 20 #define frwd cntr[1] 21 22 /* various extended structures used at some stage of transformation */ 23 void *ext; 24 25 union { 26 struct { 27 int val[2][3]; /* integer values */ 28 } i; 29 struct { 30 double val[2][3]; /* floating values */ 31 } f; 32 } points; /* absolute values, NOT deltas */ 33 /* convenience handles */ 34 #define ipoints points.i.val 35 #define fpoints points.f.val 36 #define ixn ipoints[0] 37 #define iyn ipoints[1] 38 #define fxn fpoints[0] 39 #define fyn fpoints[1] 40 #define ix1 ixn[0] 41 #define ix2 ixn[1] 42 #define ix3 ixn[2] 43 #define iy1 iyn[0] 44 #define iy2 iyn[1] 45 #define iy3 iyn[2] 46 #define fx1 fxn[0] 47 #define fx2 fxn[1] 48 #define fx3 fxn[2] 49 #define fy1 fyn[0] 50 #define fy2 fyn[1] 51 #define fy3 fyn[2] 52 53 char flags; 54 #define GEF_FLOAT 0x02 /* entry contains floating point data */ 55 #define GEF_LINE 0x04 /* entry looks like a line even if it's a curve */ 56 57 unsigned char dir; /* used to temporarily store the values for 58 * the directions of the ends of curves */ 59 /* front end */ 60 #define CVDIR_FUP 0x02 /* goes over the line connecting the ends */ 61 #define CVDIR_FEQUAL 0x01 /* coincides with the line connecting the 62 * ends */ 63 #define CVDIR_FDOWN 0x00 /* goes under the line connecting the ends */ 64 #define CVDIR_FRONT 0x0F /* mask of all front directions */ 65 /* rear end */ 66 #define CVDIR_RSAME 0x30 /* is the same as for the front end */ 67 #define CVDIR_RUP 0x20 /* goes over the line connecting the ends */ 68 #define CVDIR_REQUAL 0x10 /* coincides with the line connecting the 69 * ends */ 70 #define CVDIR_RDOWN 0x00 /* goes under the line connecting the ends */ 71 #define CVDIR_REAR 0xF0 /* mask of all rear directions */ 72 73 signed char stemid; /* connection to the substituted stem group */ 74 char type; 75 #define GE_HSBW 'B' 76 #define GE_MOVE 'M' 77 #define GE_LINE 'L' 78 #define GE_CURVE 'C' 79 #define GE_PATH 'P' 80 81 /* indexes of the points to be used for calculation of the tangents */ 82 signed char ftg; /* front tangent */ 83 signed char rtg; /* rear tangent, -1 means "idx 2 of the previous entry" */ 84 } GENTRY; 85 86 /* stem structure, describes one [hv]stem */ 87 /* acually, it describes one border of a stem */ 88 /* the whole stem is a pair of these structures */ 89 90 typedef struct stem { 91 short value; /* value of X or Y coordinate */ 92 short origin; /* point of origin for curve stems */ 93 GENTRY *ge; /* entry that has (value, origin) as its first dot */ 94 /* also for all the stems the couple (value, origin) 95 * is used to determine whether a stem is relevant for a 96 * line, it's considered revelant if this tuple is 97 * equal to any of the ends of the line. 98 * ge is also used to resolve ambiguity if there is more than 99 * one line going through certain pointi, it is used to 100 * distinguish these lines. 101 */ 102 103 short from, to; /* values of other coordinate between 104 * which this stem is valid */ 105 106 short flags; 107 /* ordering of ST_END, ST_FLAT, ST_ZONE is IMPORTANT for sorting */ 108 #define ST_END 0x01 /* end of line, lowest priority */ 109 #define ST_FLAT 0x02 /* stem is defined by a flat line, not a 110 * curve */ 111 #define ST_ZONE 0x04 /* pseudo-stem, the limit of a blue zone */ 112 #define ST_UP 0x08 /* the black area is to up or right from 113 * value */ 114 #define ST_3 0x20 /* first stem of [hv]stem3 */ 115 #define ST_BLUE 0x40 /* stem is in blue zone */ 116 #define ST_TOPZONE 0x80 /* 1 - top zone, 0 - bottom zone */ 117 #define ST_VERT 0x100 /* vertical stem (used in substitutions) */ 118 } STEM; 119 120 #define MAX_STEMS 2000 /* we can't have more stems than path 121 * elements (or hope so) */ 122 #define NSTEMGRP 50 /* maximal number of the substituted stem groups */ 123 124 /* structure for economical representation of the 125 * substituted stems 126 */ 127 128 typedef struct stembounds { 129 short low; /* low bound */ 130 short high; /* high bound */ 131 char isvert; /* 1 - vertical, 0 - horizontal */ 132 char already; /* temp. flag: is aleready included */ 133 } STEMBOUNDS; 134 135 struct kern { 136 unsigned id; /* ID of the second glyph */ 137 int val; /* kerning value */ 138 }; 139 140 typedef struct contour { 141 short ymin, xofmin; 142 short inside; /* inside which contour */ 143 char direction; 144 #define DIR_OUTER 1 145 #define DIR_INNER 0 146 } CONTOUR; 147 148 typedef struct glyph { 149 int char_no;/* Encoding of glyph */ 150 int orig_code;/* code of glyph in the font's original encoding */ 151 char *name; /* Postscript name of glyph */ 152 int xMin, yMin, xMax, yMax; /* values from TTF dictionary */ 153 int lsb; /* left sidebearing */ 154 int ttf_pathlen; /* total length of TTF paths */ 155 short width; 156 short flags; 157 #define GF_USED 0x0001 /* whether is this glyph used in T1 font */ 158 #define GF_FLOAT 0x0002 /* thys glyph contains floating point entries */ 159 160 GENTRY *entries;/* doube linked list of entries */ 161 GENTRY *lastentry; /* the last inserted entry */ 162 GENTRY *path; /* beggining of the last path */ 163 int oldwidth; /* actually also scaled */ 164 int scaledwidth; 165 #define MAXLEGALWIDTH 10000 166 167 struct kern *kern; /* kerning data */ 168 int kerncount; /* number of kerning pairs */ 169 int kernalloc; /* for how many pairs we have space */ 170 171 STEM *hstems; /* global horiz. and vert. stems */ 172 STEM *vstems; 173 int nhs, nvs; /* numbers of stems */ 174 175 STEMBOUNDS *sbstems; /* substituted stems for all the groups */ 176 short *nsbs; /* indexes of the group ends in the common array */ 177 int nsg; /* actual number of the stem groups */ 178 int firstsubr; /* first substistuted stems subroutine number */ 179 180 CONTOUR *contours; /* it is not used now */ 181 int ncontours; 182 183 int rymin, rymax; /* real values */ 184 /* do we have flat surfaces on top/bottom */ 185 char flatymin, flatymax; 186 187 } GLYPH; 188 189 /* description of a dot for calculation of its distance to a curve */ 190 191 struct dot_dist { 192 double p[2 /*X,Y*/]; /* coordinates of a dot */ 193 double dist2; /* squared distance from the dot to the curve */ 194 short seg; /* the closest segment of the curve */ 195 }; 196 197 extern int stdhw, stdvw; /* dominant stems widths */ 198 extern int stemsnaph[12], stemsnapv[12]; /* most typical stem width */ 199 200 extern int bluevalues[14]; 201 extern int nblues; 202 extern int otherblues[10]; 203 extern int notherb; 204 extern int bbox[4]; /* the FontBBox array */ 205 extern double italic_angle; 206 207 extern GLYPH *glyph_list; 208 extern int encoding[]; /* inverse of glyph[].char_no */ 209 210 /* prototypes of functions */ 211 void rmoveto( int dx, int dy); 212 void rlineto( int dx, int dy); 213 void rrcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3); 214 void assertpath( GENTRY * from, char *file, int line, char *name); 215 216 void fg_rmoveto( GLYPH * g, double x, double y); 217 void ig_rmoveto( GLYPH * g, int x, int y); 218 void fg_rlineto( GLYPH * g, double x, double y); 219 void ig_rlineto( GLYPH * g, int x, int y); 220 void fg_rrcurveto( GLYPH * g, double x1, double y1, 221 double x2, double y2, double x3, double y3); 222 void ig_rrcurveto( GLYPH * g, int x1, int y1, 223 int x2, int y2, int x3, int y3); 224 void g_closepath( GLYPH * g); 225 226 void pathtoint( GLYPH *g); 227 void ffixquadrants( GLYPH *g); 228 void flattencurves( GLYPH * g); 229 int checkcv( GENTRY * ge, int dx, int dy); 230 void iclosepaths( GLYPH * g); 231 void fclosepaths( GLYPH * g); 232 void smoothjoints( GLYPH * g); 233 void buildstems( GLYPH * g); 234 void fstraighten( GLYPH * g); 235 void istraighten( GLYPH * g, int zigonly); 236 void isplitzigzags( GLYPH * g); 237 void fsplitzigzags( GLYPH * g); 238 void fforceconcise( GLYPH * g); 239 void iforceconcise( GLYPH * g); 240 void reversepathsfromto( GENTRY * from, GENTRY * to); 241 void reversepaths( GLYPH * g); 242 void dumppaths( GLYPH * g, GENTRY *start, GENTRY *end); 243 void print_glyph( int glyphno); 244 int print_glyph_subs( int glyphno, int startid); 245 void print_glyph_metrics( int code, int glyphno); 246 void findblues(void); 247 void stemstatistics(void); 248 void docorrectwidth(void); 249 void addkernpair( unsigned id1, unsigned id2, int unscval); 250 void print_kerning( FILE *afm_file); 251 252 int fcrossrayscv( double curve[4][2], double *max1, double *max2); 253 int fcrossraysge( GENTRY *ge1, GENTRY *ge2, double *max1, double *max2, 254 double crossdot[2][2]); 255 double fdotsegdist2( double seg[2][2], double dot[2]); 256 double fdotcurvdist2( double curve[4][2], struct dot_dist *dots, int ndots, double *maxp); 257 void fapproxcurve( double cv[4][2], struct dot_dist *dots, int ndots); 258