From 8a3b2ceb0ff632c47e1516d3ffef8572dc8eb974 Mon Sep 17 00:00:00 2001 From: rsc Date: Sat, 24 Apr 2004 17:05:43 +0000 Subject: Add scat. Temporary fix to rc r.e. note groups. --- src/cmd/scat/image.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 src/cmd/scat/image.c (limited to 'src/cmd/scat/image.c') diff --git a/src/cmd/scat/image.c b/src/cmd/scat/image.c new file mode 100644 index 00000000..e61f0106 --- /dev/null +++ b/src/cmd/scat/image.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include "sky.h" + +char rad28[] = "0123456789abcdefghijklmnopqr"; + +Picture* +image(Angle ra, Angle dec, Angle wid, Angle hig) +{ + Pix *p; + uchar *b, *up; + int i, j, sx, sy, x, y; + char file[50]; + Picture *pic; + Img* ip; + int lowx, lowy, higx, higy; + int slowx, slowy, shigx, shigy; + Header *h; + Angle d, bd; + Plate *pp, *bp; + + if(gam.gamma == 0) + gam.gamma = -1; + if(gam.max == gam.min) { + gam.max = 17600; + gam.min = 2500; + } + gam.absgamma = gam.gamma; + gam.neg = 0; + if(gam.absgamma < 0) { + gam.absgamma = -gam.absgamma; + gam.neg = 1; + } + gam.mult1 = 1. / (gam.max - gam.min); + gam.mult2 = 255. * gam.mult1; + + if(nplate == 0) + getplates(); + + bp = 0; + bd = 0; + for(i=0; ira, pp->dec); + if(bp == 0 || d < bd) { + bp = pp; + bd = d; + } + } + + if(debug) + Bprint(&bout, "best plate: %s %s disk %d %s\n", + hms(bp->ra), dms(bp->dec), + bp->disk, bp->rgn); + + h = getheader(bp->rgn); + xypos(h, ra, dec, 0, 0); + if(wid <= 0 || hig <= 0) { + lowx = h->x; + lowy = h->y; + lowx = (lowx/500) * 500; + lowy = (lowy/500) * 500; + higx = lowx + 500; + higy = lowy + 500; + } else { + lowx = h->x - wid*ARCSECONDS_PER_RADIAN*1000 / + (h->param[Pxpixelsz]*h->param[Ppltscale]*2); + lowy = h->y - hig*ARCSECONDS_PER_RADIAN*1000 / + (h->param[Pypixelsz]*h->param[Ppltscale]*2); + higx = h->x + wid*ARCSECONDS_PER_RADIAN*1000 / + (h->param[Pxpixelsz]*h->param[Ppltscale]*2); + higy = h->y + hig*ARCSECONDS_PER_RADIAN*1000 / + (h->param[Pypixelsz]*h->param[Ppltscale]*2); + } + free(h); + + if(lowx < 0) lowx = 0; + if(higx < 0) higx = 0; + if(lowy < 0) lowy = 0; + if(higy < 0) higy = 0; + if(lowx > 14000) lowx = 14000; + if(higx > 14000) higx = 14000; + if(lowy > 14000) lowy = 14000; + if(higy > 14000) higy = 14000; + + if(debug) + Bprint(&bout, "xy on plate: %d,%d %d,%d\n", + lowx,lowy, higx, higy); + + if(lowx >= higx || lowy >=higy) { + Bprint(&bout, "no image found\n"); + return 0; + } + + b = malloc((higx-lowx)*(higy-lowy)*sizeof(*b)); + if(b == 0) { + emalloc: + fprint(2, "malloc error\n"); + return 0; + } + memset(b, 0, (higx-lowx)*(higy-lowy)*sizeof(*b)); + + slowx = lowx/500; + shigx = (higx-1)/500; + slowy = lowy/500; + shigy = (higy-1)/500; + + for(sx=slowx; sx<=shigx; sx++) + for(sy=slowy; sy<=shigy; sy++) { + if(sx < 0 || sx >= nelem(rad28) || sy < 0 || sy >= nelem(rad28)) { + fprint(2, "bad subplate %d %d\n", sy, sx); + free(b); + return 0; + } + sprint(file, "%s/%s/%s.%c%c", + dssmount(bp->disk), + bp->rgn, bp->rgn, + rad28[sy], + rad28[sx]); + + ip = dssread(file); + if(ip == 0) { + fprint(2, "can't read %s: %r\n", file); + free(b); + return 0; + } + + x = sx*500; + y = sy*500; + for(j=0; jny; j++) { + if(y+j < lowy || y+j >= higy) + continue; + p = &ip->a[j*ip->ny]; + up = b + (higy - (y+j+1))*(higx-lowx) + (x - lowx); + for(i=0; inx; i++) { + if(x+i >= lowx && x+i < higx) + *up = dogamma(*p); + up++; + p += 1; + } + } + free(ip); + } + + pic = malloc(sizeof(Picture)); + if(pic == 0){ + free(b); + goto emalloc; + } + pic->minx = lowx; + pic->miny = lowy; + pic->maxx = higx; + pic->maxy = higy; + pic->data = b; + strcpy(pic->name, bp->rgn); + return pic; +} -- cgit v1.2.3