Blob


1 #define DIR "#9/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 */
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;
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 };
134 #define UNKNOWNMAG 32767
135 #define NPlanet 20
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 */
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 };
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 };
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 };
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 };
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 };
219 typedef struct Bayerec Bayerec;
220 struct Bayerec{
221 long sao;
222 char name[3];
223 char pad;
224 };
226 /*
227 * Internal form
228 */
230 typedef struct Namedrec Namedrec;
231 struct Namedrec{
232 char name[36];
233 };
235 typedef struct Namerec Namerec;
236 struct Namerec{
237 long sao;
238 long ngc;
239 long abell;
240 char name[36]; /* null terminated */
241 };
243 typedef struct Patchrec Patchrec;
244 struct Patchrec{
245 int nkey;
246 long key[60];
247 };
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 } u;
262 };
264 typedef struct Name Name;
265 struct Name{
266 char *name;
267 int type;
268 };
270 typedef struct Plate Plate;
271 struct Plate
273 char rgn[7];
274 char disk;
275 Angle ra;
276 Angle dec;
277 };
279 typedef struct Header Header;
280 struct Header
282 float param[Pnparam];
283 int amdflag;
285 float x;
286 float y;
287 float xi;
288 float eta;
289 };
290 typedef long Pix;
292 typedef struct Img Img;
293 struct Img
295 int nx;
296 int ny; /* ny is the fast-varying dimension */
297 Pix a[1];
298 };
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)
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
313 float min;
314 float max;
315 float gamma;
316 float absgamma;
317 float mult1;
318 float mult2;
319 int neg;
320 } gam;
322 typedef struct Picture Picture;
323 struct Picture
325 int minx;
326 int miny;
327 int maxx;
328 int maxy;
329 char name[16];
330 uchar *data;
331 };
333 #ifndef _DRAW_H_
334 typedef struct Image Image;
335 #endif
337 extern double PI_180;
338 extern double TWOPI;
339 extern char *progname;
340 extern char *desctab[][2];
341 extern Name names[];
342 extern Record *rec;
343 extern long nrec;
344 extern Planetrec *planet;
345 /* for bbox: */
346 extern int folded;
347 extern DAngle ramin;
348 extern DAngle ramax;
349 extern DAngle decmin;
350 extern DAngle decmax;
351 extern Biobuf bout;
353 extern void saoopen(void);
354 extern void ngcopen(void);
355 extern void patchopen(void);
356 extern void mopen(void);
357 extern void constelopen(void);
358 extern void lowercase(char*);
359 extern void lookup(char*, int);
360 extern int typetab(int);
361 extern char*ngcstring(int);
362 extern char*skip(int, char*);
363 extern void prrec(Record*);
364 extern int equal(char*, char*);
365 extern int parsename(char*);
366 extern void radec(int, int*, int*, int*);
367 extern int btag(short);
368 extern long patcha(Angle, Angle);
369 extern long patch(int, int, int);
370 extern char*hms(Angle);
371 extern char*dms(Angle);
372 extern char*ms(Angle);
373 extern char*hm(Angle);
374 extern char*dm(Angle);
375 extern char*deg(Angle);
376 extern char*hm5(Angle);
377 extern long dangle(Angle);
378 extern Angle angle(DAngle);
379 extern void prdesc(char*, char*(*)[2], short*);
380 extern double xsqrt(double);
381 extern Angle dist(Angle, Angle, Angle, Angle);
382 extern Header* getheader(char*);
383 extern char* getword(char*, char*);
384 extern void amdinv(Header*, Angle, Angle, float, float);
385 extern void ppoinv(Header*, Angle, Angle);
386 extern void xypos(Header*, Angle, Angle, float, float);
387 extern void traneqstd(Header*, Angle, Angle);
388 extern Angle getra(char*);
389 extern Angle getdec(char*);
390 extern void getplates(void);
391 extern Img* dssread(char*);
392 extern void hinv(Pix*, int, int);
393 extern int input_bit(Biobuf*);
394 extern int input_nbits(Biobuf*, int);
395 extern int input_huffman(Biobuf*);
396 extern int input_nybble(Biobuf*);
397 extern void qtree_decode(Biobuf*, Pix*, int, int, int, int);
398 extern void start_inputing_bits(void);
399 extern Picture* image(Angle, Angle, Angle, Angle);
400 extern char* dssmount(int);
401 extern int dogamma(Pix);
402 extern void displaypic(Picture*);
403 extern void displayimage(Image*);
404 extern void plot(char*);
405 extern void astro(char*, int);
406 extern char* alpha(char*, char*);
407 extern char* skipbl(char*);
408 extern void flatten(void);
409 extern int bbox(long, long, int);
410 extern int inbbox(DAngle, DAngle);
411 extern char* nameof(Record*);
413 #define NINDEX 400