diff options
Diffstat (limited to 'Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/edgelist.h')
-rw-r--r-- | Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/edgelist.h | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/edgelist.h b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/edgelist.h new file mode 100644 index 00000000000..ded484f40ff --- /dev/null +++ b/Build/source/texk/web2c/luatexdir/luafontloader/fontforge/fontforge/edgelist.h @@ -0,0 +1,149 @@ +/* Copyright (C) 2000-2008 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 _EDGELIST_H +#define _EDGELIST_H +#include "splinefont.h" + +typedef struct hints { + real base, width; + real b1, b2, e1, e2; + real ab, ae; + unsigned int adjustb: 1; + unsigned int adjuste: 1; + struct hints *next; +} Hints; + +/* Instead of y and x coordinates these are based on major and other */ +/* major maybe either x or y depending on what we're interested in */ +/* at the moment, and other will be the other one. Of course it's */ +/* consistant accross the datastructure at any given time */ +typedef struct edge { + real mmin, mmax; /* relative to es->mmin */ + real t_mmin, t_mmax; + real tmin, tmax; + real o_mmin, o_mmax; + real t_cur, o_cur, m_cur; + unsigned int up: 1; /* line is directed up in the spline list */ + unsigned int max_adjusted: 1; /* by hstem hints */ + unsigned int min_adjusted: 1; + Spline *spline; /* spline which generated this segment */ + struct edge *esnext, *aenext; + struct edge *before, *after; + int last_opos, last_mpos; + real oldt; /* only used for FindIntersections of RemoveOverlap */ +} Edge; + +typedef struct edgelist { + Edge **edges; + int cnt; + real mmin, mmax; + real omin, omax; + real scale; + int bytes_per_line; + uint8 *bitmap; + Edge *last, *splinesetfirst; + SplineChar *sc; + int layer; + char *interesting; + int major, other; + unsigned int genmajoredges: 1; /* generate a list of edges parallel to the major axis */ + Edge *majors; /* ordered so that lowest edge is first */ + Edge *majorhold; /* to hold major edges as we pass them and they become useless */ + Hints *hhints, *vhints; + int is_overlap; + DBounds bbox; /* Not always set. {m,o}{min,max} a provide scaled bbox, this is in glyph units */ +} EdgeList; + +extern void FreeEdges(EdgeList *es); +extern double TOfNextMajor(Edge *e, EdgeList *es, double sought_y ); +extern void FindEdgesSplineSet(SplinePointList *spl, EdgeList *es, int ignore_clip); +extern Edge *ActiveEdgesInsertNew(EdgeList *es, Edge *active,int i); +extern Edge *ActiveEdgesRefigure(EdgeList *es, Edge *active,real i); +extern Edge *ActiveEdgesFindStem(Edge *apt, Edge **prev, real i); + +/* Version which is better for everything other than rasterization */ +/* (I think) */ +typedef struct edgeinfo { + /* The spline is broken up at all extrema. So... */ + /* The spline between tmin and tmax is monotonic in both coordinates */ + /* If the spline becomes vert/horizontal that will be at one of the */ + /* end points too */ + Spline *spline; + real tmin, tmax; + real coordmin[2]; + real coordmax[2]; + unsigned int up: 1; + unsigned int hv: 1; + unsigned int hvbottom: 1; + unsigned int hvtop: 1; + unsigned int hor: 1; + unsigned int vert: 1; + unsigned int almosthor: 1; + unsigned int almostvert: 1; + unsigned int horattmin: 1; + unsigned int horattmax: 1; + unsigned int vertattmin: 1; + unsigned int vertattmax: 1; + unsigned hup: 1; + unsigned vup: 1; + real tcur; /* Value of t for current major coord */ + real ocur; /* Value of the other coord for current major coord */ + struct edgeinfo *next; + struct edgeinfo *ordered; + struct edgeinfo *aenext; + struct edgeinfo *splinenext; + SplineChar *sc; + int major; +} EI; + +typedef struct eilist { + EI *edges; + real coordmin[2]; + real coordmax[2]; + int low, high, cnt; + EI **ordered; + char *ends; /* flag to say an edge ends on this line */ + SplineChar *sc; + int layer; + int major; + EI *splinelast, *splinefirst; + EI **bottoms, **tops; /* Used only be FindNeeded in RemoveOverlap */ + unsigned leavetiny: 1; + enum overlap_type ot; +} EIList; + +extern void ElFreeEI(EIList *el); +extern void ELFindEdges(SplineChar *sc, EIList *el); +extern void ELOrder(EIList *el, int major ); +extern real EITOfNextMajor(EI *e, EIList *el, real sought_m ); +extern int EISameLine(EI *e, EI *n, real i, int major); +extern int EISkipExtremum(EI *e, real i, int major); +extern EI *EIActiveEdgesFindStem(EI *apt, real i, int major); +extern EI *EIActiveListReorder(EI *active,int *change); +extern EI *EIActiveEdgesRefigure(EIList *el, EI *active,real i,int major, + int *_change); +#endif |