ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pcomb.c
Revision: 1.8
Committed: Thu Apr 18 08:05:57 1991 UTC (33 years ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 1.7: +67 -30 lines
Log Message:
added variables for luminance in and out, xres, yres, nfiles

File Contents

# User Rev Content
1 greg 1.8 /* Copyright (c) 1991 Regents of the University of California */
2 greg 1.1
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 greg 1.6 #define MAXINP 32 /* maximum number of input files */
22 greg 1.1
23     struct {
24     char *name; /* file name */
25     FILE *fp; /* stream pointer */
26     COLOR *scan; /* input scanline */
27 greg 1.3 COLOR coef; /* coefficient */
28 greg 1.1 } 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 greg 1.8 #define vbrtin "li"
35     #define vbrtout "lo"
36 greg 1.1
37 greg 1.8 #define vnfiles "nfiles"
38     #define vxres "xres"
39     #define vyres "yres"
40 greg 1.1 #define vxpos "x"
41     #define vypos "y"
42    
43     int nowarn = 0; /* no warning messages? */
44    
45     int xres=0, yres=0; /* picture resolution */
46    
47     int xpos, ypos; /* picture position */
48    
49    
50     tputs(s) /* put out string preceded by a tab */
51     char *s;
52     {
53     putchar('\t');
54     fputs(s, stdout);
55     }
56    
57    
58     main(argc, argv)
59     int argc;
60     char *argv[];
61     {
62 greg 1.8 extern double l_redin(), l_grnin(), l_bluin(), l_brtin(), atof();
63 greg 1.3 double f;
64 greg 1.1 int a;
65    
66     funset(vcolin[RED], 1, l_redin);
67     funset(vcolin[GRN], 1, l_grnin);
68     funset(vcolin[BLU], 1, l_bluin);
69 greg 1.8 funset(vbrtin, 1, l_brtin);
70 greg 1.1
71     for (a = 1; a < argc; a++)
72     if (argv[a][0] == '-')
73     switch (argv[a][1]) {
74     case '\0':
75 greg 1.3 case 's':
76     case 'c':
77 greg 1.1 goto getfiles;
78     case 'x':
79     xres = atoi(argv[++a]);
80     break;
81     case 'y':
82     yres = atoi(argv[++a]);
83     break;
84     case 'w':
85     nowarn = !nowarn;
86     break;
87     case 'f':
88     fcompile(argv[++a]);
89     break;
90     case 'e':
91 greg 1.7 scompile(argv[++a], NULL, 0);
92 greg 1.1 break;
93     default:
94 greg 1.3 goto usage;
95 greg 1.1 }
96     else
97     break;
98     getfiles:
99 greg 1.3 for (nfiles = 0; nfiles < MAXINP; nfiles++)
100     setcolor(input[nfiles].coef, 1.0, 1.0, 1.0);
101 greg 1.1 nfiles = 0;
102     for ( ; a < argc; a++) {
103     if (nfiles >= MAXINP) {
104     eputs(argv[0]);
105     eputs(": too many picture files\n");
106     quit(1);
107     }
108 greg 1.3 if (argv[a][0] == '-')
109     switch (argv[a][1]) {
110     case '\0':
111     input[nfiles].name = "<stdin>";
112     input[nfiles].fp = stdin;
113     break;
114     case 's':
115     f = atof(argv[++a]);
116     scalecolor(input[nfiles].coef, f);
117     continue;
118     case 'c':
119     colval(input[nfiles].coef,RED)*=atof(argv[++a]);
120     colval(input[nfiles].coef,GRN)*=atof(argv[++a]);
121     colval(input[nfiles].coef,BLU)*=atof(argv[++a]);
122     continue;
123     default:
124     goto usage;
125     }
126     else {
127 greg 1.1 input[nfiles].name = argv[a];
128     input[nfiles].fp = fopen(argv[a], "r");
129     if (input[nfiles].fp == NULL) {
130 greg 1.6 perror(argv[a]);
131 greg 1.1 quit(1);
132     }
133     }
134     fputs(input[nfiles].name, stdout);
135     fputs(":\n", stdout);
136     getheader(input[nfiles].fp, tputs);
137 greg 1.5 if (fgetresolu(&xpos, &ypos, input[nfiles].fp) !=
138     (YMAJOR|YDECR)) {
139 greg 1.1 eputs(input[nfiles].name);
140     eputs(": bad picture size\n");
141     quit(1);
142     }
143     if (xres == 0 && yres == 0) {
144     xres = xpos;
145     yres = ypos;
146     } else if (xpos != xres || ypos != yres) {
147     eputs(argv[0]);
148     eputs(": resolution mismatch\n");
149     quit(1);
150     }
151     input[nfiles].scan = (COLOR *)emalloc(xres*sizeof(COLOR));
152     nfiles++;
153     }
154     printargs(argc, argv, stdout);
155     putchar('\n');
156 greg 1.5 fputresolu(YMAJOR|YDECR, xres, yres, stdout);
157 greg 1.1 combine();
158     quit(0);
159 greg 1.3 usage:
160     eputs("Usage: ");
161     eputs(argv[0]);
162     eputs(" [-w][-x xr][-y yr][-e expr][-f file] [ [-s f][-c r g b] picture ..]\n");
163     quit(1);
164 greg 1.1 }
165    
166    
167     combine() /* combine pictures */
168     {
169 greg 1.8 EPNODE *coldef[3], *brtdef;
170 greg 1.1 COLOR *scanout;
171 greg 1.8 double d;
172 greg 1.1 register int i, j;
173     /* check defined variables */
174 greg 1.4 for (j = 0; j < 3; j++) {
175     if (vardefined(vcolout[j]))
176     coldef[j] = eparse(vcolout[j]);
177     else
178     coldef[j] = NULL;
179     }
180 greg 1.8 if (vardefined(vbrtout))
181     brtdef = eparse(vbrtout);
182     else
183     brtdef = NULL;
184     /* predefine variables */
185     varset(vnfiles, (double)nfiles);
186     varset(vxres, (double)xres);
187     varset(vyres, (double)yres);
188 greg 1.1 /* allocate scanline */
189     scanout = (COLOR *)emalloc(xres*sizeof(COLOR));
190     /* combine files */
191     for (ypos = yres-1; ypos >= 0; ypos--) {
192 greg 1.8 for (i = 0; i < nfiles; i++)
193     if (freadscan(input[i].scan, xres, input[i].fp) < 0) {
194     eputs(input[i].name);
195     eputs(": read error\n");
196     quit(1);
197     }
198     varset(vypos, (double)ypos);
199     for (xpos = 0; xpos < xres; xpos++) {
200     varset(vxpos, (double)xpos);
201     eclock++;
202     if (brtdef != NULL) {
203     d = evalue(brtdef);
204     if (d < 0.0)
205     d = 0.0;
206     setcolor(scanout[xpos], d, d, d);
207     } else {
208     for (j = 0; j < 3; j++) {
209     if (coldef[j] != NULL) {
210     colval(scanout[xpos],j) = evalue(coldef[j]);
211     } else {
212     colval(scanout[xpos],j) = 0.0;
213     for (i = 0; i < nfiles; i++)
214     colval(scanout[xpos],j) +=
215     colval(input[i].coef,j) *
216     colval(input[i].scan[xpos],j);
217 greg 1.1 }
218 greg 1.8 if (colval(scanout[xpos],j) < 0.0)
219     colval(scanout[xpos],j) = 0.0;
220     }
221 greg 1.1 }
222 greg 1.8 }
223     if (fwritescan(scanout, xres, stdout) < 0) {
224     perror("write error");
225     quit(1);
226     }
227 greg 1.1 }
228     efree(scanout);
229     }
230    
231    
232     double
233     colin(fn, ci) /* return color value for picture */
234     register int fn, ci;
235     {
236     if (fn == 0)
237     return((double)nfiles);
238     if (fn < 1 || fn > nfiles) {
239     errno = EDOM;
240     return(0.0);
241     }
242     return(colval(input[fn-1].scan[xpos],ci));
243     }
244    
245    
246     double
247     l_redin() /* get red color */
248     {
249     return(colin((int)(argument(1)+.5), RED));
250     }
251    
252    
253     double
254     l_grnin() /* get green color */
255     {
256     return(colin((int)(argument(1)+.5), GRN));
257     }
258    
259    
260     double
261     l_bluin() /* get blue color */
262     {
263     return(colin((int)(argument(1)+.5), BLU));
264 greg 1.8 }
265    
266    
267     double
268     l_brtin() /* get brightness value */
269     {
270     register int fn;
271    
272     fn = argument(1)+.5;
273     if (fn == 0)
274     return((double)nfiles);
275     if (fn < 1 || fn > nfiles) {
276     errno = EDOM;
277     return(0.0);
278     }
279     return(bright(input[fn-1].scan[xpos]));
280 greg 1.1 }
281    
282    
283     wputs(msg)
284     char *msg;
285     {
286     if (!nowarn)
287     eputs(msg);
288     }
289    
290    
291     eputs(msg)
292     char *msg;
293     {
294     fputs(msg, stderr);
295     }
296    
297    
298     quit(code)
299     int code;
300     {
301     exit(code);
302     }