#define RAD(x)  ((x)*PI_180)
#define DEG(x)  ((x)/PI_180)
#define ARCSECONDS_PER_RADIAN   (DEG(1)*3600)
#define input_nybble(infile)    input_nbits(infile,4)

typedef float   Angle;  /* in radians */

enum
{
       /*
        * parameters for plate
        */
       Pppo1   = 0,
       Pppo2,
       Pppo3,
       Pppo4,
       Pppo5,
       Pppo6,
       Pamdx1,
       Pamdx2,
       Pamdx3,
       Pamdx4,
       Pamdx5,
       Pamdx6,
       Pamdx7,
       Pamdx8,
       Pamdx9,
       Pamdx10,
       Pamdx11,
       Pamdx12,
       Pamdx13,
       Pamdx14,
       Pamdx15,
       Pamdx16,
       Pamdx17,
       Pamdx18,
       Pamdx19,
       Pamdx20,
       Pamdy1,
       Pamdy2,
       Pamdy3,
       Pamdy4,
       Pamdy5,
       Pamdy6,
       Pamdy7,
       Pamdy8,
       Pamdy9,
       Pamdy10,
       Pamdy11,
       Pamdy12,
       Pamdy13,
       Pamdy14,
       Pamdy15,
       Pamdy16,
       Pamdy17,
       Pamdy18,
       Pamdy19,
       Pamdy20,
       Ppltscale,
       Pxpixelsz,
       Pypixelsz,
       Ppltra,
       Ppltrah,
       Ppltram,
       Ppltras,
       Ppltdec,
       Ppltdecd,
       Ppltdecm,
       Ppltdecs,
       Pnparam,
};

typedef struct  Plate   Plate;
struct  Plate
{
       char    rgn[7];
       char    disk;
       Angle   ra;
       Angle   dec;
};

typedef struct  Header  Header;
struct  Header
{
       float   param[Pnparam];
       int     amdflag;

       float   x;
       float   y;
       float   xi;
       float   eta;
};
typedef long    Type;

typedef struct  Image   Image;
struct  Image
{
       int     nx;
       int     ny;     /* ny is the fast-varying dimension */
       Type    a[1];
};

int     nplate;
Plate   plate[2000];            /* needs to go to 2000 when the north comes */
double  PI_180;
double  TWOPI;
int     debug;
struct
{
       float   min;
       float   max;
       float   del;
       double  gamma;
       int     neg;
} gam;

char*   hms(Angle);
char*   dms(Angle);
double  xsqrt(double);
Angle   dist(Angle, Angle, Angle, Angle);
Header* getheader(char*);
char*   getword(char*, char*);
void    amdinv(Header*, Angle, Angle, float, float);
void    ppoinv(Header*, Angle, Angle);
void    xypos(Header*, Angle, Angle, float, float);
void    traneqstd(Header*, Angle, Angle);
Angle   getra(char*);
Angle   getdec(char*);
void    getplates(void);

Image*  dssread(char*);
void    hinv(Type*, int, int);
int     input_bit(Biobuf*);
int     input_nbits(Biobuf*, int);
void    qtree_decode(Biobuf*, Type*, int, int, int, int);
void    start_inputing_bits(void);
Bitmap* image(Angle, Angle, Angle, Angle);
int     dogamma(int);