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