]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/scat/sky.h
kernel: keep segment locked for data2txt
[plan9front.git] / sys / src / cmd / scat / sky.h
1 #define DIR     "/lib/sky"
2 /*
3  *      This code reflects many years of changes.  There remain residues
4  *              of prior implementations.
5  *
6  *      Keys:
7  *              32 bits long. High 26 bits are encoded as described below.
8  *              Low 6 bits are types:
9  *
10  *              Patch is ~ one square degree of sky.  It points to an otherwise
11  *                      anonymous list of Catalog keys.  The 0th key is special:
12  *                      it contains up to 4 constellation identifiers.
13  *              Catalogs (SAO,NGC,M,...) are:
14  *                      31.........8|76|543210
15  *                        catalog # |BB|catalog name
16  *                      BB is two bits of brightness:
17  *                              00      -inf <  m <=  7
18  *                              01         7 <  m <= 10
19  *                              10        10 <  m <= 13
20  *                              11        13 <  m <  inf
21  *                      The BB field is a dreg, and correct only for SAO and NGC.
22  *                      IC(n) is just NGC(n+7840)
23  *              Others should be self-explanatory.
24  *      
25  *      Records:
26  *
27  *      Star is an SAOrec
28  *      Galaxy, PlanetaryN, OpenCl, GlobularCl, DiffuseN, etc., are NGCrecs.
29  *      Abell is an Abellrec
30  *      The Namedxxx records hold a name and a catalog entry; they result from
31  *              name lookups.
32  */
33
34 typedef enum
35 {
36         Planet,
37         Patch,
38         SAO,
39         NGC,
40         M,
41         Constel_deprecated,
42         Nonstar_deprecated,
43         NamedSAO,
44         NamedNGC,
45         NamedAbell,
46         Abell,
47         /* NGC types */
48         Galaxy,
49         PlanetaryN,
50         OpenCl,
51         GlobularCl,
52         DiffuseN,
53         NebularCl,
54         Asterism,
55         Knot,
56         Triple,
57         Double,
58         Single,
59         Uncertain,
60         Nonexistent,
61         Unknown,
62         PlateDefect,
63         /* internal */
64         NGCN,
65         PatchC,
66         NONGC,
67 }Type;
68
69 enum
70 {
71         /*
72          * parameters for plate
73          */
74         Pppo1   = 0,
75         Pppo2,
76         Pppo3,
77         Pppo4,
78         Pppo5,
79         Pppo6,
80         Pamdx1,
81         Pamdx2,
82         Pamdx3,
83         Pamdx4,
84         Pamdx5,
85         Pamdx6,
86         Pamdx7,
87         Pamdx8,
88         Pamdx9,
89         Pamdx10,
90         Pamdx11,
91         Pamdx12,
92         Pamdx13,
93         Pamdx14,
94         Pamdx15,
95         Pamdx16,
96         Pamdx17,
97         Pamdx18,
98         Pamdx19,
99         Pamdx20,
100         Pamdy1,
101         Pamdy2,
102         Pamdy3,
103         Pamdy4,
104         Pamdy5,
105         Pamdy6,
106         Pamdy7,
107         Pamdy8,
108         Pamdy9,
109         Pamdy10,
110         Pamdy11,
111         Pamdy12,
112         Pamdy13,
113         Pamdy14,
114         Pamdy15,
115         Pamdy16,
116         Pamdy17,
117         Pamdy18,
118         Pamdy19,
119         Pamdy20,
120         Ppltscale,
121         Pxpixelsz,
122         Pypixelsz,
123         Ppltra,
124         Ppltrah,
125         Ppltram,
126         Ppltras,
127         Ppltdec,
128         Ppltdecd,
129         Ppltdecm,
130         Ppltdecs,
131         Pnparam,
132 };
133
134 #define UNKNOWNMAG      32767
135 #define NPlanet                 20
136
137 typedef float   Angle;  /* in radians */
138 typedef long    DAngle; /* on disk: in units of milliarcsec */
139 typedef short   Mag;    /* multiplied by 10 */
140 typedef long    Key;    /* known to be 4 bytes, unfortunately */
141
142 /*
143  * All integers are stored in little-endian order.
144  */
145 typedef struct NGCrec NGCrec;
146 struct NGCrec{
147         DAngle  ra;
148         DAngle  dec;
149         DAngle  dummy1; /* compatibility with old RNGC version */
150         DAngle  diam;
151         Mag     mag;
152         short   ngc;    /* if >NNGC, IC number is ngc-NNGC */
153         char    diamlim;
154         char    type;
155         char    magtype;
156         char    dummy2;
157         char    desc[52];       /* 0-terminated Dreyer description */
158 };
159
160 typedef struct Abellrec Abellrec;
161 struct Abellrec{
162         DAngle  ra;
163         DAngle  dec;
164         DAngle  glat;
165         DAngle  glong;
166         Mag     mag10;  /* mag of 10th brightest cluster member; in same place as ngc.mag*/
167         short   abell;
168         DAngle  rad;
169         short   pop;
170         short   dist;
171         char    distgrp;
172         char    richgrp;
173         char    flag;
174         char    pad;
175 };
176
177 typedef struct Planetrec Planetrec;
178 struct Planetrec{
179         DAngle  ra;
180         DAngle  dec;
181         DAngle  az;
182         DAngle  alt;
183         DAngle  semidiam;
184         double  phase;
185         char            name[16];
186 };
187
188 /*
189  * Star names: 0,0==unused.  Numbers are name[0]=1,..,99.
190  * Greek letters are alpha=101, etc.
191  * Constellations are alphabetical order by abbreviation, and=1, etc.
192  */
193 typedef struct SAOrec SAOrec;
194 struct SAOrec{
195         DAngle  ra;
196         DAngle  dec;
197         DAngle  dra;
198         DAngle  ddec;
199         Mag     mag;            /* visual */
200         Mag     mpg;
201         char    spec[3];
202         char    code;
203         char    compid[2];
204         char    hdcode;
205         char    pad1;
206         long    hd;             /* HD catalog number */
207         char    name[3];        /* name[0]=alpha name[1]=2 name[3]=ori */
208         char    nname;          /* number of prose names */
209         /* 36 bytes to here */
210 };
211
212 typedef struct Mindexrec Mindexrec;
213 struct Mindexrec{       /* code knows the bit patterns in here; this is a long */
214         char    m;              /* M number */
215         char    dummy;
216         short   ngc;
217 };
218
219 typedef struct Bayerec Bayerec;
220 struct Bayerec{
221         long    sao;
222         char    name[3];
223         char    pad;
224 };
225
226 /*
227  * Internal form
228  */
229
230 typedef struct Namedrec Namedrec;
231 struct Namedrec{
232         char    name[36];
233 };
234
235 typedef struct Namerec Namerec;
236 struct Namerec{
237         long    sao;
238         long    ngc;
239         long    abell;
240         char    name[36];       /* null terminated */
241 };
242
243 typedef struct Patchrec Patchrec;
244 struct Patchrec{
245         int     nkey;
246         long    key[60];
247 };
248
249 typedef struct Record Record;
250 struct Record{
251         Type    type;
252         long    index;
253         union{
254                 SAOrec  sao;
255                 NGCrec  ngc;
256                 Abellrec        abell;
257                 Namedrec        named;
258                 Patchrec        patch;
259                 Planetrec       planet;
260                 /* PatchCrec is empty */
261         };
262 };
263
264 typedef struct Name Name;
265 struct Name{
266         char    *name;
267         int     type;
268 };
269
270 typedef struct  Plate   Plate;
271 struct  Plate
272 {
273         char    rgn[7];
274         char    disk;
275         Angle   ra;
276         Angle   dec;
277 };
278
279 typedef struct  Header  Header;
280 struct  Header
281 {
282         float   param[Pnparam];
283         int     amdflag;
284
285         float   x;
286         float   y;
287         float   xi;
288         float   eta;
289 };
290 typedef long    Pix;
291
292 typedef struct  Img Img;
293 struct  Img
294 {
295         int     nx;
296         int     ny;     /* ny is the fast-varying dimension */
297         Pix     a[1];
298 };
299
300 #define RAD(x)  ((x)*PI_180)
301 #define DEG(x)  ((x)/PI_180)
302 #define ARCSECONDS_PER_RADIAN   (DEG(1)*3600)
303 #define MILLIARCSEC     (1000*60*60)
304
305 int     nplate;
306 Plate   plate[2000];            /* needs to go to 2000 when the north comes */
307 double  PI_180;
308 double  TWOPI;
309 double  LN2;
310 int     debug;
311 struct
312 {
313         float   min;
314         float   max;
315         float   gamma;
316         float   absgamma;
317         float   mult1;
318         float   mult2;
319         int     neg;
320 } gam;
321
322 typedef struct Picture Picture;
323 struct Picture
324 {
325         int     minx;
326         int     miny;
327         int     maxx;
328         int     maxy;
329         char    name[16];
330         uchar   *data;
331 };
332
333 typedef struct Image Image;
334
335 extern  double  PI_180;
336 extern  double  TWOPI;
337 extern  char    *progname;
338 extern  char    *desctab[][2];
339 extern  Name    names[];
340 extern  Record  *rec;
341 extern  long            nrec;
342 extern  Planetrec       *planet;
343 /* for bbox: */
344 extern  int             folded;
345 extern  DAngle  ramin;
346 extern  DAngle  ramax;
347 extern  DAngle  decmin;
348 extern  DAngle  decmax;
349 extern  Biobuf  bout;
350
351 extern void saoopen(void);
352 extern void ngcopen(void);
353 extern void patchopen(void);
354 extern void mopen(void);
355 extern void constelopen(void);
356 extern void lowercase(char*);
357 extern void lookup(char*, int);
358 extern int typetab(int);
359 extern char*ngcstring(int);
360 extern char*skip(int, char*);
361 extern void prrec(Record*);
362 extern int equal(char*, char*);
363 extern int parsename(char*);
364 extern void radec(int, int*, int*, int*);
365 extern int btag(short);
366 extern long patcha(Angle, Angle);
367 extern long patch(int, int, int);
368 extern char*hms(Angle);
369 extern char*dms(Angle);
370 extern char*ms(Angle);
371 extern char*hm(Angle);
372 extern char*dm(Angle);
373 extern char*deg(Angle);
374 extern char*hm5(Angle);
375 extern long dangle(Angle);
376 extern Angle angle(DAngle);
377 extern void prdesc(char*, char*(*)[2], short*);
378 extern double   xsqrt(double);
379 extern Angle    dist(Angle, Angle, Angle, Angle);
380 extern Header*  getheader(char*);
381 extern char*    getword(char*, char*);
382 extern void     amdinv(Header*, Angle, Angle, float, float);
383 extern void     ppoinv(Header*, Angle, Angle);
384 extern void     xypos(Header*, Angle, Angle, float, float);
385 extern void     traneqstd(Header*, Angle, Angle);
386 extern Angle    getra(char*);
387 extern Angle    getdec(char*);
388 extern void     getplates(void);
389 extern Img*     dssread(char*);
390 extern void     hinv(Pix*, int, int);
391 extern int      input_bit(Biobuf*);
392 extern int      input_nbits(Biobuf*, int);
393 extern int      input_huffman(Biobuf*);
394 extern  int     input_nybble(Biobuf*);
395 extern void     qtree_decode(Biobuf*, Pix*, int, int, int, int);
396 extern void     start_inputing_bits(void);
397 extern Picture* image(Angle, Angle, Angle, Angle);
398 extern char*    dssmount(int);
399 extern int      dogamma(Pix);
400 extern void     displaypic(Picture*);
401 extern void     displayimage(Image*);
402 extern void     plot(char*);
403 extern void     astro(char*, int);
404 extern char*    alpha(char*, char*);
405 extern char*    skipbl(char*);
406 extern void     flatten(void);
407 extern int              bbox(long, long, int);
408 extern int              inbbox(DAngle, DAngle);
409 extern char*    nameof(Record*);
410
411 #define NINDEX  400