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

# User Rev Content
1 greg 1.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 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    
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 greg 1.3 extern double l_redin(), l_grnin(), l_bluin(), atof();
58     double f;
59 greg 1.1 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 greg 1.3 case 's':
70     case 'c':
71 greg 1.1 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 greg 1.3 goto usage;
89 greg 1.1 }
90     else
91     break;
92     getfiles:
93 greg 1.3 for (nfiles = 0; nfiles < MAXINP; nfiles++)
94     setcolor(input[nfiles].coef, 1.0, 1.0, 1.0);
95 greg 1.1 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 greg 1.3 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 greg 1.1 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 greg 1.3 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 greg 1.1 }
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 greg 1.3 colval(scanout[xpos],j) =
186     varvalue(vcolout[j]);
187 greg 1.1 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 greg 1.3 colval(scanout[xpos],j) +=
193     colval(input[i].coef,j) *
194     colval(input[i].scan[xpos],j);
195 greg 1.1 }
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     }