ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pcond2.c
(Generate patch)

Comparing ray/src/px/pcond2.c (file contents):
Revision 3.11 by schorsch, Sun Jul 27 22:12:03 2003 UTC vs.
Revision 3.16 by greg, Thu Sep 8 21:16:44 2005 UTC

# Line 31 | Line 31 | static WARP3D  *cwarp;                 /* color warping structure */
31   static COLOR    *scanbuf;               /* scanline processing buffer */
32   static int      nread;                  /* number of scanlines processed */
33  
34 + static void sfscan(COLOR *sl, int len, double sf);
35 + static void matscan(COLOR *sl, int len, COLORMAT mat);
36 + static void mbscan(COLOR *sl, int len, struct mbc *mb);
37 + static void cwscan(COLOR *sl, int len, WARP3D *wp);
38 + static void getmbcalfile(char *fn, struct mbc *mb);
39  
40 < double
41 < rgblum(clr, scotopic)           /* compute (scotopic) luminance of RGB color */
42 < COLOR   clr;
43 < int     scotopic;
40 >
41 > extern double
42 > rgblum(         /* compute (scotopic) luminance of RGB color */
43 >        COLOR   clr,
44 >        int     scotopic
45 > )
46   {
47          if (scotopic)           /* approximate */
48                  return( WHTSEFFICACY * (colval(clr,RED)*.062 +
# Line 46 | Line 53 | int    scotopic;
53   }
54  
55  
56 < double
57 < cielum(xyz, scotopic)           /* compute (scotopic) luminance of CIE color */
58 < COLOR   xyz;
59 < int     scotopic;
56 > extern double
57 > cielum(         /* compute (scotopic) luminance of CIE color */
58 >        COLOR   xyz,
59 >        int     scotopic
60 > )
61   {
62          if (scotopic)           /* approximate */
63                  return(colval(xyz,CIEY) *
# Line 59 | Line 67 | int    scotopic;
67   }
68  
69  
70 < COLOR *
71 < nextscan()                              /* read and condition next scanline */
70 > extern COLOR *
71 > nextscan(void)                          /* read and condition next scanline */
72   {
73          if (nread >= numscans(&inpres)) {
74                  if (cwarpfile != NULL)
# Line 94 | Line 102 | nextscan()                             /* read and condition next scanline */
102   }
103  
104  
105 < COLOR *
106 < firstscan()                             /* return first processed scanline */
105 > extern COLOR *
106 > firstscan(void)                         /* return first processed scanline */
107   {
108          if (mbcalfile != NULL)          /* load macbethcal file */
109                  getmbcalfile(mbcalfile, &mbcond);
# Line 117 | Line 125 | firstscan()                            /* return first processed scanline */
125   }
126  
127  
128 < sfscan(sl, len, sf)                     /* apply scalefactor to scanline */
129 < register COLOR  *sl;
130 < int     len;
131 < double  sf;
128 > static void
129 > sfscan(                 /* apply scalefactor to scanline */
130 >        register COLOR  *sl,
131 >        int     len,
132 >        double  sf
133 > )
134   {
135          while (len--) {
136                  scalecolor(sl[0], sf);
# Line 129 | Line 139 | double sf;
139   }
140  
141  
142 < matscan(sl, len, mat)                   /* apply color matrix to scaline */
143 < register COLOR  *sl;
144 < int     len;
145 < COLORMAT        mat;
142 > static double
143 > greypoint(                      /* compute gamut mapping grey target */
144 >        COLOR col
145 > )
146   {
147 +        COLOR   gryc;
148 +        int     i;
149 +                                /* improves saturated color rendering */
150 +        copycolor(gryc, col);
151 +        for (i = 3; i--; )
152 +                if (gryc[i] > cwhite[i])
153 +                        gryc[i] = cwhite[i];
154 +                else if (gryc[i] < cblack[i])
155 +                        gryc[i] = cblack[i];
156 +        return((*lumf)(gryc,0));
157 + }
158 +
159 +
160 + static void
161 + matscan(                        /* apply color matrix to scaline */
162 +        register COLOR  *sl,
163 +        int     len,
164 +        COLORMAT        mat
165 + )
166 + {
167 +        double  gryv;
168 +
169          while (len--) {
170 +                gryv = greypoint(sl[0]);
171                  colortrans(sl[0], mat, sl[0]);
172 <                clipgamut(sl[0], bright(sl[0]), CGAMUT, cblack, cwhite);
172 >                clipgamut(sl[0], gryv, CGAMUT, cblack, cwhite);
173                  sl++;
174          }
175   }
176  
177  
178 < mbscan(sl, len, mb)                     /* apply macbethcal adj. to scaline */
179 < COLOR   *sl;
180 < int     len;
181 < register struct mbc     *mb;
178 > static void
179 > mbscan(                 /* apply macbethcal adj. to scaline */
180 >        COLOR   *sl,
181 >        int     len,
182 >        register struct mbc     *mb
183 > )
184   {
185          double  d;
186          register int    i, j;
187  
188          while (len--) {
189 +                d = greypoint(sl[0]);
190                  colortrans(sl[0], mb->cmat, sl[0]);
191 <                clipgamut(sl[0], bright(sl[0]), CGAMUT, mb->cmin, mb->cmax);
191 >                clipgamut(sl[0], d, CGAMUT, mb->cmin, mb->cmax);
192                  for (i = 0; i < 3; i++) {
193                          d = colval(sl[0],i);
194                          for (j = 0; j < 4 && mb->xa[i][j+1] <= d; j++)
# Line 166 | Line 202 | register struct mbc    *mb;
202   }
203  
204  
205 < cwscan(sl, len, wp)                     /* apply color space warp to scaline */
206 < COLOR   *sl;
207 < int     len;
208 < WARP3D  *wp;
205 > static void
206 > cwscan(                 /* apply color space warp to scaline */
207 >        COLOR   *sl,
208 >        int     len,
209 >        WARP3D  *wp
210 > )
211   {
212          int     rval;
213 +        double  gryv;
214  
215          while (len--) {
216 +                gryv = greypoint(sl[0]);
217                  rval = warp3d(sl[0], sl[0], wp);
218                  if (rval & W3ERROR)
219                          syserror("warp3d");
# Line 182 | Line 222 | WARP3D *wp;
222                                          progname, cwarpfile);
223                          exit(1);
224                  }
225 <                clipgamut(sl[0], bright(sl[0]), CGAMUT, cblack, cwhite);
225 >                clipgamut(sl[0], gryv, CGAMUT, cblack, cwhite);
226                  sl++;
227          }
228   }
229  
230  
231 < getmbcalfile(fn, mb)                    /* load macbethcal file */
232 < char    *fn;
233 < register struct mbc     *mb;
231 > static void
232 > getmbcalfile(                   /* load macbethcal file */
233 >        char    *fn,
234 >        register struct mbc     *mb
235 > )
236   {
195        extern char     *fgets();
237          char    buf[128];
238          FILE    *fp;
239          int     inpflags = 0;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines