ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/panim.c
Revision: 1.8
Committed: Thu Apr 18 14:35:15 1991 UTC (33 years ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.7: +5 -0 lines
Log Message:
added format information to headers

File Contents

# User Rev Content
1 greg 1.1 /* Copyright (c) 1988 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * Send pictures to PC animation system.
9     *
10     * 6/20/88
11     */
12    
13     #include <stdio.h>
14    
15     #include "random.h"
16     #include "color.h"
17     #include "clntrpc.h"
18     #include "scan.h"
19    
20     #define GAMMA 2.0 /* gamma correction factor */
21    
22 greg 1.5 FILE *popen();
23    
24     char *pcom = NULL; /* pipe command */
25    
26 greg 1.1 BYTE gammamap[256]; /* gamma correction table */
27    
28    
29     main(argc, argv)
30     int argc;
31     char *argv[];
32     {
33     char *progname;
34     int nframes;
35     int port = PCPROGRAM;
36     /* initialize */
37     compgamma();
38     for (progname = *argv++; --argc; argv++)
39     if (!strcmp(*argv, "-p") && argv[1]) {
40     port = atoi(*++argv); argc--;
41 greg 1.5 } else if (!strcmp(*argv, "-u") && argv[1]) {
42     pcom = *++argv; argc--;
43 greg 1.1 } else
44     break;
45     if (!argc) {
46     fputs("Usage: ", stderr);
47     fputs(progname, stderr);
48 greg 1.5 fputs(" [-p port] [-u uncompress] hostname [-c copies][-r record] [frame] ..\n",
49 greg 1.1 stderr);
50     exit(1);
51     }
52     scry_open(*argv++, TCP, port);
53     scry_set_compress(NONE);
54     scry_set_image(TARGA_IMAGE);
55     scry_set_record(PREVIEW);
56     scry_set_copy_num(3);
57     /* send frames */
58     nframes = 0;
59     for ( ; --argc; argv++)
60     if (!strcmp(*argv, "-r") && argv[1]) {
61     scry_set_record(atoi(*++argv)); argc--;
62     } else if (!strcmp(*argv, "-c") && argv[1]) {
63     scry_set_copy_num(atoi(*++argv)); argc--;
64     } else {
65     sendframe(*argv);
66     nframes++;
67     }
68     if (nframes == 0) /* get stdin */
69     sendframe(NULL);
70     /* clean up */
71     scry_close();
72     exit(0);
73     }
74    
75    
76     sendframe(file) /* convert and send a frame */
77     char *file;
78     {
79 greg 1.5 char command[128];
80 greg 1.1 COLR scanin[SCANLINE];
81     int xres, yres;
82     int xbeg, ybeg;
83     FILE *fp;
84 greg 1.3 int y;
85     register int x;
86 greg 1.1 /* open file */
87     if (file == NULL) {
88 greg 1.5 if (pcom != NULL)
89     fp = popen(pcom, "r");
90     else
91     fp = stdin;
92 greg 1.1 file = "<stdin>";
93 greg 1.5 } else {
94     if (pcom != NULL) {
95     sprintf(command, "( %s ) < %s", pcom, file);
96     fp = popen(command, "r");
97     } else
98     fp = fopen(file, "r");
99     }
100     if (fp == NULL) {
101 greg 1.1 perror(file);
102     exit(1);
103     }
104     /* get dimensions */
105     getheader(fp, NULL);
106 greg 1.8 if (checkheader(fp, COLRFMT, NULL) < 0) {
107     fputs(file, stderr);
108     fputs(": not a Radiance picture\n", stderr);
109     exit(1);
110     }
111 greg 1.2 if (fgetresolu(&xres, &yres, fp) != (YMAJOR|YDECR) ||
112 greg 1.1 xres > SCANLINE || yres > NUMSCANS) {
113     fputs(file, stderr);
114     fputs(": bad picture size\n", stderr);
115     exit(1);
116     }
117     /* compute center */
118     xbeg = (SCANLINE-xres)/2;
119     ybeg = (NUMSCANS-yres)/2;
120     /* clear output */
121     bzero(sc_frame_arr, sizeof(sc_frame_arr));
122     /* get frame */
123 greg 1.3 for (y = yres-1; y >= 0; y--) {
124 greg 1.1 if (freadcolrs(scanin, xres, fp) < 0) {
125     fputs(file, stderr);
126     fputs(": read error\n", stderr);
127     exit(1);
128     }
129 greg 1.4 normcolrs(scanin, xres, 0); /* normalize */
130 greg 1.3 for (x = 0; x < xres; x++) /* convert */
131     sc_frame_arr[y+ybeg][x+xbeg] =
132     ((gammamap[scanin[x][RED]]+(random()&7))&0xf8)<<7
133     | ((gammamap[scanin[x][GRN]]+(random()&7))&0xf8)<<2
134     | (gammamap[scanin[x][BLU]]+(random()&7))>>3;
135 greg 1.1 }
136     /* send frame */
137     scry_send_frame();
138     /* close file */
139 greg 1.5 if (pcom != NULL)
140     pclose(fp);
141     else
142     fclose(fp);
143 greg 1.1 }
144    
145    
146     compgamma() /* compute gamma correction map */
147     {
148     extern double pow();
149     register int i, val;
150    
151     for (i = 0; i < 256; i++) {
152 greg 1.7 val = pow((i+0.5)/256.0, 1.0/GAMMA) * 256.0;
153 greg 1.1 if (val > 248) val = 248;
154     gammamap[i] = val;
155     }
156     }