Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include "sky.h"
6 char rad28[] = "0123456789abcdefghijklmnopqr";
8 Picture*
9 image(Angle ra, Angle dec, Angle wid, Angle hig)
10 {
11 Pix *p;
12 uchar *b, *up;
13 int i, j, sx, sy, x, y;
14 char file[50];
15 Picture *pic;
16 Img* ip;
17 int lowx, lowy, higx, higy;
18 int slowx, slowy, shigx, shigy;
19 Header *h;
20 Angle d, bd;
21 Plate *pp, *bp;
23 if(gam.gamma == 0)
24 gam.gamma = -1;
25 if(gam.max == gam.min) {
26 gam.max = 17600;
27 gam.min = 2500;
28 }
29 gam.absgamma = gam.gamma;
30 gam.neg = 0;
31 if(gam.absgamma < 0) {
32 gam.absgamma = -gam.absgamma;
33 gam.neg = 1;
34 }
35 gam.mult1 = 1. / (gam.max - gam.min);
36 gam.mult2 = 255. * gam.mult1;
38 if(nplate == 0)
39 getplates();
41 bp = 0;
42 bd = 0;
43 for(i=0; i<nplate; i++) {
44 pp = &plate[i];
45 d = dist(ra, dec, pp->ra, pp->dec);
46 if(bp == 0 || d < bd) {
47 bp = pp;
48 bd = d;
49 }
50 }
52 if(debug)
53 Bprint(&bout, "best plate: %s %s disk %d %s\n",
54 hms(bp->ra), dms(bp->dec),
55 bp->disk, bp->rgn);
57 h = getheader(bp->rgn);
58 xypos(h, ra, dec, 0, 0);
59 if(wid <= 0 || hig <= 0) {
60 lowx = h->x;
61 lowy = h->y;
62 lowx = (lowx/500) * 500;
63 lowy = (lowy/500) * 500;
64 higx = lowx + 500;
65 higy = lowy + 500;
66 } else {
67 lowx = h->x - wid*ARCSECONDS_PER_RADIAN*1000 /
68 (h->param[Pxpixelsz]*h->param[Ppltscale]*2);
69 lowy = h->y - hig*ARCSECONDS_PER_RADIAN*1000 /
70 (h->param[Pypixelsz]*h->param[Ppltscale]*2);
71 higx = h->x + wid*ARCSECONDS_PER_RADIAN*1000 /
72 (h->param[Pxpixelsz]*h->param[Ppltscale]*2);
73 higy = h->y + hig*ARCSECONDS_PER_RADIAN*1000 /
74 (h->param[Pypixelsz]*h->param[Ppltscale]*2);
75 }
76 free(h);
78 if(lowx < 0) lowx = 0;
79 if(higx < 0) higx = 0;
80 if(lowy < 0) lowy = 0;
81 if(higy < 0) higy = 0;
82 if(lowx > 14000) lowx = 14000;
83 if(higx > 14000) higx = 14000;
84 if(lowy > 14000) lowy = 14000;
85 if(higy > 14000) higy = 14000;
87 if(debug)
88 Bprint(&bout, "xy on plate: %d,%d %d,%d\n",
89 lowx,lowy, higx, higy);
91 if(lowx >= higx || lowy >=higy) {
92 Bprint(&bout, "no image found\n");
93 return 0;
94 }
96 b = malloc((higx-lowx)*(higy-lowy)*sizeof(*b));
97 if(b == 0) {
98 emalloc:
99 fprint(2, "malloc error\n");
100 return 0;
102 memset(b, 0, (higx-lowx)*(higy-lowy)*sizeof(*b));
104 slowx = lowx/500;
105 shigx = (higx-1)/500;
106 slowy = lowy/500;
107 shigy = (higy-1)/500;
109 for(sx=slowx; sx<=shigx; sx++)
110 for(sy=slowy; sy<=shigy; sy++) {
111 if(sx < 0 || sx >= nelem(rad28) || sy < 0 || sy >= nelem(rad28)) {
112 fprint(2, "bad subplate %d %d\n", sy, sx);
113 free(b);
114 return 0;
116 sprint(file, "%s/%s/%s.%c%c",
117 dssmount(bp->disk),
118 bp->rgn, bp->rgn,
119 rad28[sy],
120 rad28[sx]);
122 ip = dssread(file);
123 if(ip == 0) {
124 fprint(2, "can't read %s: %r\n", file);
125 free(b);
126 return 0;
129 x = sx*500;
130 y = sy*500;
131 for(j=0; j<ip->ny; j++) {
132 if(y+j < lowy || y+j >= higy)
133 continue;
134 p = &ip->a[j*ip->ny];
135 up = b + (higy - (y+j+1))*(higx-lowx) + (x - lowx);
136 for(i=0; i<ip->nx; i++) {
137 if(x+i >= lowx && x+i < higx)
138 *up = dogamma(*p);
139 up++;
140 p += 1;
143 free(ip);
146 pic = malloc(sizeof(Picture));
147 if(pic == 0){
148 free(b);
149 goto emalloc;
151 pic->minx = lowx;
152 pic->miny = lowy;
153 pic->maxx = higx;
154 pic->maxy = higy;
155 pic->data = b;
156 strcpy(pic->name, bp->rgn);
157 return pic;