|
|
1.1 ! root 1: /*********** ! 2: undocumented options: ! 3: -B use blue background ! 4: -SF download one frame at a time (hence, arbitrarily long movies) ! 5: GO? s snaps camera ! 6: GO? 4 skips 4 frames forward; default=1 ! 7: -SMn like -SF, but "snap n" after each frame ! 8: -SA "autopilot" like -SF, but keeps going ! 9: -b don't show blank frame ! 10: -v verbose ! 11: -vc print colors ! 12: -w warmstart ! 13: -D debugging (don't write on /dev/cv0) ! 14: ***********/ ! 15: #include <stdio.h> ! 16: #include <math.h> ! 17: #include "view2d.h" ! 18: ! 19: extern Rd2d rd; ! 20: char *progname; ! 21: short timewarp; ! 22: double ts, te; ! 23: int verbose; ! 24: int debug; ! 25: ! 26: main(argc,argv) ! 27: int argc; ! 28: char **argv; ! 29: { ! 30: register char *p; ! 31: register int prange; ! 32: register short *q; ! 33: register int r, rmin, ncolor1; ! 34: short *qend; ! 35: char *pict; ! 36: int ip; ! 37: short *v; ! 38: char *map; ! 39: int black; ! 40: int ncolor = 32; ! 41: int ps; ! 42: int wid; ! 43: int coldstart = 1; ! 44: int blanking = 1; ! 45: int singstep = 0; ! 46: int blueback = 0; ! 47: int holly = 0; ! 48: int i, j; ! 49: short nx, ny, fru, frv; ! 50: int frame, nframe, fx, fy, fz; ! 51: /* RED GREEN BLUE */ ! 52: static int bankl[] = { 0x7E, 0x75, 0x53 }; ! 53: static int bankc[] = { 0x4, 0x2, 0x1 }; ! 54: int mapr[256], mapg[256], mapb[256]; ! 55: int period = 5; ! 56: int printcol = 0; ! 57: long ring, ttim; ! 58: int nf; ! 59: double frtime; ! 60: double tim[201]; ! 61: char *Malloc(); ! 62: FILE *terminal = NULL; ! 63: char junk[150]; ! 64: double cleft, cright; ! 65: timewarp = -1; ! 66: verbose = 0; ! 67: progname=argv[0]; ! 68: map = NULL; ! 69: debug = 0; ! 70: ! 71: for(argc--, argv++; *argv && (**argv == '-' ); argv++){ ! 72: switch(argv[0][1]){ ! 73: case 'B': ! 74: blueback++; ! 75: break; ! 76: case 'D': ! 77: debug++; ! 78: break; ! 79: case 'S': ! 80: switch(argv[0][2]){ ! 81: case 'a': ! 82: case 'A': singstep = 1; ! 83: terminal=NULL; ! 84: break; ! 85: case 'f': ! 86: case 'F': singstep = 1; ! 87: terminal = fopen("/dev/tty","r"); ! 88: if(terminal==NULL) error("can't open /dev/tty"); ! 89: break; ! 90: case 'M': singstep = 1; ! 91: if(argv[0][3]!='\0') holly = atoi(&argv[0][3]); ! 92: else holly = 1; ! 93: break; ! 94: } ! 95: break; ! 96: case 'b': ! 97: blanking = 0; ! 98: break; ! 99: case 'c': ! 100: ncolor = atoi(&argv[0][2]); ! 101: break; ! 102: case 'm': ! 103: map = &argv[0][2]; ! 104: break; ! 105: case 'p': ! 106: sscanf(&argv[0][2], "%d",&period); ! 107: break; ! 108: case 't': ! 109: i = sscanf(&argv[0][2], "%he, %he", &ts, &te); ! 110: if(i<=0) error("bad TS,TE"); ! 111: timewarp = i; ! 112: break; ! 113: case 'v': ! 114: verbose++; ! 115: if(argv[0][2]=='c') printcol++; ! 116: break; ! 117: case 'w': ! 118: coldstart = 0; ! 119: break; ! 120: case 'T': ! 121: case 'g': ! 122: case 's': ! 123: break; ! 124: default: ! 125: err: ! 126: fprintf(stderr,"unrecognized option: %s\n",argv[0]); ! 127: exit(1); ! 128: } ! 129: } ! 130: ! 131: if(*map=='a'){ ncolor=63; } ! 132: if((timewarp>=0)&&verbose) ! 133: fprintf(stderr,"timewarp=%d ts=%g te=%g\n",timewarp,ts,te); ! 134: rd2dh(0,&nx,&ny); ! 135: if((timewarp>=0)&&verbose) ! 136: fprintf(stderr,"timewarp=%d ts=%g te=%g\n",timewarp,ts,te); ! 137: if(verbose){ ! 138: fprintf(stderr,"nx=%d ny=%d\n",nx,ny); ! 139: fprintf(stderr,"fmin=%g fmax=%g\n",rd.fmin,rd.fmax); ! 140: if(holly) fprintf(stderr,"snap %d\n",holly); ! 141: } ! 142: if((nx>512)||(ny>512)) error("picture too large %d,%d\n",nx,ny); ! 143: v = (short *)Malloc(nx*ny*sizeof(short)); ! 144: pict = (char *)Malloc(nx*ny*sizeof(char)); ! 145: if(!debug) cvinit(coldstart); ! 146: ! 147: j = (nx>ny)?nx:ny; ! 148: if ( j>256 ){ ps=512; wid=1; } ! 149: else if( j>128 ){ ps=256; wid=2; } ! 150: else if( j> 64 ){ ps=128; wid=4; } ! 151: else { ps= 64; wid=8; } ! 152: ! 153: prange = ((int)rd.pmax)-rd.pmin; ! 154: if(prange==0) prange = 1; ! 155: if(!debug){ ! 156: black = cvmap(map,ncolor-1,mapr,mapg,mapb); ! 157: if(blueback){ cvput(0x1C);cvput(black);cvput(0);cvput(0);cvput(120); } ! 158: cvvalue(black,black,black); ! 159: cvflood(); ! 160: j = (nx>ny)?nx:ny; ! 161: if ( j>256 ){ zoom(1); } ! 162: else if( j>128 ){ zoom(2); } ! 163: else if( j> 64 ){ zoom(4); } ! 164: else { zoom(8); } ! 165: if(printcol){ ! 166: for(j=0; j<=ncolor-1; j++){ ! 167: cleft = rd.fmin + j*(rd.fmax-rd.fmin)/ncolor; ! 168: cright = rd.fmin + (j+1)*(rd.fmax-rd.fmin)/ncolor; ! 169: fprintf(stderr,"color %4d%4d%4d = %g to %g\n", ! 170: mapr[j], mapg[j], mapb[j], cleft, cright ); ! 171: } ! 172: } ! 173: } ! 174: ! 175: frame=1; /* frame 0 intentionally left blank */ ! 176: while(rd2di(&frtime,v)){ ! 177: if((timewarp>=0)&&(frtime>te)) break; ! 178: if(verbose) fprintf(stderr,"time=%.9g frame %d\n",frtime,frame); ! 179: if(frame<200) tim[frame]=frtime; ! 180: if(coldstart!=0){ ! 181: fx = frame%wid; ! 182: fy = (frame/wid)%wid; ! 183: fz = frame/(wid*wid); ! 184: if(singstep){ fx=1; fy=1; fz=1; } ! 185: if(fz>2) error("too many frames %d time=%g",frame,frtime); ! 186: p = pict; ! 187: q = v; ! 188: if(*map=='a'){ ! 189: qend = q+nx*ny; ! 190: for(; q<qend; q++,p++){ ! 191: *p = *q; ! 192: } ! 193: }else{ ! 194: rmin = rd.pmin; ! 195: ncolor1 = ncolor-1; ! 196: qend = q+nx*ny; ! 197: for(; q<qend; q++,p++){ ! 198: r = *q; ! 199: if( r < -BIG ){ *p = black; } ! 200: else{ ! 201: *p = ((r-rmin)*ncolor1)/prange; ! 202: } ! 203: } ! 204: } ! 205: if(!debug){ ! 206: cvload(4,ps*fx+nx/2,ps*fy+ny/2); ! 207: lutrte(bankl[fz]); ! 208: image(pict, ps*fx, ps*fy, ps*fx + nx-1, ps*fy + ny-1, bankc[fz]); ! 209: cvflush(); ! 210: } ! 211: if(singstep){ ! 212: if(holly){ ! 213: /* ***commented out because rd.nfr no longer defined*** ! 214: fprintf(stderr,"time=%g %.1f\n",frtime, ! 215: holly*13.5*(rd.nfr-frame+1)/60.); /**/ ! 216: sprintf(junk,"snap %d",holly); ! 217: system(junk); ! 218: }else if(terminal==NULL){ ! 219: fprintf(stderr,"time=%g frame %d\n",frtime,frame); ! 220: }else{ ! 221: fprintf(stderr,"time=%g frame %d GO? ",frtime,frame); ! 222: fgets(junk,100,terminal); ! 223: if((junk[0]=='s')||(junk[0]=='S')){ ! 224: system("snap"); ! 225: junk[0]=' '; ! 226: } ! 227: if(sscanf(junk,"%d",&j)==1){ ! 228: if(verbose) fprintf(stderr," skipping %d.. ",j); ! 229: frame += j-1; ! 230: rd2dj(j-1); ! 231: } ! 232: } ! 233: } ! 234: } ! 235: frame++; ! 236: } ! 237: nframe = frame-1; ! 238: if(verbose) fprintf(stderr,"%d frames\n%d colors\n",nframe,ncolor); ! 239: if(debug||singstep){ exit(0); } ! 240: ! 241: if(nframe>1){ ! 242: if(nframe>200) nframe = 200; ! 243: period *= 1000; /* convert to milliseconds */ ! 244: ttim = (tim[nframe]-tim[1]); ! 245: if(ttim<=0){ /* if user gave unreasonable times, fake it */ ! 246: for(i=2; i<=nframe; i++){ ! 247: tim[i] = tim[i-1]+1; ! 248: } ! 249: } ! 250: tim[0] = 2*tim[1]-tim[2]; ! 251: tim[nframe+1] = 2*tim[nframe]-tim[nframe-1]; ! 252: ttim = (tim[nframe]-tim[1] + (tim[2]-tim[1]+tim[nframe]-tim[nframe-1])/2); ! 253: } ! 254: frame=1; ! 255: while(1){ /**** infinite loop ****/ ! 256: fx = frame%wid; ! 257: fy = (frame/wid)%wid; ! 258: fz = frame/(wid*wid); ! 259: cvload(4,ps*fx+nx/2,ps*fy+ny/2); ! 260: lutrte(bankl[fz]); ! 261: cvflush(); ! 262: if(nframe==1) exit(0); ! 263: ring = (frame==0)? 500: (period*(tim[frame+1]-tim[frame-1])) / (2*ttim); ! 264: /* conceptually, display frame i from halfway between (i-1,i) until ! 265: halfway between (i,i+1). ring = delay time in ms. */ ! 266: ring = (ring*60)/1000; /* convert to 1/60 sec ticks */ ! 267: while( ring>=120 ){ ! 268: nap(119); ! 269: ring -= 119; ! 270: } ! 271: nap(ring); ! 272: if(++frame>nframe){ ! 273: frame = blanking? 0: 1; ! 274: } ! 275: } ! 276: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.