diff options
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/stemdb.h')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/stemdb.h | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/stemdb.h b/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/stemdb.h new file mode 100644 index 00000000000..8e47572411f --- /dev/null +++ b/Build/source/texk/dvisvgm/dvisvgm-src/libs/ff-woff/fontforge/stemdb.h @@ -0,0 +1,214 @@ +/* Copyright (C) 2005-2012 by George Williams */ +/* + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + + * The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO + * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef _STEMDB_H_ +# define _STEMDB_H_ + +# include "fontforge.h" + +struct segment { + double start, end, sbase, ebase; + int curved, scurved, ecurved; +}; + +typedef struct glyphdata { + SplineFont *sf; + BlueData bd; + int fuzz; + SplineChar *sc; + int layer; + int emsize; + int order2; + int has_slant; + BasePoint slant_unit; + int ccnt; + int *contourends; + int realcnt; /* Includes control points, excludes implied points */ + int norefpcnt; /* Does not include points in glyphs with references */ + int pcnt; /* Includes control points, includes implied points */ + struct pointdata *points; /* Entries corresponding to control points are empty */ + int stemcnt; + struct stemdata *stems; + int linecnt; + struct linedata *lines; + struct stembundle *hbundle; + struct stembundle *vbundle; + struct stembundle *ibundle; + + /* Temporary values, quickly freed */ + int mcnt; + struct monotonic *ms; + struct monotonic **space; + int scnt; + Spline **sspace; + struct st *stspace; + DBounds size; + struct pointdata **pspace; + struct segment *lspace, *rspace, *bothspace, *activespace; + + int only_hv; +} GlyphData; + +typedef struct pointdata { + SplinePoint *sp; + SplineSet *ss; + int ttfindex; /* normally same as sp->ttfindex, but needed for offcurve points */ + BasePoint base; /* normally same as sp->me, but needed for offcurve points */ + BasePoint nextunit, prevunit; /* unit vectors pointing in the next/prev directions */ + struct linedata *nextline, *prevline; /* any other points lying on approximately the same line */ + Spline *nextedges[2], *prevedges[2]; /* There should always be a matching spline, which may end up as part of a stem, and may not */ + Spline *bothedge; + double next_e_t[2], prev_e_t[2]; /* Location on other edge where our normal hits it */ + double both_e_t; + int next_e_cnt, prev_e_cnt; + double next_dist[2], prev_dist[2]; /* Distance from the point to the matching edge */ + struct stemdata **nextstems, **prevstems; + int *next_is_l, *prev_is_l; + int nextcnt, prevcnt; + double nextlen, prevlen; + int value; /* Temporary value, used to compare points assigned to the same edge and determine which one can be used as a reference point*/ + unsigned int nextlinear: 1; + unsigned int nextzero: 1; + unsigned int prevlinear: 1; + unsigned int prevzero: 1; + unsigned int colinear: 1; + unsigned int symetrical_h: 1; /* Are next & prev symetrical? */ + unsigned int symetrical_v: 1; /* Are next & prev symetrical? */ + unsigned int next_hor: 1; + unsigned int next_ver: 1; + unsigned int prev_hor: 1; + unsigned int prev_ver: 1; + unsigned int ticked: 1; + uint8 touched, affected; + uint8 x_extr, y_extr; + uint8 x_corner, y_corner; + BasePoint newpos; + BasePoint newnext, newprev; + BasePoint posdir; /* If point has been positioned in 1 direction, this is that direction */ + double projection; /* temporary value */ +} PointData; + +typedef struct linedata { + BasePoint unit; + BasePoint online; + uint8 is_left; + int pcnt; + double length; + struct pointdata **points; +} LineData; + +struct stem_chunk { + struct stemdata *parent; + struct pointdata *l; + struct pointdata *r; + uint8 lpotential, rpotential; + uint8 lnext, rnext; /* are we using the next/prev side of the left/right points */ + uint8 ltick, rtick; + uint8 stub; + uint8 stemcheat; /* It's not a real stem, but it's something we'd like PostScript to hint for us */ + uint8 is_ball; /* Specifies if this chunk marks the opposite sides of a ball terminal (useful for TTF instructions) */ + struct stemdata *ball_m; + int l_e_idx, r_e_idx; /* Which of the opposed edges assigned to the left and right points corresponds to this chunk */ +}; + +struct dependent_stem { + struct stemdata *stem; + uint8 lbase; + char dep_type; /* can be 'a' (align), 'i' (interpolate), 'm' (move) or 's' (serif) */ +}; + +struct dependent_serif { + struct stemdata *stem; + double width; /* The distance from an edge of the main stem to the opposite edge of the serif stem */ + uint8 lbase; + uint8 is_ball; +}; + +typedef struct stemdata { + BasePoint unit; /* Unit vector pointing in direction of stem */ + BasePoint l_to_r; /* Unit vector pointing from left to right (across stem) */ + BasePoint left; /* a point on one side of the stem (not necissarily left, even for vertical stems) */ + BasePoint right; /* and one on the other */ + BasePoint newunit; /* Unit vector after repositioning (e. g. in Metafont routines) */ + BasePoint newleft, newright;/* Left and right edges after repositioning */ + int leftidx, rightidx; /* TTF indices of the left and right key points */ + struct pointdata *keypts[4];/* Uppest and lowest points on left and right edges. Used for positioning diagonal stems */ + double lmin, lmax, rmin, rmax; + double width; + int chunk_cnt; /* number of separate point-pairs on this stem */ + struct stem_chunk *chunks; + int activecnt; + struct segment *active; + uint8 toobig; /* Stem is fatter than tall, unlikely to be a real stem */ + uint8 positioned; + uint8 ticked; + uint8 ghost; + uint8 bbox; + uint8 ldone, rdone; + uint8 italic; + int blue; /* Blue zone a ghost hint is attached to */ + double len, clen; /* Length of linear segments. clen adds "length" of curved bits */ + struct stembundle *bundle; + int lpcnt, rpcnt; /* Count of points assigned to left and right edges of this stem */ + struct linedata *leftline, *rightline; + struct stemdata *master, *next_c_m, *prev_c_m; + int confl_cnt; + int dep_cnt; + int serif_cnt; + struct dependent_stem *dependent; /* Lists other stems dependent from the given stem */ + struct dependent_serif *serifs; /* Lists serifs and other elements protruding from the base stem */ +} StemData; + +typedef struct vchunk { + struct stem_chunk *chunk; + double dist; + int parallel; + int value; +} VChunk; + +struct stembounds { + struct stembounds *next; + struct stemdata *stem; + double tstart, tend; + uint8 isr; +}; + +typedef struct stembundle { + BasePoint unit; /* All these stems are parallel, pointing in unit direction */ + BasePoint l_to_r; /* Axis along which these stems are ordered (normal to unit) */ + BasePoint bp; /* Base point for measuring by l_to_r (stem->lpos,rpos) */ + int cnt; /* Number of stems in the bundle */ + struct stemdata **stemlist; +} StemBundle; + +extern struct glyphdata *GlyphDataBuild(SplineChar *sc, int layer, BlueData *bd, int use_existing); +extern struct glyphdata *GlyphDataInit(SplineChar *sc, int layer, double em_size, int only_hv); +extern struct glyphdata *StemInfoToStemData( struct glyphdata *gd,StemInfo *si,int is_v ); +extern struct glyphdata *DStemInfoToStemData( struct glyphdata *gd,DStemInfo *dsi ); +extern int IsStemAssignedToPoint( struct pointdata *pd,struct stemdata *stem,int is_next ); +extern void GlyphDataFree(struct glyphdata *gd); + +#endif /* _STEMDB_H_ */ |