plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

image.c (3197B)


      1 #include	<u.h>
      2 #include	<libc.h>
      3 #include	<bio.h>
      4 #include	"sky.h"
      5 
      6 char	rad28[] = "0123456789abcdefghijklmnopqr";
      7 
      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;
     22 
     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;
     37 
     38 	if(nplate == 0)
     39 		getplates();
     40 
     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 	}
     51 
     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);
     56 
     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);
     77 
     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;
     86 
     87 	if(debug)
     88 		Bprint(&bout, "xy on plate: %d,%d %d,%d\n",
     89 			lowx,lowy, higx, higy);
     90 
     91 	if(lowx >= higx || lowy >=higy) {
     92 		Bprint(&bout, "no image found\n");
     93 		return 0;
     94 	}
     95 
     96 	b = malloc((higx-lowx)*(higy-lowy)*sizeof(*b));
     97 	if(b == 0) {
     98  emalloc:
     99 		fprint(2, "malloc error\n");
    100 		return 0;
    101 	}
    102 	memset(b, 0, (higx-lowx)*(higy-lowy)*sizeof(*b));
    103 
    104 	slowx = lowx/500;
    105 	shigx = (higx-1)/500;
    106 	slowy = lowy/500;
    107 	shigy = (higy-1)/500;
    108 
    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;
    115 		}
    116 		sprint(file, "%s/%s/%s.%c%c",
    117 			dssmount(bp->disk),
    118 			bp->rgn, bp->rgn,
    119 			rad28[sy],
    120 			rad28[sx]);
    121 
    122 		ip = dssread(file);
    123 		if(ip == 0) {
    124 			fprint(2, "can't read %s: %r\n", file);
    125 			free(b);
    126 			return 0;
    127 		}
    128 
    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;
    141 			}
    142 		}
    143 		free(ip);
    144 	}
    145 
    146 	pic = malloc(sizeof(Picture));
    147 	if(pic == 0){
    148 		free(b);
    149 		goto emalloc;
    150 	}
    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;
    158 }