#ifndef _EFAXLIB_H
#define _EFAXLIB_H
#include <stdio.h>
#define EFAX_PATH_MAX 1024
#ifndef uchar
#define uchar unsigned char
#endif
#define DEFPGLINES 66
#define MAXRUNS 8192
#define MAXBITS (MAXRUNS/8+1)
#define MAXCODES (MAXRUNS*25/8/2+1)
#define MAXLINELEN 256
#define MAXFONTW 32
#define MAXFONTH 48
#define MAXFONTBUF (MAXFONTW*MAXFONTH/8*256)
#define MAXRUNLEN (2560+63)
#define EOLCODE 1
#define EOLBITS 12
#define RTCEOL 5
#define STDFONTW 8
#define STDFONTH 16
#define STDFONTBUF 4096
typedef struct fontstruct {
int h, w ;
uchar buf [ MAXFONTBUF ] ;
short offset [ 256 ] ;
} faxfont ;
extern uchar stdfont [ ] ;
int readfont ( char *fname, faxfont *font ) ;
typedef struct t4tabstruct {
short code, bits, rlen ;
} t4tab ;
extern t4tab wtab [ ( 64 + 27 + 13 ) + 1 ] ;
extern t4tab btab [ ( 64 + 27 + 13 ) + 1 ] ;
typedef struct dtabstruct {
struct dtabstruct *next ;
short bits, code ;
} dtab ;
#define bigendian ( * (uchar*) &short256 )
extern short short256 ;
#define NIFORMATS 9
#define NOFORMATS 14
#define NPFORMATS 5
enum iformats { I_AUTO=0, I_PBM=1, I_FAX=2, I_TEXT=3, I_TIFF=4,
I_DFAX=5, I_PCX=6, I_RAW=7, I_DCX=8 } ;
#define IFORMATS { "AUTO", "PBM", "FAX", "TEXT", "TIFF", \
"DFAX", "PCX", "RAW", "DCX" } ;
enum oformats { O_AUTO=0, O_PBM=1, O_FAX=2, O_PCL=3, O_PS=4,
O_PGM=5, O_TEXT=6, O_TIFF_FAX=7, O_TIFF_RAW=8, O_DFAX=9,
O_TIFF=10, O_PCX=11, O_PCX_RAW=12, O_DCX=13 } ;
#define OFORMATS { "AUTO", "PBM", "FAX", "PCL", "PS", \
"PGM", "TEXT", "TIFF", "TIFF", "DFAX", \
"TIFF", "PCX", "PCX", "DCX" }
enum pformats { P_RAW=0, P_FAX=1, P_PBM=2, P_TEXT=3, P_PCX=4 } ;
#define PFORMATS { "RAW", "FAX", "PBM", "TEXT", "PCX" }
extern char *iformatname [ NIFORMATS ] ;
extern char *oformatname [ NOFORMATS ] ;
extern char *pformatname [ NPFORMATS ] ;
typedef struct decoderstruct {
long x ;
short shift ;
dtab *tab ;
int eolcnt ;
} DECODER ;
void newDECODER ( DECODER *d ) ;
#define IFILEBUFSIZE 512
#define MAXPAGE 360
typedef struct PAGEstruct {
char *fname ;
long offset ;
int w, h ;
float xres, yres ;
uchar format ;
uchar revbits ;
uchar black_is_zero ;
} PAGE ;
typedef struct ifilestruct {
enum iformats fileformat;
PAGE *page, *lastpage ;
PAGE pages [ MAXPAGE ] ;
long next ;
FILE *f ;
int lines ;
uchar bigend ;
DECODER d ;
faxfont *font ;
int pglines ;
char text [ MAXLINELEN ] ;
int txtlines ;
int charw, charh, lmargin ;
} IFILE ;
int newIFILE ( IFILE *f, char **fname ) ;
void logifnames ( IFILE *f, char *s ) ;
int nextipage ( IFILE *f, int dp ) ;
int lastpage ( IFILE *f ) ;
int readline ( IFILE *f, short *runs, int *pels ) ;
typedef struct encoderstruct {
long x ;
short shift ;
} ENCODER ;
void newENCODER ( ENCODER *e ) ;
typedef struct ofilestruct {
FILE *f ;
int format ;
char *fname ;
float xres, yres ;
int w, h ;
int lastpageno ;
int pslines ;
int bytes ;
ENCODER e ;
char cfname [ EFAX_PATH_MAX + 1 ] ;
} OFILE ;
void newOFILE ( OFILE *f, int format, char *fname,
float xres, float yres, int w, int h ) ;
int nextopage ( OFILE *f, int page ) ;
void writeline ( OFILE *f, short *runs, int nr, int no ) ;
uchar *putcode ( ENCODER *e, short code , short bits , uchar *buf ) ;
uchar *runtocode ( ENCODER *e, short *runs, int nr, uchar *buf ) ;
int texttorun ( uchar *txt, faxfont *font, short line,
int w, int h, int lmargin,
short *runs, int *pels ) ;
int xpad ( short *runs, int nr, int pad ) ;
int xscale ( short *runs, int nr, int xs ) ;
int xshift ( short *runs, int nr, int s ) ;
int runor ( short *a, int na, short *b, int nb, short *c, int *pels ) ;
extern uchar reversebits [ 256 ], normalbits [ 256 ] ;
void initbittab(void) ;
int ckfmt ( char *p, int n ) ;
#endif