ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pcond2.c
Revision: 3.4
Committed: Thu Jan 9 13:56:28 1997 UTC (27 years, 3 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 3.3: +2 -1 lines
Log Message:
changed to histogram truncation
made veiling reflection modify FOV sample image

File Contents

# User Rev Content
1 greg 3.1 /* Copyright (c) 1996 Regents of the University of California */
2    
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * Input and output conditioning routines for pcond.
9     */
10    
11     #include "pcond.h"
12    
13    
14     RGBPRIMP inprims = stdprims; /* input primaries */
15     COLORMAT inrgb2xyz; /* convert input RGB to XYZ */
16     RGBPRIMP outprims = stdprims; /* output primaries */
17    
18     double (*lumf)() = rgblum; /* input luminance function */
19     double inpexp = 1.0; /* input exposure value */
20    
21     char *mbcalfile = NULL; /* macbethcal mapping file */
22    
23 greg 3.3 static struct mbc {
24     float xa[3][6], ya[3][6];
25     COLORMAT cmat;
26     } mbcond; /* macbethcal conditioning struct */
27 greg 3.1
28     static COLOR *scanbuf; /* scanline processing buffer */
29     static int nread; /* number of scanlines processed */
30    
31    
32     double
33     rgblum(clr, scotopic) /* compute (scotopic) luminance of RGB color */
34     COLOR clr;
35     int scotopic;
36     {
37     if (scotopic) /* approximate */
38     return( WHTSEFFICACY * (colval(clr,RED)*.062 +
39     colval(clr,GRN)*.608 + colval(clr,BLU)*.330) );
40     return( WHTEFFICACY * (colval(clr,RED)*inrgb2xyz[1][0] +
41     colval(clr,GRN)*inrgb2xyz[1][1] +
42     colval(clr,BLU)*inrgb2xyz[1][2]) );
43     }
44    
45    
46     double
47     cielum(xyz, scotopic) /* compute (scotopic) luminance of CIE color */
48     COLOR xyz;
49     int scotopic;
50     {
51     if (scotopic) /* approximate */
52     return(colval(xyz,CIEY) *
53     (1.33*(1. + (colval(xyz,CIEY)+colval(xyz,CIEZ))/
54     colval(xyz,CIEX)) - 1.68));
55     return(colval(xyz,CIEY));
56     }
57    
58    
59     COLOR *
60     nextscan() /* read and condition next scanline */
61     {
62     if (nread >= numscans(&inpres)) {
63     #ifdef DEBUG
64     fputs("done\n", stderr);
65     #endif
66 greg 3.4 free((char *)scanbuf);
67     return(scanbuf = NULL);
68 greg 3.1 }
69 greg 3.2 if (what2do&DO_ACUITY)
70     acuscan(scanbuf, nread);
71     else if (freadscan(scanbuf, scanlen(&inpres), infp) < 0) {
72 greg 3.1 fprintf(stderr, "%s: %s: scanline read error\n",
73     progname, infn);
74     exit(1);
75     }
76     if (what2do&DO_VEIL) /* add veiling */
77 greg 3.2 addveil(scanbuf, nread);
78 greg 3.1 if (what2do&DO_COLOR) /* scotopic color loss */
79     scotscan(scanbuf, scanlen(&inpres));
80     if (what2do&DO_LINEAR) /* map luminances */
81     sfscan(scanbuf, scanlen(&inpres), scalef);
82     else
83     mapscan(scanbuf, scanlen(&inpres));
84     if (mbcalfile != NULL) /* device color correction */
85     mbscan(scanbuf, scanlen(&inpres), &mbcond);
86     else if (lumf == cielum | inprims != outprims)
87     matscan(scanbuf, scanlen(&inpres), mbcond.cmat);
88 greg 3.2 nread++;
89 greg 3.1 return(scanbuf);
90     }
91    
92    
93     COLOR *
94     firstscan() /* return first processed scanline */
95     {
96     if (mbcalfile != NULL) /* load macbethcal file */
97     getmbcalfile(mbcalfile, &mbcond);
98     else
99     if (lumf == rgblum)
100     comprgb2rgbmat(mbcond.cmat, inprims, outprims);
101     else
102     compxyz2rgbmat(mbcond.cmat, outprims);
103 greg 3.2 if (what2do&DO_ACUITY) {
104     #ifdef DEBUG
105     fprintf(stderr, "%s: initializing acuity sampling...",
106     progname);
107     #endif
108     initacuity();
109     #ifdef DEBUG
110     fprintf(stderr, "done\n");
111     #endif
112     }
113 greg 3.1 scanbuf = (COLOR *)malloc(scanlen(&inpres)*sizeof(COLOR));
114     if (scanbuf == NULL)
115     syserror("malloc");
116     nread = 0;
117     #ifdef DEBUG
118     fprintf(stderr, "%s: processing image...", progname);
119     #endif
120     return(nextscan());
121     }
122    
123    
124     sfscan(sl, len, sf) /* apply scalefactor to scanline */
125     register COLOR *sl;
126     int len;
127     double sf;
128     {
129     while (len--) {
130     scalecolor(sl[0], sf);
131     sl++;
132     }
133     }
134    
135    
136     matscan(sl, len, mat) /* apply color matrix to scaline */
137     register COLOR *sl;
138     int len;
139     COLORMAT mat;
140     {
141     while (len--) {
142     colortrans(sl[0], mat, sl[0]);
143     sl++;
144     }
145     }
146    
147    
148     mbscan(sl, len, mb) /* apply macbethcal adj. to scaline */
149     COLOR *sl;
150     int len;
151     register struct mbc *mb;
152     {
153     double d;
154     register int i, j;
155    
156     while (len--) {
157     for (i = 0; i < 3; i++) {
158     d = colval(sl[0],i);
159     for (j = 0; j < 4 && mb->xa[i][j+1] <= d; j++)
160     ;
161     colval(sl[0],i) = ( (mb->xa[i][j+1] - d)*mb->ya[i][j] +
162     (d - mb->xa[i][j])*mb->ya[i][j+1] ) /
163     (mb->xa[i][j+1] - mb->xa[i][j]);
164     }
165     colortrans(sl[0], mb->cmat, sl[0]);
166     sl++;
167     }
168     }
169    
170    
171     getmbcalfile(fn, mb) /* load macbethcal file */
172     char *fn;
173     register struct mbc *mb;
174     {
175     extern char *fgets();
176     char buf[128];
177     FILE *fp;
178     int inpflags = 0;
179    
180     if ((fp = fopen(fn, "r")) == NULL)
181     syserror(fn);
182     while (fgets(buf, sizeof(buf), fp) != NULL) {
183     if (!(inpflags & 01) &&
184     sscanf(buf,
185     "rxa(i) : select(i,%f,%f,%f,%f,%f,%f)",
186     &mb->xa[0][0], &mb->xa[0][1],
187     &mb->xa[0][2], &mb->xa[0][3],
188     &mb->xa[0][4], &mb->xa[0][5]
189     ) == 6)
190     inpflags |= 01;
191     else if (!(inpflags & 02) &&
192     sscanf(buf,
193     "rya(i) : select(i,%f,%f,%f,%f,%f,%f)",
194     &mb->ya[0][0], &mb->ya[0][1],
195     &mb->ya[0][2], &mb->ya[0][3],
196     &mb->ya[0][4], &mb->ya[0][5]
197     ) == 6)
198     inpflags |= 02;
199     else if (!(inpflags & 04) &&
200     sscanf(buf,
201     "gxa(i) : select(i,%f,%f,%f,%f,%f,%f)",
202     &mb->xa[1][0], &mb->xa[1][1],
203     &mb->xa[1][2], &mb->xa[1][3],
204     &mb->xa[1][4], &mb->xa[1][5]
205     ) == 6)
206     inpflags |= 04;
207     else if (!(inpflags & 010) &&
208     sscanf(buf,
209     "gya(i) : select(i,%f,%f,%f,%f,%f,%f)",
210     &mb->ya[1][0], &mb->ya[1][1],
211     &mb->ya[1][2], &mb->ya[1][3],
212     &mb->ya[1][4], &mb->ya[1][5]
213     ) == 6)
214     inpflags |= 010;
215     else if (!(inpflags & 020) &&
216     sscanf(buf,
217     "bxa(i) : select(i,%f,%f,%f,%f,%f,%f)",
218     &mb->xa[2][0], &mb->xa[2][1],
219     &mb->xa[2][2], &mb->xa[2][3],
220     &mb->xa[2][4], &mb->xa[2][5]
221     ) == 6)
222     inpflags |= 020;
223     else if (!(inpflags & 040) &&
224     sscanf(buf,
225     "bya(i) : select(i,%f,%f,%f,%f,%f,%f)",
226     &mb->ya[2][0], &mb->ya[2][1],
227     &mb->ya[2][2], &mb->ya[2][3],
228     &mb->ya[2][4], &mb->ya[2][5]
229     ) == 6)
230     inpflags |= 040;
231     else if (!(inpflags & 0100) &&
232     sscanf(buf,
233     "ro = %f*rn + %f*gn + %f*bn",
234     &mb->cmat[0][0], &mb->cmat[0][1],
235     &mb->cmat[0][2]) == 3)
236     inpflags |= 0100;
237     else if (!(inpflags & 0200) &&
238     sscanf(buf,
239     "go = %f*rn + %f*gn + %f*bn",
240     &mb->cmat[1][0], &mb->cmat[1][1],
241     &mb->cmat[1][2]) == 3)
242     inpflags |= 0200;
243     else if (!(inpflags & 0400) &&
244     sscanf(buf,
245     "bo = %f*rn + %f*gn + %f*bn",
246     &mb->cmat[2][0], &mb->cmat[2][1],
247     &mb->cmat[2][2]) == 3)
248     inpflags |= 0400;
249     }
250     if (inpflags != 0777) {
251     fprintf(stderr,
252     "%s: cannot grok macbethcal file \"%s\" (inpflags==0%o)\n",
253     progname, fn, inpflags);
254     exit(1);
255     }
256     fclose(fp);
257     }