
/*
*               TeX Device Driver DVIOUT, DVIPRT で
*               書体倶楽部のアウトラインフォントを使う
*
*                            vraster.h
*
*     "本プログラムは、向内さんの書かれた dvii という dvi ドライバの
*      アウトラインフォント展開アルゴリズムと、ソースコードの大部分を
*      使用しています。"
*
*
*                         1992  by T.Minagawa
*
*       12 Nov 1992 : modified for JGfont(3D-Bezier) by Naochan!
*/

/*******************************************************************
*
*  本展開ルーチンでは、フォントの展開に際し線分データを全てメモリに
*  保持する。線分データは Line の配列に格納する。以下では int x 8
*  (16byte) の構造にしてある。途中の計算を簡素化するため、オリジナル
*  に dx, dy を加え、かつ x,y は線分の引かれる方向に関係無く、座標値
*  の大小で格納するように変更した。線分の方向は、Line の flag を拡張
*  して保存できるようにしてある。
*
*  書体倶楽部のフォントは、左上を原点とする最大 1024 x 1024 の xy座
*  標系で記述されている。(xl <= xr)、(yu <= yl)
*
*  メモリアライメントの関係(?)からか、4 byte 増やして16byteの構造体に
*  変更したことにより処理が高速化した。構造を変えるときは要注意 !!!
*/
#define Line struct v_line
struct v_line {
	int xl, xr, dx;	/* 線分の水平方向データ */
	int yu, yl, dy;	/* 線分の垂直方向データ */
	int flag;	/* 線分の種類、方向を示す */
	int itemno;	/* 線分のアイテム番号 */
};

/* itemno アイテム番号は、関数 setflag まではその線分が何番目の閉曲
*  線に属するかを示し、それ以降はフォントの中の何番目の部品に属する
*  かを示す。部品とは、例えば "二" であれば上の線が 1, 下の線が 2 に
*  なる。ただし筆記上 2本以上の線でも、ベクトルデータ上は分割されず
*  つながっているものも多い。
*/

/***********************************
     Line の flag に入る値
***********************************/
#define HORILINE	1	/* 水平線 */
#define VERTLINE	2	/* 垂直線 */
#define HOPEN		4	/* 左から数えて奇数番目の線 /*
						/* この線を右に寄せると展開 */
/* されるフォントは細くなる */
#define HCLOSE		8	/* 左から偶数番目の線   */
/* 左に寄せると細くなる */
#define VOPEN		16	/* 上から奇数番目の線   */
/* 下に寄せると細くなる */
#define VCLOSE		32	/* 上から偶数番目の線   */
/* 上に寄せると細くなる */
#define FMASK		63	/* 下位6bitだけを評価す */
/* るためのマスク       */
#define XREV		64	/* x方向を入れ換え      */
#define YREV		128	/* y方向を入れ換え      */
#define XYREV		256	/* xy 両方入れ換え      */

/* rasterexpand をコールするときのパラメータテーブル    */
/* 展開作業で、グローバル変数を減らすため、必要なものは */
/* 全て入っている。                                     */

#define VPARA_TBL struct _vpara_tbl
struct _vpara_tbl {
	BUFFER *buffer;	/* ビットマップフォントのバッファ */
	BUFFER *v_font_name;	/* 使用するベクトルフォント名 */
	int vfn_file;	/* フォントファイルのハンドル */
	int char_code;	/* 展開するフォントのコード */
	int v_code;	/* ベクトルフォント内でのコード */
	int max_width, max_height;	/* ベクトル座標系の最大値 */
	int width, height, yoffset;	/* 展開するドットサイズ */
	int long_wide, slant, turn;	/* 展開パラメータ */
	int thin, xfat, yfat;	/* 展開パラメータ */
#ifdef BEZIERFONT
	int font_type;	/* フォントの種類 (ZS_FONT, JG_FONT) */
#endif
#ifdef VFTOBM
	int width_adj	/* 展開パラメータ */
	int height_adj;	/* 展開パラメータ */
#endif
	int rotation;	/* 展開パラメータ */
	DRAW_TYPE dtype;	/* 展開方法 */
};

/* ベクトルフォント展開作業用変数テ−ブル */
#define VWORK_TBL struct _vwork_tbl
struct _vwork_tbl {
	int _xdot, _ydot;	/* 実際に展開するドット数 */
	int xdotwidth, ydotwidth;	/* 1dot あたりの座標値 */
	int xthin, ythin;	/* 最も細い線の太さ */
	int _xoffset;	/* x方向オフセット */
};

/************************************************
      水平線、垂直線として処理するしきい値
      値の大きさの意味は不明
*************************************************/
#define	XTHICKLINEWIDTHDOUBLE	100	/* 大体の値	*/
#define	YTHICKLINEWIDTHDOUBLE	60

#define TIMES	256L	/* 計算の精度向上のためのファクター */
#define NOHV	(1024L*TIMES)	/* xthin, ythin を求める際の最大値 */
#define TAKENEAR	TRUE	/* ------------------	*/
#define HOVER		100
#define VOVER		100
#define SQFLAG		15
#define Y_BASE		34
#define STD_CODE	0x3021
#define MIN_LINE 64

/* マクロ         */
/* 中点をもとめる */
#define CENTER(a,b)		(((a)+(b))>>1)

/*#define _Setflag struct _setflag far*/
#define _Setflag struct _setflag
struct _setflag {
	long v;
	Line *lp;
};

enum _sflag {
	LEFT, RIGHT, NEAR
};

#define	mxlscaling(x)	((int) (((long) (x)*_xdot + 0x200)/tbl1->max_width))
#define	mxrscaling(x)	((int) (((long) (x)*_xdot - 0x1ff)/tbl1->max_width))
