1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include "sky.h"
5219b2ee8SDavid du Colombier
6219b2ee8SDavid du Colombier char rad28[] = "0123456789abcdefghijklmnopqr";
7219b2ee8SDavid du Colombier
8219b2ee8SDavid du Colombier Picture*
image(Angle ra,Angle dec,Angle wid,Angle hig)9219b2ee8SDavid du Colombier image(Angle ra, Angle dec, Angle wid, Angle hig)
10219b2ee8SDavid du Colombier {
11219b2ee8SDavid du Colombier Pix *p;
12219b2ee8SDavid du Colombier uchar *b, *up;
13219b2ee8SDavid du Colombier int i, j, sx, sy, x, y;
14219b2ee8SDavid du Colombier char file[50];
15219b2ee8SDavid du Colombier Picture *pic;
167dd7cddfSDavid du Colombier Img* ip;
17219b2ee8SDavid du Colombier int lowx, lowy, higx, higy;
18219b2ee8SDavid du Colombier int slowx, slowy, shigx, shigy;
19219b2ee8SDavid du Colombier Header *h;
20219b2ee8SDavid du Colombier Angle d, bd;
21219b2ee8SDavid du Colombier Plate *pp, *bp;
22219b2ee8SDavid du Colombier
23219b2ee8SDavid du Colombier if(gam.gamma == 0)
24219b2ee8SDavid du Colombier gam.gamma = -1;
25219b2ee8SDavid du Colombier if(gam.max == gam.min) {
26219b2ee8SDavid du Colombier gam.max = 17600;
27219b2ee8SDavid du Colombier gam.min = 2500;
28219b2ee8SDavid du Colombier }
29219b2ee8SDavid du Colombier gam.absgamma = gam.gamma;
30219b2ee8SDavid du Colombier gam.neg = 0;
31219b2ee8SDavid du Colombier if(gam.absgamma < 0) {
32219b2ee8SDavid du Colombier gam.absgamma = -gam.absgamma;
33219b2ee8SDavid du Colombier gam.neg = 1;
34219b2ee8SDavid du Colombier }
35219b2ee8SDavid du Colombier gam.mult1 = 1. / (gam.max - gam.min);
36219b2ee8SDavid du Colombier gam.mult2 = 255. * gam.mult1;
37219b2ee8SDavid du Colombier
38219b2ee8SDavid du Colombier if(nplate == 0)
39219b2ee8SDavid du Colombier getplates();
40219b2ee8SDavid du Colombier
41219b2ee8SDavid du Colombier bp = 0;
42219b2ee8SDavid du Colombier bd = 0;
43219b2ee8SDavid du Colombier for(i=0; i<nplate; i++) {
44219b2ee8SDavid du Colombier pp = &plate[i];
45219b2ee8SDavid du Colombier d = dist(ra, dec, pp->ra, pp->dec);
46219b2ee8SDavid du Colombier if(bp == 0 || d < bd) {
47219b2ee8SDavid du Colombier bp = pp;
48219b2ee8SDavid du Colombier bd = d;
49219b2ee8SDavid du Colombier }
50219b2ee8SDavid du Colombier }
51219b2ee8SDavid du Colombier
52219b2ee8SDavid du Colombier if(debug)
53*59cc4ca5SDavid du Colombier Bprint(&bout, "best plate: %s %s disk %d %s\n",
54219b2ee8SDavid du Colombier hms(bp->ra), dms(bp->dec),
55219b2ee8SDavid du Colombier bp->disk, bp->rgn);
56219b2ee8SDavid du Colombier
57219b2ee8SDavid du Colombier h = getheader(bp->rgn);
58219b2ee8SDavid du Colombier xypos(h, ra, dec, 0, 0);
59219b2ee8SDavid du Colombier if(wid <= 0 || hig <= 0) {
60219b2ee8SDavid du Colombier lowx = h->x;
61219b2ee8SDavid du Colombier lowy = h->y;
62219b2ee8SDavid du Colombier lowx = (lowx/500) * 500;
63219b2ee8SDavid du Colombier lowy = (lowy/500) * 500;
64219b2ee8SDavid du Colombier higx = lowx + 500;
65219b2ee8SDavid du Colombier higy = lowy + 500;
66219b2ee8SDavid du Colombier } else {
67219b2ee8SDavid du Colombier lowx = h->x - wid*ARCSECONDS_PER_RADIAN*1000 /
68219b2ee8SDavid du Colombier (h->param[Pxpixelsz]*h->param[Ppltscale]*2);
69219b2ee8SDavid du Colombier lowy = h->y - hig*ARCSECONDS_PER_RADIAN*1000 /
70219b2ee8SDavid du Colombier (h->param[Pypixelsz]*h->param[Ppltscale]*2);
71219b2ee8SDavid du Colombier higx = h->x + wid*ARCSECONDS_PER_RADIAN*1000 /
72219b2ee8SDavid du Colombier (h->param[Pxpixelsz]*h->param[Ppltscale]*2);
73219b2ee8SDavid du Colombier higy = h->y + hig*ARCSECONDS_PER_RADIAN*1000 /
74219b2ee8SDavid du Colombier (h->param[Pypixelsz]*h->param[Ppltscale]*2);
75219b2ee8SDavid du Colombier }
76219b2ee8SDavid du Colombier free(h);
77219b2ee8SDavid du Colombier
78219b2ee8SDavid du Colombier if(lowx < 0) lowx = 0;
79219b2ee8SDavid du Colombier if(higx < 0) higx = 0;
80219b2ee8SDavid du Colombier if(lowy < 0) lowy = 0;
81219b2ee8SDavid du Colombier if(higy < 0) higy = 0;
82219b2ee8SDavid du Colombier if(lowx > 14000) lowx = 14000;
83219b2ee8SDavid du Colombier if(higx > 14000) higx = 14000;
84219b2ee8SDavid du Colombier if(lowy > 14000) lowy = 14000;
85219b2ee8SDavid du Colombier if(higy > 14000) higy = 14000;
86219b2ee8SDavid du Colombier
87219b2ee8SDavid du Colombier if(debug)
88*59cc4ca5SDavid du Colombier Bprint(&bout, "xy on plate: %d,%d %d,%d\n",
89219b2ee8SDavid du Colombier lowx,lowy, higx, higy);
90219b2ee8SDavid du Colombier
91219b2ee8SDavid du Colombier if(lowx >= higx || lowy >=higy) {
92*59cc4ca5SDavid du Colombier Bprint(&bout, "no image found\n");
93219b2ee8SDavid du Colombier return 0;
94219b2ee8SDavid du Colombier }
95219b2ee8SDavid du Colombier
96219b2ee8SDavid du Colombier b = malloc((higx-lowx)*(higy-lowy)*sizeof(*b));
97219b2ee8SDavid du Colombier if(b == 0) {
98219b2ee8SDavid du Colombier emalloc:
99219b2ee8SDavid du Colombier fprint(2, "malloc error\n");
100219b2ee8SDavid du Colombier return 0;
101219b2ee8SDavid du Colombier }
102219b2ee8SDavid du Colombier memset(b, 0, (higx-lowx)*(higy-lowy)*sizeof(*b));
103219b2ee8SDavid du Colombier
104219b2ee8SDavid du Colombier slowx = lowx/500;
105219b2ee8SDavid du Colombier shigx = (higx-1)/500;
106219b2ee8SDavid du Colombier slowy = lowy/500;
107219b2ee8SDavid du Colombier shigy = (higy-1)/500;
108219b2ee8SDavid du Colombier
109219b2ee8SDavid du Colombier for(sx=slowx; sx<=shigx; sx++)
110219b2ee8SDavid du Colombier for(sy=slowy; sy<=shigy; sy++) {
111219b2ee8SDavid du Colombier if(sx < 0 || sx >= nelem(rad28) || sy < 0 || sy >= nelem(rad28)) {
112219b2ee8SDavid du Colombier fprint(2, "bad subplate %d %d\n", sy, sx);
113219b2ee8SDavid du Colombier free(b);
114219b2ee8SDavid du Colombier return 0;
115219b2ee8SDavid du Colombier }
1167dd7cddfSDavid du Colombier sprint(file, "%s/%s/%s.%c%c",
1177dd7cddfSDavid du Colombier dssmount(bp->disk),
118219b2ee8SDavid du Colombier bp->rgn, bp->rgn,
119219b2ee8SDavid du Colombier rad28[sy],
120219b2ee8SDavid du Colombier rad28[sx]);
121219b2ee8SDavid du Colombier
122219b2ee8SDavid du Colombier ip = dssread(file);
123219b2ee8SDavid du Colombier if(ip == 0) {
124219b2ee8SDavid du Colombier fprint(2, "can't read %s: %r\n", file);
125219b2ee8SDavid du Colombier free(b);
126219b2ee8SDavid du Colombier return 0;
127219b2ee8SDavid du Colombier }
128219b2ee8SDavid du Colombier
129219b2ee8SDavid du Colombier x = sx*500;
130219b2ee8SDavid du Colombier y = sy*500;
131219b2ee8SDavid du Colombier for(j=0; j<ip->ny; j++) {
132219b2ee8SDavid du Colombier if(y+j < lowy || y+j >= higy)
133219b2ee8SDavid du Colombier continue;
134219b2ee8SDavid du Colombier p = &ip->a[j*ip->ny];
135219b2ee8SDavid du Colombier up = b + (higy - (y+j+1))*(higx-lowx) + (x - lowx);
136219b2ee8SDavid du Colombier for(i=0; i<ip->nx; i++) {
137219b2ee8SDavid du Colombier if(x+i >= lowx && x+i < higx)
138219b2ee8SDavid du Colombier *up = dogamma(*p);
139219b2ee8SDavid du Colombier up++;
140219b2ee8SDavid du Colombier p += 1;
141219b2ee8SDavid du Colombier }
142219b2ee8SDavid du Colombier }
143219b2ee8SDavid du Colombier free(ip);
144219b2ee8SDavid du Colombier }
145219b2ee8SDavid du Colombier
146219b2ee8SDavid du Colombier pic = malloc(sizeof(Picture));
147219b2ee8SDavid du Colombier if(pic == 0){
148219b2ee8SDavid du Colombier free(b);
149219b2ee8SDavid du Colombier goto emalloc;
150219b2ee8SDavid du Colombier }
151219b2ee8SDavid du Colombier pic->minx = lowx;
152219b2ee8SDavid du Colombier pic->miny = lowy;
153219b2ee8SDavid du Colombier pic->maxx = higx;
154219b2ee8SDavid du Colombier pic->maxy = higy;
155219b2ee8SDavid du Colombier pic->data = b;
156219b2ee8SDavid du Colombier strcpy(pic->name, bp->rgn);
157219b2ee8SDavid du Colombier return pic;
158219b2ee8SDavid du Colombier }
159