|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 9038 (0x234e)
Types: TextFile
Names: »pictio.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/showimg/pictio.c«
/* read in image header information - if `headskip' flag is non-zero, read
* in that many words, leaving unaltered the input nrows and ncols
*/
#include <stdio.h>
#include <math.h>
#include "shimg.h" /* flag definitions */
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
#define HALFBOX 10
short *readheader(fd,headskip,nrows,ncols,fitsflag)
int fd, headskip, fitsflag;
int *nrows, *ncols;
{
char *malloc(), field[80];
short *header;
int headlen = 1536; /* standard SAO Nova CCD header length */
int nbytes, rfitscard();
if(headskip) headlen = headskip;
if(fitsflag) headlen = FITSBUFLEN;
if((header = (short *)malloc(headlen)) == NULL) {
fprintf(stderr,"Can't malloc() memory for header!\n");
exit(1);
}
if((nbytes = read(fd,header,headlen)) != headlen) {
fprintf(stderr,"?? Only %d bytes in header?\n",nbytes);
exit(1);
}
/* see if FITS decode necessary */
if(fitsflag) {
rfitsheader(header,ncols,nrows);
/* skip past furthur header records until END card */
while(rfitscard(header,"END ",field,1,0) == 0)
read(fd,header,FITSBUFLEN);
}
/* pull the parameters from CCD style header */
else if(headskip == 0) {
*ncols = header[512+127];
*nrows = header[512+126];
}
return(header);
}
rfitsheader(fitshead,ncols,nrows)
char *fitshead;
int *ncols, *nrows;
{
int sscanf(), strlen(), strncmp(), strcmp(), atoi();
int rfitscard(), naxis;
char field[21];
rfitscard(fitshead,"SIMPLE ",field,0,1);
if(sscanf(field,"%s",field) != 1)
fitserror(fitshead,"Malformed key field");
if(strcmp(field,"T") != 0)
fitserror(fitshead,"Only SIMPLE = T capability");
rfitscard(fitshead+80,"BITPIX ",field,0,1);
if(atoi(field) != 16)
fitserror(fitshead+80,"Only 16-bit images at this time");
rfitscard(fitshead+160,"NAXIS ",field,0,1);
if((naxis = atoi(field)) < 2)
fitserror(fitshead+160,"NAXIS less than 2");
else if(naxis > 2) {
fprintf(stderr,"** WARNING ** Only first 2 axes will be read. ");
fprintf(stderr,"(naxis read was %d)\n",naxis);
}
rfitscard(fitshead+240,"NAXIS1 ",field,0,1);
if((*ncols = atoi(field)) <= 0)
fitserror(fitshead+240,"NAXIS1 value error");
rfitscard(fitshead+320,"NAXIS2 ",field,0,1);
if((*nrows = atoi(field)) <= 0)
fitserror(fitshead+240,"NAXIS2 value error");
}
rfitscard(cardbuf,keyword,keyfield,anywhere,fatal)
char *cardbuf, *keyword, *keyfield;
int anywhere; /* if non-zero, search entire buffer for keyword */
int fatal; /* if non-zero, fatal if key not found */
{
char errmsg[80];
int sscanf();
register int i;
for(i=0; i<(anywhere ? FITSBUFLEN : 80); i+=80) {
if(strncmp(cardbuf+i,keyword,8) == 0)
return(sscanf(cardbuf+i+10,"%20c",keyfield));
}
if(fatal) {
sprintf(errmsg,"No `%s' keyword",keyword);
fitserror(cardbuf,errmsg); /* fatal error exit */
}
return(0);
}
fitserror(card,message)
char *card, *message;
{
card[79] = 0;
fprintf(stderr,"FITS format error: %s\ncard is:\n%s\n",message, card);
exit(1);
}
short *readpict(fd,nrows,ncols,fitsflag)
int fd, nrows, ncols, fitsflag;
{
short *picture;
char *malloc();
register int nbytes = nrows * ncols * 2;
register int nread = 0, ntotal = 0;
register char *pict;
if(fitsflag) nbytes =
((nbytes/FITSBUFLEN) + ((nbytes % FITSBUFLEN) ? 1 : 0))
* FITSBUFLEN;
if((pict = malloc(nbytes)) == NULL) {
fprintf(stderr,"Can't allocate picture memory!\n");
exit(1);
}
picture = (short *)pict;
if(fitsflag) { /* do successive reads until enough bytes */
while(ntotal < nbytes) {
if((nread = read(fd,pict,FITSBUFLEN)) != FITSBUFLEN) {
fprintf(stderr,"Bad record of %d bytes read?\n",nread);
exit(1);
}
#ifdef VAX
if(fitsflag == 1) /* do not swap bytes if disk fits format */
swab(pict,pict,nread);
#endif
ntotal += nread;
pict += nread;
}
/* read past EOF, if from tape */
if((pict = malloc(FITSBUFLEN)) != NULL)
while(read(fd,pict,FITSBUFLEN) > 0) ;
}
else if((nbytes = read(fd,picture,nbytes)) != (nrows * ncols)<<1) {
fprintf(stderr,"only %d bytes in picture?\n",nbytes);
exit(1);
}
return(picture);
}
/* VERY SIMPLE 16-bit to n-bit scaling for now. We assume we know a
* little something about the picture, so as get best contrast soonest.
*/
scalepict( byteimage, picture, pmaxval, pminval,
ncolors, pixoffset, lshift, nrows, ncols, flags)
unsigned char *byteimage;
short *picture;
int pmaxval, pminval, ncolors, pixoffset, lshift, nrows, ncols;
unsigned short flags;
{
register unsigned char *image = byteimage;
register short *pict = picture;
register unsigned char *lookup;
register int npix;
register int pint = pmaxval;
register int pmin = pminval;
int i,j;
double xpinterval;
char *malloc();
if((lookup = (unsigned char *)malloc(65536)) == NULL) {
fprintf(stderr,"Can't allocate lookup table?\n");
exit(1);
}
for(npix = 0; npix <= pmin+32768; )
lookup[npix++] = pixoffset;
pmin = pixoffset+ncolors-1;
for(npix = pint+32768; npix < 65536; )
lookup[npix++] = pmin;
pmin = MAX(-50,pminval); /* disallow large negative pixels */
if(flags & SOP_Linear) {
/* disallow large positive pixels here, too */
pint = MIN(1000+pmin,pint);
pint = (pint - pmin)/ncolors; /* reus as interval measure */
/* code added by egm */
pint = MAX(pint,1);
/* end of egm code */
ncolors--;
for(npix=pmin; npix <= pmaxval; npix++)
lookup[npix+32768] =
(MIN(ncolors,(npix-pmin)/pint)<<lshift) + pixoffset;
}
/* a little work will generalize this to logarithmic mapping */
else if(flags & SOP_Sqrt) {
xpinterval = sqrt((double)(pint - pmin))/(double)ncolors;
ncolors--;
for(npix=pmin; npix <= pmaxval; npix++) {
pint = (int)((sqrt((double)(npix-pmin))/xpinterval) + 0.5);
lookup[npix+32768] =
MIN(ncolors, pint<<lshift) + pixoffset;
}
}
else {
fprintf(stderr,"Unknown scaling type request!\n");
free(lookup);
exit(1);
}
npix = nrows*ncols;
image = byteimage;
pict = picture;
while(npix--) *image++ = *(lookup + *pict++ + 32768);
free(lookup);
return;
}
/* return max, min of data in picture (approximately - sample areas likely
* to be of interest.
*/
maxminpict( picture, nrows, ncols, pmaxval, pminval)
short *picture;
int nrows, ncols;
int *pmaxval, *pminval; /* RETURNED */
{
register short *pict = picture;
register int npix;
register int pmax = -32768, pmin = 32767;
register int i, j;
j = ncols*nrows/2;
for(i=ncols/8; i<(7*ncols)/8; i++) {
npix = pict[i+j];
pmax = MAX(pmax,npix);
pmin = MIN(pmin,npix);
}
i = (7*ncols*nrows)/8 + (ncols>>1);
for(j=(nrows*ncols/8)+(ncols>>1); j<i; j+=ncols) {
npix = pict[j];
pmax = MAX(pmax,npix);
pmin = MIN(pmin,npix);
}
/* find min,max from 5 regions (center, 4 areas around it) */
for(i=ncols/2-HALFBOX; i<ncols/2+HALFBOX; i++) {
for(j=nrows/8-HALFBOX; j<nrows/8+HALFBOX; j++) {
npix = pict[j*ncols+i];
pmax = MAX(pmax,npix);
pmin = MIN(pmin,npix);
}
for(j=nrows/2-HALFBOX; j<nrows/2+HALFBOX; j++) {
npix = pict[j*ncols+i];
pmax = MAX(pmax,npix);
pmin = MIN(pmin,npix);
}
for(j=7*nrows/8-HALFBOX; j<7*nrows/8+HALFBOX; j++) {
npix = pict[j*ncols+i];
pmax = MAX(pmax,npix);
pmin = MIN(pmin,npix);
}
}
for(j=nrows/2-HALFBOX; j<nrows/2+HALFBOX; j++) {
for(i=ncols/8-HALFBOX; i<ncols/8+HALFBOX; i++) {
npix = pict[j*ncols+i];
pmax = MAX(pmax,npix);
pmin = MIN(pmin,npix);
}
for(i=7*nrows/8-HALFBOX; i<7*ncols/8+HALFBOX; i++) {
npix = pict[j*ncols+i];
pmax = MAX(pmax,npix);
pmin = MIN(pmin,npix);
}
}
/* printf("pixel range is %d to %d\n",pmin,pmax); */
*pminval = pmin;
*pmaxval = pmax;
return;
}
/* print out a piece of the picture */
/*
* We really shoud use the environment to get the reverse video
* escape sequence. Oh well....
*/
prpict(pict, wx, wy, xzero, yzero, ncols, nrows, npcol, nprow)
short *pict;
int wx, wy, xzero, yzero, ncols, nrows, npcol, nprow;
{
int i, j, k, l;
printf("\n\nRow %d, Col %d:\n\n ", wy + yzero, wx + xzero);
i = MIN( ncols-npcol, MAX( 0, wx + xzero - npcol/2));
for(k=i; k<i+npcol; k++)
if(k == wx + xzero) printf(" %c[7m%4d%c[0m",27,k,27);
else printf(" %4d",k);
printf("\n ");
for(k=i; k<i+npcol; k++) printf(" ----");
j = MIN( nrows-nprow, MAX( 0, wy + yzero - nprow/2));
for(k=j; k<j+nprow; k++) {
if(k == wy + yzero) printf("\n %c[7m%4d%c[0m |",27,k,27);
else printf("\n%5d |",k);
for(l=i; l<i+npcol; l++)
if((l == wx + xzero) && (k == wy + yzero))
printf(" %c[7m%5d%c[0m",27,pict[ k*ncols + l], 27);
else printf("%6d",pict[ k*ncols + l]);
}
printf("\n");
return;
}