ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/panim.c
Revision: 2.1
Committed: Tue Nov 12 16:05:34 1991 UTC (32 years, 6 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.8: +0 -0 lines
Log Message:
updated revision number for release 2.0

File Contents

# Content
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 FILE *popen();
23
24 char *pcom = NULL; /* pipe command */
25
26 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 } else if (!strcmp(*argv, "-u") && argv[1]) {
42 pcom = *++argv; argc--;
43 } else
44 break;
45 if (!argc) {
46 fputs("Usage: ", stderr);
47 fputs(progname, stderr);
48 fputs(" [-p port] [-u uncompress] hostname [-c copies][-r record] [frame] ..\n",
49 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 char command[128];
80 COLR scanin[SCANLINE];
81 int xres, yres;
82 int xbeg, ybeg;
83 FILE *fp;
84 int y;
85 register int x;
86 /* open file */
87 if (file == NULL) {
88 if (pcom != NULL)
89 fp = popen(pcom, "r");
90 else
91 fp = stdin;
92 file = "<stdin>";
93 } 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 perror(file);
102 exit(1);
103 }
104 /* get dimensions */
105 getheader(fp, NULL);
106 if (checkheader(fp, COLRFMT, NULL) < 0) {
107 fputs(file, stderr);
108 fputs(": not a Radiance picture\n", stderr);
109 exit(1);
110 }
111 if (fgetresolu(&xres, &yres, fp) != (YMAJOR|YDECR) ||
112 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 for (y = yres-1; y >= 0; y--) {
124 if (freadcolrs(scanin, xres, fp) < 0) {
125 fputs(file, stderr);
126 fputs(": read error\n", stderr);
127 exit(1);
128 }
129 normcolrs(scanin, xres, 0); /* normalize */
130 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 }
136 /* send frame */
137 scry_send_frame();
138 /* close file */
139 if (pcom != NULL)
140 pclose(fp);
141 else
142 fclose(fp);
143 }
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 val = pow((i+0.5)/256.0, 1.0/GAMMA) * 256.0;
153 if (val > 248) val = 248;
154 gammamap[i] = val;
155 }
156 }