ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pcomb.c
Revision: 1.3
Committed: Tue Jul 11 17:13:44 1989 UTC (34 years, 9 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +37 -11 lines
Log Message:
Added coefficient for faster combination

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 int coldef[3];
164 COLOR *scanout;
165 register int i, j;
166 /* check defined variables */
167 for (j = 0; j < 3; j++)
168 coldef[j] = vardefined(vcolout[j]);
169 /* allocate scanline */
170 scanout = (COLOR *)emalloc(xres*sizeof(COLOR));
171 /* combine files */
172 for (ypos = yres-1; ypos >= 0; ypos--) {
173 for (i = 0; i < nfiles; i++)
174 if (freadscan(input[i].scan, xres, input[i].fp) < 0) {
175 eputs(input[i].name);
176 eputs(": read error\n");
177 quit(1);
178 }
179 varset(vypos, (double)ypos);
180 for (xpos = 0; xpos < xres; xpos++) {
181 varset(vxpos, (double)xpos);
182 eclock++;
183 for (j = 0; j < 3; j++)
184 if (coldef[j]) {
185 colval(scanout[xpos],j) =
186 varvalue(vcolout[j]);
187 if (colval(scanout[xpos],j) < 0.0)
188 colval(scanout[xpos],j) = 0.0;
189 } else {
190 colval(scanout[xpos],j) = 0.0;
191 for (i = 0; i < nfiles; i++)
192 colval(scanout[xpos],j) +=
193 colval(input[i].coef,j) *
194 colval(input[i].scan[xpos],j);
195 }
196 }
197 if (fwritescan(scanout, xres, stdout) < 0) {
198 eputs("write error\n");
199 quit(1);
200 }
201 }
202 efree(scanout);
203 }
204
205
206 double
207 colin(fn, ci) /* return color value for picture */
208 register int fn, ci;
209 {
210 if (fn == 0)
211 return((double)nfiles);
212 if (fn < 1 || fn > nfiles) {
213 errno = EDOM;
214 return(0.0);
215 }
216 return(colval(input[fn-1].scan[xpos],ci));
217 }
218
219
220 double
221 l_redin() /* get red color */
222 {
223 return(colin((int)(argument(1)+.5), RED));
224 }
225
226
227 double
228 l_grnin() /* get green color */
229 {
230 return(colin((int)(argument(1)+.5), GRN));
231 }
232
233
234 double
235 l_bluin() /* get blue color */
236 {
237 return(colin((int)(argument(1)+.5), BLU));
238 }
239
240
241 wputs(msg)
242 char *msg;
243 {
244 if (!nowarn)
245 eputs(msg);
246 }
247
248
249 eputs(msg)
250 char *msg;
251 {
252 fputs(msg, stderr);
253 }
254
255
256 quit(code)
257 int code;
258 {
259 exit(code);
260 }