beta-0.89.2
[luatex.git] / source / texk / web2c / luatexdir / luafontloader / fontforge / fontforge / stemdb.h
blob83a02842a6a9dc9cefad54391116ca057f0eec29
1 /* Copyright (C) 2005-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.
27 #ifndef _STEMDB_H_
28 # define _STEMDB_H_
30 # include "pfaedit.h"
32 typedef struct glyphdata {
33 SplineFont *sf;
34 BlueData bd;
35 int fuzz;
36 SplineChar *sc;
37 int layer;
38 int emsize;
39 int order2;
40 int has_slant;
41 BasePoint slant_unit;
42 int ccnt;
43 int *contourends;
44 int realcnt; /* Includes control points, excludes implied points */
45 int norefpcnt; /* Does not include points in glyphs with references */
46 int pcnt; /* Includes control points, includes implied points */
47 struct pointdata *points; /* Entries corresponding to control points are empty */
48 int stemcnt;
49 struct stemdata *stems;
50 int linecnt;
51 struct linedata *lines;
52 struct stembundle *hbundle;
53 struct stembundle *vbundle;
54 struct stembundle *ibundle;
56 /* Temporary values, quickly freed */
57 int mcnt;
58 struct monotonic *ms;
59 struct monotonic **space;
60 int scnt;
61 Spline **sspace;
62 struct st *stspace;
63 DBounds size;
64 struct pointdata **pspace;
65 struct segment {
66 double start, end, sbase, ebase;
67 int curved, scurved, ecurved;
68 } *lspace, *rspace, *bothspace, *activespace;
70 int only_hv;
71 } GlyphData;
73 typedef struct pointdata {
74 SplinePoint *sp;
75 SplineSet *ss;
76 int ttfindex; /* normally same as sp->ttfindex, but needed for offcurve points */
77 BasePoint base; /* normally same as sp->me, but needed for offcurve points */
78 BasePoint nextunit, prevunit; /* unit vectors pointing in the next/prev directions */
79 struct linedata *nextline, *prevline; /* any other points lying on approximately the same line */
80 Spline *nextedges[2], *prevedges[2]; /* There should always be a matching spline, which may end up as part of a stem, and may not */
81 Spline *bothedge;
82 double next_e_t[2], prev_e_t[2]; /* Location on other edge where our normal hits it */
83 double both_e_t;
84 int next_e_cnt, prev_e_cnt;
85 double next_dist[2], prev_dist[2]; /* Distance from the point to the matching edge */
86 struct stemdata **nextstems, **prevstems;
87 int *next_is_l, *prev_is_l;
88 int nextcnt, prevcnt;
89 double nextlen, prevlen;
90 int value; /* Temporary value, used to compare points assigned to the same edge and determine which one can be used as a reference point*/
91 unsigned int nextlinear: 1;
92 unsigned int nextzero: 1;
93 unsigned int prevlinear: 1;
94 unsigned int prevzero: 1;
95 unsigned int colinear: 1;
96 unsigned int symetrical_h: 1; /* Are next & prev symetrical? */
97 unsigned int symetrical_v: 1; /* Are next & prev symetrical? */
98 unsigned int next_hor: 1;
99 unsigned int next_ver: 1;
100 unsigned int prev_hor: 1;
101 unsigned int prev_ver: 1;
102 unsigned int ticked: 1;
103 uint8 touched, affected;
104 uint8 x_extr, y_extr;
105 uint8 x_corner, y_corner;
106 BasePoint newpos;
107 BasePoint newnext, newprev;
108 BasePoint posdir; /* If point has been positioned in 1 direction, this is that direction */
109 double projection; /* temporary value */
110 } PointData;
112 typedef struct linedata {
113 BasePoint unit;
114 BasePoint online;
115 uint8 is_left;
116 int pcnt;
117 double length;
118 struct pointdata **points;
119 } LineData;
121 typedef struct stemdata {
122 BasePoint unit; /* Unit vector pointing in direction of stem */
123 BasePoint l_to_r; /* Unit vector pointing from left to right (across stem) */
124 BasePoint left; /* a point on one side of the stem (not necissarily left, even for vertical stems) */
125 BasePoint right; /* and one on the other */
126 BasePoint newunit; /* Unit vector after repositioning (e. g. in Metafont routines) */
127 BasePoint newleft, newright;/* Left and right edges after repositioning */
128 int leftidx, rightidx; /* TTF indices of the left and right key points */
129 struct pointdata *keypts[4];/* Uppest and lowest points on left and right edges. Used for positioning diagonal stems */
130 double lmin, lmax, rmin, rmax;
131 double width;
132 int chunk_cnt; /* number of separate point-pairs on this stem */
133 struct stem_chunk {
134 struct stemdata *parent;
135 struct pointdata *l;
136 struct pointdata *r;
137 uint8 lpotential, rpotential;
138 uint8 lnext, rnext; /* are we using the next/prev side of the left/right points */
139 uint8 ltick, rtick;
140 uint8 stub;
141 uint8 stemcheat; /* It's not a real stem, but it's something we'd like PostScript to hint for us */
142 uint8 is_ball; /* Specifies if this chunk marks the opposite sides of a ball terminal (useful for TTF instructions) */
143 int l_e_idx, r_e_idx; /* Which of the opposed edges assigned to the left and right points corresponds to this chunk */
144 } *chunks;
145 int activecnt;
146 struct segment *active;
147 uint8 toobig; /* Stem is fatter than tall, unlikely to be a real stem */
148 uint8 positioned;
149 uint8 ticked;
150 uint8 ghost;
151 uint8 bbox;
152 uint8 ldone, rdone;
153 uint8 italic;
154 int blue; /* Blue zone a ghost hint is attached to */
155 double len, clen; /* Length of linear segments. clen adds "length" of curved bits */
156 struct stembundle *bundle;
157 int lpcnt, rpcnt; /* Count of points assigned to left and right edges of this stem */
158 struct linedata *leftline, *rightline;
159 struct stemdata *master, *next_c_m, *prev_c_m;
160 int confl_cnt;
161 int dep_cnt;
162 int serif_cnt;
163 struct dependent_stem {
164 struct stemdata *stem;
165 uint8 lbase;
166 char dep_type; /* can be 'a' (align), 'i' (interpolate), 'm' (move) or 's' (serif) */
167 } *dependent; /* Lists other stems dependent from the given stem */
168 struct dependent_serif {
169 struct stemdata *stem;
170 double width; /* The distance from an edge of the main stem to the opposite edge of the serif stem */
171 uint8 lbase;
172 uint8 is_ball;
173 } *serifs; /* Lists serifs and other elements protruding from the base stem */
174 } StemData;
176 typedef struct vchunk {
177 struct stem_chunk *chunk;
178 double dist;
179 int parallel;
180 int value;
181 } VChunk;
183 struct stembounds {
184 struct stembounds *next;
185 struct stemdata *stem;
186 double tstart, tend;
187 uint8 isr;
190 struct splinesteminfo {
191 Spline *s;
192 struct stembounds *sb;
195 typedef struct stembundle {
196 BasePoint unit; /* All these stems are parallel, pointing in unit direction */
197 BasePoint l_to_r; /* Axis along which these stems are ordered (normal to unit) */
198 BasePoint bp; /* Base point for measuring by l_to_r (stem->lpos,rpos) */
199 int cnt; /* Number of stems in the bundle */
200 struct stemdata **stemlist;
201 } StemBundle;
203 extern struct glyphdata *GlyphDataBuild(SplineChar *sc, int layer, BlueData *bd, int use_existing);
204 extern struct glyphdata *GlyphDataInit(SplineChar *sc, int layer, double em_size, int only_hv);
205 extern struct glyphdata *StemInfoToStemData( struct glyphdata *gd,StemInfo *si,int is_v );
206 extern struct glyphdata *DStemInfoToStemData( struct glyphdata *gd,DStemInfo *dsi );
207 extern int IsStemAssignedToPoint( struct pointdata *pd,struct stemdata *stem,int is_next );
208 extern void GlyphDataFree(struct glyphdata *gd);
210 #endif /* _STEMDB_H_ */