/*
*               TeX Device Driver DVIOUT, DVIPRT で
*               MS Windows の TrueType font を使う
*
*                            ttfont.h
*
*                    14 Nov. 1993  by I.Matsuda
*/

/*
 *  .tti file header
 */
typedef struct {
	uint CodeTable;			/* JIS -> Glyph Index 変換テーブル
							   の先頭アドレス */
	uint MaxJIS;			/* JIS (区コード) の最大値 */
	uint unitsPerEm;		/* 座標データの精度 */
	int xMin;				/* 座標データ(x)の最小値 (原点) */
	int yMin;				/* 座標データ(y)の最小値 (原点) */
	uint maxPoints;			/* １文字に含まれる最大の制御点数 */
	uint maxContours;		/* １文字に含まれる最大の輪郭線数 */
	ulong IndexBase;		/* Glyph Index -> Offset 変換テーブル
							   の先頭アドレス */
	ulong GlyphBase;		/* Glyph データの先頭アドレス */
} TT_INFO;

/*
 *  欧文 TT font の各種情報
 */
#if	0
typedef struct {
	uchar unitsPerEm[2];		/* 座標データの精度 */
	uchar CmapBase[4];			/* Char -> Glyph Index   変換テーブルの先頭 */
	uchar IndexBase0[4];		/* Glyph Index -> Offset 変換テーブルの先頭 */
	uchar IndexBase[4];			/* Glyph Index -> Offset 変換テーブルの先頭 */
	uchar GlyphBase[4];			/* Glyph データの先頭 */
	uchar HmtxBase[4];			/* 水平メトリクステーブルの先頭 */
	uchar numOfHMetrics[2];		/* Number of hMetrtic entries in 'hmtx' */
	uchar C2IndexFormat[2];		/* cmap -> index テーブルのフォーマット */
	uchar FirstCode[2];			/* First character code of subrange */
	uchar EntryCount[2];		/* Number of character codes in subrange */
	uchar indexToLocFormat[2];	/* index -> glyph テーブルのフォーマット */
	uchar xMin[2];				/* 座標データ(x)の最小値 (原点) */
	uchar yMin[2];				/* 座標データ(y)の最小値 (原点) */
	uchar xMax[2];				/* 座標データ(x)の最大値 */
	uchar yMax[2];				/* 座標データ(y)の最大値 */
	uchar f_have_tfm[2];		/* 対応する tfm が存在するか? */
	uchar f_type [2];			/* コード型  */
} CMTT_INFO;
#else
typedef struct {
	uint unitsPerEm;		/* 座標データの精度 */
	ulong CmapBase0;		/* Char -> Glyph Index   変換テーブルの先頭 */
	ulong CmapBase;			/* Char -> Glyph Index   変換テーブルの先頭 */
	ulong IndexBase;		/* Glyph Index -> Offset 変換テーブルの先頭 */
	ulong GlyphBase;		/* Glyph データの先頭 */
	ulong HmtxBase;			/* 水平メトリクステーブルの先頭 */
	uint numOfHMetrics;		/* Number of hMetrtic entries in 'hmtx' */
	uint C2IndexFormat;		/* cmap -> index テーブルのフォーマット */
	uint FirstCode;			/* First character code of subrange */
	uint EntryCount;		/* Number of character codes in subrange */
	uint indexToLocFormat;	/* index -> glyph テーブルのフォーマット */
	int xMin;				/* 座標データ(x)の最小値 (原点) */
	int yMin;				/* 座標データ(y)の最小値 (原点) */
	int xMax;				/* 座標データ(x)の最大値 */
	int yMax;				/* 座標データ(y)の最大値 */
	int f_have_tfm;			/* 対応する tfm が存在するか? */
	int f_type;				/* コード型
						    f_type &  1 = 0  Use 2 byte table (Format 4)
                                          1  Use 1 byte table (Format 0)
                            f_type & 14 = 0  BoKoMa translation
                                          2  Simple translation
                                          4  Symbol translation
							f_type > 256     Code Page
							*/
} CMTT_INFO;
#endif

/*
 *  グリフデータを保持する構造体
 */
typedef struct {
	uint *end_pts;		/* 各輪郭の終点リスト */
	uchar *flist;		/* 制御点のフラグ情報 */
	int *xlist;			/* x 座標 */
	int *ylist;			/* y 座標 */
	int num_cts;			/* 輪郭線の数 */
	int num_pts;			/* 制御点の数 */
	int cp;					/* 輪郭線のポインタ */
	int cc;					/* 制御点のポインタ */
	ulong IndexBase;		/* Glyph Index -> Offset 変換テーブルの先頭 */
	ulong GlyphBase;		/* Glyph データの先頭 */
	uint indexToLocFormat;	/* index -> glyph テーブルのフォーマット */
	uint unitsPerEm;		/* 座標データの精度 */
} GLYPH;

/*
 * UNPACKING Constants
*/
#define ONCURVE             0x01
#define XSHORT              0x02
#define YSHORT              0x04
#define REPEAT_FLAGS        0x08 /* repeat flag n times */
/* IF XSHORT */
#define SHORT_X_IS_POS      0x10 /* the short vector is positive */
/* ELSE */
#define NEXT_X_IS_ZERO      0x10 /* the relative x coordinate is zero */
/* ENDIF */
/* IF YSHORT */
#define SHORT_Y_IS_POS      0x20 /* the short vector is positive */
/* ELSE */
#define NEXT_Y_IS_ZERO      0x20 /* the relative y coordinate is zero */
/* ENDIF */
/* 0x40 & 0x80              RESERVED
** Set to Zero
**
*/
/*
 * Composite glyph constants
 */
#define COMPONENTCTRCOUNT           -1      /* ctrCount == -1 for composite */
#define ARG_1_AND_2_ARE_WORDS       0x0001  /* if set args are words otherwise they are bytes */
#define ARGS_ARE_XY_VALUES          0x0002  /* if set args are xy values, otherwise they are points */
#define ROUND_XY_TO_GRID            0x0004  /* for the xy values if above is true */
#define WE_HAVE_A_SCALE             0x0008  /* Sx = Sy, otherwise scale == 1.0 */
#define NON_OVERLAPPING             0x0010  /* set to same value for all components */
#define MORE_COMPONENTS             0x0020  /* indicates at least one more glyph after this one */
#define WE_HAVE_AN_X_AND_Y_SCALE    0x0040  /* Sx, Sy */
#define WE_HAVE_A_TWO_BY_TWO        0x0080  /* t00, t01, t10, t11 */
#define WE_HAVE_INSTRUCTIONS        0x0100  /* instructions follow */


#define tag_FontHeader			0x68656164		/* 'head' */
#define tag_HoriHeader			0x68686561		/* 'hhea' */
#define tag_HorizontalMetrics	0x686d7478		/* 'hmtx' */
#define tag_IndexToLoc			0x6c6f6361		/* 'loca' */
#define tag_GlyphData			0x676c7966		/* 'glyf' */
#define tag_CharToIndexMap		0x636d6170		/* 'cmap' */
#define tag_NamingTable			0x6e616d65		/* 'name' */

int GetWinTTGlyph(char *, int, struct PREAMBLE_REC *, int);
