ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pcomb.c
Revision: 1.4
Committed: Tue Jul 11 18:05:05 1989 UTC (34 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.3: +13 -8 lines
Log Message:
Changed variable evaluation to use pointer

File Contents

# Content
1 /* Copyright (c) 1989 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * Combine picture files according to calcomp functions.
9 *
10 * 1/4/89
11 */
12
13 #include <stdio.h>
14
15 #include <errno.h>
16
17 #include "color.h"
18
19 #include "calcomp.h"
20
21 #define MAXINP 16 /* maximum number of input files */
22
23 struct {
24 char *name; /* file name */
25 FILE *fp; /* stream pointer */
26 COLOR *scan; /* input scanline */
27 COLOR coef; /* coefficient */
28 } input[MAXINP]; /* input pictures */
29
30 int nfiles; /* number of input files */
31
32 char *vcolin[3] = {"ri", "gi", "bi"};
33 char *vcolout[3] = {"ro", "go", "bo"};
34
35 #define vxpos "x"
36 #define vypos "y"
37
38 int nowarn = 0; /* no warning messages? */
39
40 int xres=0, yres=0; /* picture resolution */
41
42 int xpos, ypos; /* picture position */
43
44
45 tputs(s) /* put out string preceded by a tab */
46 char *s;
47 {
48 putchar('\t');
49 fputs(s, stdout);
50 }
51
52
53 main(argc, argv)
54 int argc;
55 char *argv[];
56 {
57 extern double l_redin(), l_grnin(), l_bluin(), atof();
58 double f;
59 int a;
60
61 funset(vcolin[RED], 1, l_redin);
62 funset(vcolin[GRN], 1, l_grnin);
63 funset(vcolin[BLU], 1, l_bluin);
64
65 for (a = 1; a < argc; a++)
66 if (argv[a][0] == '-')
67 switch (argv[a][1]) {
68 case '\0':
69 case 's':
70 case 'c':
71 goto getfiles;
72 case 'x':
73 xres = atoi(argv[++a]);
74 break;
75 case 'y':
76 yres = atoi(argv[++a]);
77 break;
78 case 'w':
79 nowarn = !nowarn;
80 break;
81 case 'f':
82 fcompile(argv[++a]);
83 break;
84 case 'e':
85 scompile(NULL, argv[++a]);
86 break;
87 default:
88 goto usage;
89 }
90 else
91 break;
92 getfiles:
93 for (nfiles = 0; nfiles < MAXINP; nfiles++)
94 setcolor(input[nfiles].coef, 1.0, 1.0, 1.0);
95 nfiles = 0;
96 for ( ; a < argc; a++) {
97 if (nfiles >= MAXINP) {
98 eputs(argv[0]);
99 eputs(": too many picture files\n");
100 quit(1);
101 }
102 if (argv[a][0] == '-')
103 switch (argv[a][1]) {
104 case '\0':
105 input[nfiles].name = "<stdin>";
106 input[nfiles].fp = stdin;
107 break;
108 case 's':
109 f = atof(argv[++a]);
110 scalecolor(input[nfiles].coef, f);
111 continue;
112 case 'c':
113 colval(input[nfiles].coef,RED)*=atof(argv[++a]);
114 colval(input[nfiles].coef,GRN)*=atof(argv[++a]);
115 colval(input[nfiles].coef,BLU)*=atof(argv[++a]);
116 continue;
117 default:
118 goto usage;
119 }
120 else {
121 input[nfiles].name = argv[a];
122 input[nfiles].fp = fopen(argv[a], "r");
123 if (input[nfiles].fp == NULL) {
124 eputs(argv[a]);
125 eputs(": cannot open\n");
126 quit(1);
127 }
128 }
129 fputs(input[nfiles].name, stdout);
130 fputs(":\n", stdout);
131 getheader(input[nfiles].fp, tputs);
132 if (fscanf(input[nfiles].fp, "-Y %d +X %d\n", &ypos, &xpos) != 2) {
133 eputs(input[nfiles].name);
134 eputs(": bad picture size\n");
135 quit(1);
136 }
137 if (xres == 0 && yres == 0) {
138 xres = xpos;
139 yres = ypos;
140 } else if (xpos != xres || ypos != yres) {
141 eputs(argv[0]);
142 eputs(": resolution mismatch\n");
143 quit(1);
144 }
145 input[nfiles].scan = (COLOR *)emalloc(xres*sizeof(COLOR));
146 nfiles++;
147 }
148 printargs(argc, argv, stdout);
149 putchar('\n');
150 printf("-Y %d +X %d\n", yres, xres);
151 combine();
152 quit(0);
153 usage:
154 eputs("Usage: ");
155 eputs(argv[0]);
156 eputs(" [-w][-x xr][-y yr][-e expr][-f file] [ [-s f][-c r g b] picture ..]\n");
157 quit(1);
158 }
159
160
161 combine() /* combine pictures */
162 {
163 EPNODE *coldef[3];
164 COLOR *scanout;
165 register int i, j;
166 /* check defined variables */
167 for (j = 0; j < 3; j++) {
168 if (vardefined(vcolout[j]))
169 coldef[j] = eparse(vcolout[j]);
170 else
171 coldef[j] = NULL;
172 }
173 /* allocate scanline */
174 scanout = (COLOR *)emalloc(xres*sizeof(COLOR));
175 /* combine files */
176 for (ypos = yres-1; ypos >= 0; ypos--) {
177 for (i = 0; i < nfiles; i++)
178 if (freadscan(input[i].scan, xres, input[i].fp) < 0) {
179 eputs(input[i].name);
180 eputs(": read error\n");
181 quit(1);
182 }
183 varset(vypos, (double)ypos);
184 for (xpos = 0; xpos < xres; xpos++) {
185 varset(vxpos, (double)xpos);
186 eclock++;
187 for (j = 0; j < 3; j++) {
188 if (coldef[j] != NULL) {
189 colval(scanout[xpos],j) =
190 evalue(coldef[j]);
191 } else {
192 colval(scanout[xpos],j) = 0.0;
193 for (i = 0; i < nfiles; i++)
194 colval(scanout[xpos],j) +=
195 colval(input[i].coef,j) *
196 colval(input[i].scan[xpos],j);
197 }
198 if (colval(scanout[xpos],j) < 0.0)
199 colval(scanout[xpos],j) = 0.0;
200 }
201 }
202 if (fwritescan(scanout, xres, stdout) < 0) {
203 eputs("write error\n");
204 quit(1);
205 }
206 }
207 efree(scanout);
208 }
209
210
211 double
212 colin(fn, ci) /* return color value for picture */
213 register int fn, ci;
214 {
215 if (fn == 0)
216 return((double)nfiles);
217 if (fn < 1 || fn > nfiles) {
218 errno = EDOM;
219 return(0.0);
220 }
221 return(colval(input[fn-1].scan[xpos],ci));
222 }
223
224
225 double
226 l_redin() /* get red color */
227 {
228 return(colin((int)(argument(1)+.5), RED));
229 }
230
231
232 double
233 l_grnin() /* get green color */
234 {
235 return(colin((int)(argument(1)+.5), GRN));
236 }
237
238
239 double
240 l_bluin() /* get blue color */
241 {
242 return(colin((int)(argument(1)+.5), BLU));
243 }
244
245
246 wputs(msg)
247 char *msg;
248 {
249 if (!nowarn)
250 eputs(msg);
251 }
252
253
254 eputs(msg)
255 char *msg;
256 {
257 fputs(msg, stderr);
258 }
259
260
261 quit(code)
262 int code;
263 {
264 exit(code);
265 }