Annotation of researchv8dc/cmd/view2d/rd.c, revision 1.1

1.1     ! root        1: /****** routines for reading view2d files ******
        !             2: 
        !             3:  globals that must be declared by calling program:
        !             4:  double ts;  starting time
        !             5:  double te;  ending time
        !             6:  short timewarp; ==  -1  ts, te unused;  avoids seeks if possible
        !             7:                  ==  0  ts, te set from file
        !             8:                  ==  1  ts set by calling program, te set from file
        !             9:                  ==  2  ts, te set by calling  program
        !            10:  another global, declared here in rd.c (with structure definition in view2d.h)
        !            11:      Rd2d rd;
        !            12:        short rd.pmin == global min pixel value
        !            13:        float rd.pmin == global max
        !            14:        short rd.u == global u value  (origin)
        !            15:        short rd.v == global v value  (exponent)
        !            16:        int   rd.nfr  == number of frames   (not set if timewarp==-1)
        !            17: 
        !            18:  if p is the pixel value and f is the corresponding user's function value,
        !            19:        f = (p-u) * 2**v      p = u + f / 2**v
        !            20:     if p<(-BIG) then the function value is undefined, and the pixel is black
        !            21: 
        !            22:  rd2dh(fd,pny,pny)
        !            23:     int fd;            (on input) a file descriptor open for read and seek
        !            24:     short *pnx, *pny;  (on output) size of the images
        !            25:   initializes the global variables ts, te, rd; chooses global scale factor;
        !            26:     skips forward through file to time>=ts;
        !            27: 
        !            28:  rd2di(ptime,p)
        !            29:     double *ptime;   frame time
        !            30:     short p[];       nx by ny array of pixel values
        !            31:   reads a frame of data;
        !            32: 
        !            33:  rd2dj(j)
        !            34:     int j;
        !            35:   jumps to j frames forward (or back, if j<0)
        !            36: 
        !            37: For a sample program illustrating the use of rd.c, see blue.c.
        !            38: */
        !            39: 
        !            40: 
        !            41: #include <stdio.h>
        !            42: #include "view2d.h"
        !            43: extern short timewarp;
        !            44: extern double ts, te;
        !            45: Rd2d rd;
        !            46: 
        !            47: Header hd;
        !            48: Header2 hd2;
        !            49: short filver;   /* normally 3;  old files may still be 2 */
        !            50: double hdtime;  /* set by rdhd() */
        !            51: double prevtim; /* old hdtime, to check monotonicity */
        !            52: long frsiz;  /* size of header and image */
        !            53: int hdr_rd;   /* are we part way through reading a header? */
        !            54: #define MAXN 1025
        !            55: 
        !            56: rd2dh(fd,pnx,pny)       /* initialize */
        !            57:   int fd;
        !            58:   short *pnx, *pny;
        !            59: {
        !            60:   long firstfr, imsiz;
        !            61:   int i, j;
        !            62:   float v2;
        !            63:   int hdsiz;
        !            64:   long Lseek();
        !            65:   double pow2();
        !            66: 
        !            67:   /* read first header */
        !            68:   rd.fd = fd;
        !            69:   filver = 0;
        !            70:   hdr_rd = 0;
        !            71:   if(rdhd()==0) error("empty input\n");
        !            72:   if(filver==3){ hdsiz = sizeof(hd); }
        !            73:     else{ hdsiz = sizeof(hd2); }
        !            74:   if( (hd.nx>MAXN) || (hd.ny>MAXN) ) error("nx,ny too big");
        !            75:   *pnx = hd.nx;
        !            76:   *pny = hd.ny;
        !            77:   rd.siz = hd.nx * hd.ny;
        !            78:   imsiz = rd.siz*sizeof(short);
        !            79:   frsiz = hdsiz+imsiz;
        !            80:   rd.ts = hdtime;
        !            81:   rd.u = hd.u;
        !            82:   rd.v = hd.v;
        !            83:   rd.fixuv = hd.fixuv;
        !            84:   rd.pmin = hd.pmin;
        !            85:   rd.pmax = hd.pmax;
        !            86:   if(timewarp>=0){
        !            87:     Lseek(fd,-frsiz,2);
        !            88:     rdhd();
        !            89:     rd.te = hdtime;
        !            90:   }
        !            91: 
        !            92:   /* locate first active header */
        !            93:   prevtim = -1.e28;
        !            94:   firstfr = 0;
        !            95:   if(timewarp>0){
        !            96:     Lseek(fd,firstfr,0);
        !            97:     rdhd();
        !            98:     if(ts<hdtime) ts = hdtime;   /* don't extrapolate back in time */
        !            99:     while(hdtime<ts){
        !           100:       firstfr = Lseek(fd,imsiz,1);
        !           101:       if( rdhd() == 0 ) error("starting time is after EOF");
        !           102:     }
        !           103:     if(ts!=hdtime){
        !           104:       firstfr = Lseek(fd,-frsiz-hdsiz,1);
        !           105:       rdhd();
        !           106:     }
        !           107:     prevtim = hdtime;
        !           108:   }
        !           109:   if     (timewarp==0){ te = rd.te; ts = rd.ts; }
        !           110:   else if(timewarp==1){ te = rd.te; }
        !           111: 
        !           112:   if( (timewarp>=0) || (rd.fixuv!=1) ){
        !           113:     rd.nfr = Lseek(fd,0L,2)/frsiz;
        !           114:     Lseek(fd,firstfr,0);
        !           115:   }else if( rd.fixuv==1 ){
        !           116:     hdr_rd = 1;    /* so that initial header needn't be reread */
        !           117:   }
        !           118: 
        !           119:   /* global scaling */
        !           120:   if(rd.fixuv!=1){
        !           121:     g_range();
        !           122:     Lseek(fd,firstfr,0);
        !           123:   }else{
        !           124:     v2 = pow2(rd.v);
        !           125:     rd.fmin = (rd.pmin-rd.u)*v2;
        !           126:     rd.fmax = (rd.pmax-rd.u)*v2;
        !           127:   }
        !           128: }
        !           129: 
        !           130: 
        !           131: 
        !           132: int                           /* returns 0 upon EOF */
        !           133: rd2di(ptime,p)                /* read an image */
        !           134:   double *ptime;
        !           135:   short p[]; 
        !           136: {
        !           137:   short *q;
        !           138:   int shift;
        !           139:   int i, j, k;
        !           140:   int pmin=rd.pmin;
        !           141:   int pmax=rd.pmax;
        !           142: 
        !           143:   if(hdr_rd==1){ hdr_rd=0; }
        !           144:     else if(rdhd()==0) return(0);
        !           145:   if(hdtime<prevtim) fprintf(stderr," time decreased! new=%g old=%g\n",hdtime,prevtim);
        !           146:   prevtim = hdtime;
        !           147:   *ptime = hdtime;
        !           148: 
        !           149:   Read(rd.fd,p,rd.siz*sizeof(short));
        !           150: 
        !           151:   /* convert to global units */
        !           152:   if( (hd.u!=rd.u) || (hd.v!=rd.v) ){
        !           153:     shift = rd.v - hd.v;
        !           154:     if(shift>15){
        !           155:       for( i=rd.siz, q=p; i>0; i--, q++ ){
        !           156:         *q = rd.u;
        !           157:       }
        !           158:     }else if(shift>=0){
        !           159:       for(k=1; shift>0;){ shift--; k*=2; }
        !           160:       for( i=rd.siz, q=p; i>0; i--, q++ ){
        !           161:         if( *q < -BIG ) continue;
        !           162:         j = ((*q-hd.u)/k) + rd.u;
        !           163:         *q = (j<pmin)? pmin:
        !           164:             ((j>pmax)? pmax: j);
        !           165:       }
        !           166:     }else{ /* shift<0 */
        !           167:       for(k=1; shift<0;){ shift++; k*=2; }
        !           168:       for( i=rd.siz, q=p; i>0; i--, q++ ){
        !           169:         if( *q < -BIG ) continue;
        !           170:         j = ((*q-hd.u)*k) + rd.u;
        !           171:         *q = (j<pmin)? pmin:
        !           172:             ((j>pmax)? pmax: j);
        !           173:       }
        !           174:     }
        !           175:   }else{  /* hd.u=rd.u and hd.v==rd.v */
        !           176:     for( i=rd.siz, q=p; i>0; i--, q++ ){
        !           177:       if( *q < -BIG ) continue;
        !           178:       if( *q<rd.pmin ){ *q = rd.pmin; }
        !           179:       else if( *q>rd.pmax ){ *q = rd.pmax; }
        !           180:     }
        !           181:   }
        !           182:   return(1);
        !           183: }
        !           184: 
        !           185: 
        !           186: 
        !           187: int
        !           188: rdhd()      /* returns 0 upon EOF */
        !           189: {
        !           190:   long Lseek();
        !           191: 
        !           192:   if( filver==0 ){   /* get version number first time through */
        !           193:     if( EOFRead(rd.fd,&hd,sizeof(hd)) == 0 ) return(0);
        !           194:     if(hd.magic!=MAGIC) error("bad magic number %o at start",hd.magic);
        !           195:     filver = hd.ver;
        !           196:     if(filver==2){ Lseek(rd.fd,0L,0); }
        !           197:      else if(filver!=3){ error("bad version number %d",filver); }
        !           198:   }else if(filver==3){
        !           199:     if( EOFRead(rd.fd,&hd,sizeof(hd)) == 0 ) return(0);
        !           200:   }
        !           201: 
        !           202:   if(filver==2){
        !           203:     if( EOFRead(rd.fd,&hd2,sizeof(hd2)) == 0 ) return(0);
        !           204:     hd.magic = hd2.magic;
        !           205:     hd.ver = hd2.ver;
        !           206:     hd.nx = hd2.nx;
        !           207:     hd.ny = hd2.ny;
        !           208:     hd.u = hd2.u;
        !           209:     hd.v = hd2.v;
        !           210:     hd.fixuv = hd2.fixuv;
        !           211:     hd.pmin = hd2.pmin;
        !           212:     hd.pmax = hd2.pmax;
        !           213:     sprintf(hd.time, "%15.8g", (double)hd2.time);
        !           214:   }
        !           215: 
        !           216:   if(hd.magic!=MAGIC){
        !           217:     fprintf(stderr,"bad magic number %o\n",hd.magic);
        !           218:     fprintf(stderr,"file pointer now at %ld\n",Lseek(rd.fd,0L,1));
        !           219:     exit(2);
        !           220:   }
        !           221:   if(hd.ver!=filver){ error("inconsistent version number"); }
        !           222:   if(sscanf(hd.time,"%16E",&hdtime)!=1) error("can't parse time: %s",hd.time);
        !           223:   return(1);
        !           224: }
        !           225: 
        !           226: 
        !           227: 
        !           228: g_range()
        !           229: {    /* scan until last active header, updating range */
        !           230:   float gmin, gmax;
        !           231:   f_range(&rd.fmin,&rd.fmax);
        !           232:   while( f_range(&gmin,&gmax) ){
        !           233:     if( (timewarp==2) && (hdtime<te) ) break;
        !           234:     if( rd.v > hd.v ){
        !           235:       rd.u = hd.u;
        !           236:       rd.v = hd.v;
        !           237:     }
        !           238:     if( gmin < rd.fmin ) rd.fmin = gmin;
        !           239:     if( gmax > rd.fmax ) rd.fmax = gmax;
        !           240:     rd.te = hdtime;
        !           241:   }
        !           242:   g_rang2();
        !           243: }
        !           244: 
        !           245: g_rang2()
        !           246: {          /* choose global scaling */
        !           247:   float gmin, gmax, v2;
        !           248:   double pow2();
        !           249:   gmax = (rd.fmax<0)?0:rd.fmax;
        !           250:   gmin = (rd.fmin>0)?0:rd.fmin;
        !           251:   v2 = pow2(rd.v);
        !           252:   if( (gmin < (-BIG-rd.u)*v2) || (gmax > (BIG-rd.u)*v2) ){
        !           253:     while( (gmax-gmin)/v2 >= 2*BIG-2 ){ rd.v++; v2 *= 2; }
        !           254:     rd.u = (short)(-(gmin+gmax)/(2*v2));
        !           255:   }
        !           256:   rd.pmin = rd.u + (short)(rd.fmin/v2);
        !           257:   rd.pmax = rd.u + (short)(rd.fmax/v2);
        !           258: }
        !           259: 
        !           260: 
        !           261: int
        !           262: f_range ( pfmin, pfmax )
        !           263:   float *pfmin, *pfmax;
        !           264: {
        !           265:   int i, j;
        !           266:   short p[MAXN], *q;
        !           267:   short pmin = BIG;
        !           268:   short pmax = -BIG;
        !           269:   double pow2();
        !           270:   float u2, v2;
        !           271:   if( rdhd()==0 ) return(0);
        !           272:   u2 = hd.u;
        !           273:   v2 = pow2(hd.v);
        !           274:   for( i=hd.ny; i>0; i-- ){
        !           275:     Read(rd.fd,p,hd.nx*sizeof(short));
        !           276:     for( j=hd.nx, q=p; j>0; j--, q++ ){
        !           277:       if( *q < -BIG ) continue;
        !           278:       if( *q < pmin ){ pmin = *q; }
        !           279:       if( *q > pmax ){ pmax = *q; }
        !           280:     }
        !           281:   }
        !           282:   *pfmin = (pmin-u2)*v2;
        !           283:   *pfmax = (pmax-u2)*v2;
        !           284:   return(1);
        !           285: }
        !           286: 
        !           287: rd2dj(j)
        !           288:   int j;
        !           289: {
        !           290:   long Lseek();
        !           291:   Lseek(rd.fd,j*frsiz,1);
        !           292:   prevtim = ts;
        !           293: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.