Blob


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