ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/panim.c
Revision: 2.2
Committed: Sat Feb 22 02:07:27 2003 UTC (21 years, 2 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad3R5
Changes since 2.1: +1 -4 lines
Log Message:
Changes and check-in for 3.5 release
Includes new source files and modifications not recorded for many years
See ray/doc/notes/ReleaseNotes for notes between 3.1 and 3.5 release

File Contents

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