/*--------------------------------------------------------------------------
                          FAX encoder/decoder
                         --------------------*/

/* Ver 1.2 またはそれ以前と互換にする */
#define	OLD_VERSION		1

/* プログラムのサイズを小さくするオプション */
#define SMALL_DATA		0

/*---------------------------------------------------------------------------
							   FAX decoder
                             --------------*/

/* run length の値は通常 1791 まで可能だが、拡張コードを使って 2623 まで
   のばす */
#define	EXTENDED		0

/* 反対色の run length 0 を挟むことにより、run length の値の制限をなくす */
#define	BIG_DATA		0

/* 元のデータの末尾の次の 1byte の値を保つ */
#define	RECOVER			0

/* 元のデータの先頭が byte 境界から始まらない */
#define	TOP_BIT_SKIP	0

/* fax_writeheader() の mode の設定値 */
#define NORMAL_MODE		0
#define FINE_MODE		1
#define WD_A4			0
#define WD_B4			1

struct fax_header {
	char isfax;
	char resolution;
	char width;
};

#if	OLD_VERSION
void fax_writeheader(FILE *fp, int mode);
#else
void fax_writeheader(struct fax_header *, FILE *);
void fax_checkheader(struct fax_header *, FILE *);
#endif
void fax_writertc(FILE *fp);
size_t fax_encode_line(char *dast, char *src, int left, int right);
size_t fax_encode_tline(char *dast, char *src, int left, int right, int top);


/*---------------------------------------------------------------------------
								FAX encoder
                              ---------------*/

/* BUF_SIZE は、0x1800 以上確保することが望ましい(0x600 に比べて十分大に) */

#define	BUF_SIZE 		0x4000
#define	BUF_READ_SIZE	(BUF_SIZE - 0x600)
#define	BUF_BACK		0x10


/* INTEL CPU で integer が 16bit のとき #define する */

/* #define	INTEL_16 */

/*  Definitions of return values of fax_decode_line() 		*/

#define	TOP_IS_EOL		 0
#define	END_OF_DATA		-1
#define	BAD_DATA		-2
#define	DOUBLE_MAKE		-3
#define	TOO_LONG_LINE	-4
#define	OUT_OF_DATA		-5


struct FAX_POS {
	long pos;		/* 先頭からの位置(byte単位)						*/
	int skip;		/* 現byte中の位置(skip する bit数 --- 0,...,7)	*/
};

int initialize_decode(FILE *fp);
int fax_decode_line(char *dast);
int count_eol(void);
int next_eol(void);
int next_rtc(void);
void get_file_pos(struct FAX_POS *faxpos);
void move_bitget_buf(int move);

/*-------------------------------------------------------------------------*/

#define MAX_A4X			1728
#define MAX_B4X      	2432
#define MAX_A4Y			2290

extern int	MAX_X;
