initial revision
[swftools.git] / pdf2swf / ttf2pt1 / pt1.h
diff --git a/pdf2swf/ttf2pt1/pt1.h b/pdf2swf/ttf2pt1/pt1.h
new file mode 100644 (file)
index 0000000..7540531
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+ * see COPYRIGHT
+ */
+
+
+/* glyph entry, one drawing command */
+typedef struct gentry {
+       /* this list links all GENTRYs of a GLYPH sequentially */
+       struct gentry  *next;   /* double linked list */
+       struct gentry  *prev;
+
+       /* this list links all GENTRYs of one contour - 
+        * of types GE_LINE and GE_CURVE only
+        * bkwd is also reused: in the very first entry (normally
+        * of type GE_MOVE) it points to g->entries
+        */
+       struct gentry  *cntr[2]; /* double-linked circular list */
+/* convenience handles */
+#define bkwd cntr[0]
+#define frwd cntr[1]
+
+       union {
+               struct {
+                       int  val[2][3]; /* integer values */
+               } i;
+               struct {
+                       double  val[2][3];      /* floating values */
+               } f;
+       } points; /* absolute values, NOT deltas */
+/* convenience handles */
+#define ipoints        points.i.val
+#define fpoints        points.f.val
+#define ixn ipoints[0]
+#define iyn ipoints[1]
+#define fxn fpoints[0]
+#define fyn fpoints[1]
+#define ix1    ixn[0]
+#define ix2 ixn[1]
+#define ix3 ixn[2]
+#define iy1    iyn[0]
+#define iy2 iyn[1]
+#define iy3 iyn[2]
+#define fx1    fxn[0]
+#define fx2 fxn[1]
+#define fx3 fxn[2]
+#define fy1    fyn[0]
+#define fy2 fyn[1]
+#define fy3 fyn[2]
+
+       char            flags; 
+#define GEF_FLOAT      0x02 /* entry contains floating point data */
+
+       unsigned char   dir; /* used to temporarily store the values for
+                               * the directions of the ends of curves */
+/* front end */
+#define CVDIR_FUP      0x02    /* goes over the line connecting the ends */
+#define CVDIR_FEQUAL   0x01    /* coincides with the line connecting the
+                                * ends */
+#define CVDIR_FDOWN    0x00    /* goes under the line connecting the ends */
+#define CVDIR_FRONT    0x0F    /* mask of all front directions */
+/* rear end */
+#define CVDIR_RSAME    0x30    /* is the same as for the front end */
+#define CVDIR_RUP      0x20    /* goes over the line connecting the ends */
+#define CVDIR_REQUAL   0x10    /* coincides with the line connecting the
+                                * ends */
+#define CVDIR_RDOWN    0x00    /* goes under the line connecting the ends */
+#define CVDIR_REAR     0xF0    /* mask of all rear directions */
+
+       signed char     stemid; /* connection to the substituted stem group */
+       char            type;
+#define GE_HSBW        'B'
+#define GE_MOVE 'M'
+#define GE_LINE 'L'
+#define GE_CURVE 'C'
+#define GE_PATH 'P'
+}               GENTRY;
+
+/* stem structure, describes one [hv]stem  */
+/* acually, it describes one border of a stem */
+/* the whole stem is a pair of these structures */
+
+typedef struct stem {
+       short           value;  /* value of X or Y coordinate */
+       short           origin; /* point of origin for curve stems */
+       GENTRY         *ge; /* entry that has (value, origin) as its first dot */
+               /* also for all the stems the couple (value, origin)
+                * is used to determine whether a stem is relevant for a
+                * line, it's considered revelant if this tuple is
+                * equal to any of the ends of the line.
+                * ge is also used to resolve ambiguity if there is more than
+                * one line going through certain pointi, it is used to 
+                * distinguish these lines.
+                */
+        
+       short           from, to;       /* values of other coordinate between
+                                        * which this stem is valid */
+
+       short           flags;
+       /* ordering of ST_END, ST_FLAT, ST_ZONE is IMPORTANT for sorting */
+#define ST_END         0x01    /* end of line, lowest priority */
+#define ST_FLAT                0x02    /* stem is defined by a flat line, not a
+                                * curve */
+#define ST_ZONE                0x04    /* pseudo-stem, the limit of a blue zone */
+#define ST_UP          0x08    /* the black area is to up or right from
+                                * value */
+#define ST_3           0x20    /* first stem of [hv]stem3 */
+#define ST_BLUE                0x40    /* stem is in blue zone */
+#define ST_TOPZONE     0x80    /* 1 - top zone, 0 - bottom zone */
+#define ST_VERT     0x100      /* vertical stem (used in substitutions) */
+}               STEM;
+
+#define MAX_STEMS      2000    /* we can't have more stems than path
+                                * elements (or hope so) */
+#define NSTEMGRP       50      /* maximal number of the substituted stem groups */
+
+/* structure for economical representation of the
+ * substituted stems
+ */
+
+typedef struct stembounds {
+       short low; /* low bound */
+       short high; /* high bound */
+       char isvert; /* 1 - vertical, 0 - horizontal */
+       char already; /* temp. flag: is aleready included */
+} STEMBOUNDS;
+
+struct kern {
+       unsigned id; /* ID of the second glyph */
+       int val; /* kerning value */
+};
+
+typedef struct contour {
+       short           ymin, xofmin;
+       short           inside; /* inside which contour */
+       char            direction;
+#define DIR_OUTER 1
+#define DIR_INNER 0
+}               CONTOUR;
+
+typedef struct glyph {
+       int             char_no;/* Encoding of glyph */
+       int             orig_code;/* code of glyph in the font's original encoding */
+       char           *name;   /* Postscript name of glyph */
+       int             xMin, yMin, xMax, yMax; /* values from TTF dictionary */
+       int             lsb; /* left sidebearing */
+       int             ttf_pathlen; /* total length of TTF paths */
+       short           width;
+       short           flags;
+#define GF_USED        0x0001          /* whether is this glyph used in T1 font */
+#define GF_FLOAT 0x0002                /* thys glyph contains floating point entries */
+
+       GENTRY         *entries;/* doube linked list of entries */
+       GENTRY         *lastentry;      /* the last inserted entry */
+       GENTRY         *path;   /* beggining of the last path */
+       int             oldwidth; /* actually also scaled */
+       int             scaledwidth;
+#define        MAXLEGALWIDTH   10000 
+
+       struct kern    *kern; /* kerning data */
+       int             kerncount; /* number of kerning pairs */
+       int             kernalloc; /* for how many pairs we have space */
+
+       STEM           *hstems; /* global horiz. and vert. stems */
+       STEM           *vstems;
+       int             nhs, nvs;       /* numbers of stems */
+
+       STEMBOUNDS     *sbstems; /* substituted stems for all the groups */
+       short          *nsbs; /* indexes of the group ends in the common array */
+       int             nsg; /* actual number of the stem groups */
+       int             firstsubr; /* first substistuted stems subroutine number */
+
+       CONTOUR        *contours;       /* it is not used now */
+       int             ncontours;
+
+       int             rymin, rymax;   /* real values */
+       /* do we have flat surfaces on top/bottom */
+       char            flatymin, flatymax;
+
+}               GLYPH;
+
+extern int      stdhw, stdvw;  /* dominant stems widths */
+extern int      stemsnaph[12], stemsnapv[12];  /* most typical stem width */
+
+extern int      bluevalues[14];
+extern int      nblues;
+extern int      otherblues[10];
+extern int      notherb;
+extern int      bbox[4];       /* the FontBBox array */
+extern double   italic_angle;
+
+extern GLYPH   *glyph_list;
+extern int    encoding[];      /* inverse of glyph[].char_no */
+
+/* prototypes of functions */
+void rmoveto( int dx, int dy);
+void rlineto( int dx, int dy);
+void rrcurveto( int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
+void assertpath( GENTRY * from, char *file, int line, char *name);
+
+void fg_rmoveto( GLYPH * g, double x, double y);
+void ig_rmoveto( GLYPH * g, int x, int y);
+void fg_rlineto( GLYPH * g, double x, double y);
+void ig_rlineto( GLYPH * g, int x, int y);
+void fg_rrcurveto( GLYPH * g, double x1, double y1,
+       double x2, double y2, double x3, double y3);
+void ig_rrcurveto( GLYPH * g, int x1, int y1,
+       int x2, int y2, int x3, int y3);
+void g_closepath( GLYPH * g);
+
+void pathtoint( GLYPH *g);
+void ffixquadrants( GLYPH *g);
+void flattencurves( GLYPH * g);
+int checkcv( GENTRY * ge, int dx, int dy);
+void iclosepaths( GLYPH * g);
+void fclosepaths( GLYPH * g);
+void smoothjoints( GLYPH * g);
+void buildstems( GLYPH * g);
+void fstraighten( GLYPH * g);
+void istraighten( GLYPH * g, int zigonly);
+void isplitzigzags( GLYPH * g);
+void fsplitzigzags( GLYPH * g);
+void fforceconcise( GLYPH * g);
+void iforceconcise( GLYPH * g);
+void reversepathsfromto( GENTRY * from, GENTRY * to);
+void reversepaths( GLYPH * g);
+void dumppaths( GLYPH * g, GENTRY *start, GENTRY *end);
+void print_glyph( int glyphno);
+int print_glyph_subs( int glyphno, int startid);
+void print_glyph_metrics( int code, int glyphno);
+void findblues(void);
+void stemstatistics(void);
+void docorrectwidth(void);
+void addkernpair( unsigned id1, unsigned id2, int unscval);
+void print_kerning( FILE *afm_file);