|
|
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.