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

Comparing ray/src/px/pf2.c (file contents):
Revision 1.1 by greg, Thu Feb 2 10:49:24 1989 UTC vs.
Revision 2.6 by greg, Sat Feb 22 02:07:27 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1986 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   *  pf2.c - routines used by pfilt.
9 *
10 *     10/3/85
6   */
7  
8   #include  <stdio.h>
9  
10 + #include  <stdlib.h>
11 +
12 + #include  <math.h>
13 +
14   #include  "random.h"
15  
16   #include  "color.h"
17  
18 < #define  PI             3.14159265359
18 > #define  PI             3.14159265359
19  
20 < #define  FTINY          (1e-6)
20 > #define  FTINY          (1e-6)
21  
22   extern int  nrows, ncols;       /* number of rows and columns for output */
23  
# Line 36 | Line 35 | extern char  *progname;
35  
36   extern COLOR  exposure;         /* exposure for frame */
37  
38 < #define  AVGLVL         0.5     /* target mean brightness */
38 > extern double  (*ourbright)();  /* brightness calculation function */
39  
40 < double  avgbrt;                 /* average picture brightness */
40 > #define  AVGLVL         0.5     /* target mean brightness */
41  
42 < typedef struct  hotpix {        /* structure for avgbrt pixels */
42 > double  avgbrt;                 /* average picture brightness */
43 > long    npix;                   /* # pixels in average */
44 >
45 > typedef struct  hotpix {        /* structure for avgbrt pixels */
46          struct hotpix  *next;   /* next in list */
47          COLOR  val;             /* pixel color */
48          short  x, y;            /* pixel position */
49          float  slope;           /* random slope for diffraction */
50   }  HOTPIX;
51  
52 < HOTPIX  *head;                  /* head of avgbrt pixel list */
52 > HOTPIX  *head;                  /* head of avgbrt pixel list */
53  
54 < double  sprdfact;               /* computed spread factor */
54 > double  sprdfact;               /* computed spread factor */
55  
56  
57   pass1init()                     /* prepare for first pass */
58   {
59          avgbrt = 0.0;
60 +        npix = 0;
61          head = NULL;
62   }
63  
64  
65   pass1default()                  /* for single pass */
66   {
67 <        avgbrt = AVGLVL * xres * yres;
67 >        avgbrt = AVGLVL;
68 >        npix = 1;
69          head = NULL;
70   }
71  
72  
73   pass1scan(scan, y)              /* process first pass scanline */
74 < register COLOR  *scan;
74 > register COLOR  *scan;
75   int  y;
76   {
77 <        extern char  *malloc();
74 <        extern double  tan(), sqrt();
75 <        double  cbrt;
77 >        double  cbrt;
78          register int  x;
79 <        register HOTPIX  *hp;
79 >        register HOTPIX  *hp;
80  
81          for (x = 0; x < xres; x++) {
82          
83 <                cbrt = bright(scan[x]);
83 >                cbrt = (*ourbright)(scan[x]);
84  
85 <                if (avghot || cbrt < hotlvl)
86 <                        avgbrt += cbrt;
85 >                if (cbrt <= 0)
86 >                        continue;
87  
88 +                if (avghot || cbrt < hotlvl) {
89 +                        avgbrt += cbrt;
90 +                        npix++;
91 +                }
92                  if (npts && cbrt >= hotlvl) {
93                          hp = (HOTPIX *)malloc(sizeof(HOTPIX));
94                          if (hp == NULL) {
# Line 103 | Line 109 | int  y;
109  
110   pass2init()                     /* prepare for final pass */
111   {
112 <        avgbrt /= (double)xres * yres;
113 <
114 <        if (avgbrt <= FTINY) {
109 <                fprintf(stderr, "%s: picture too dark\n", progname);
112 >        if (!npix) {
113 >                fprintf(stderr, "%s: picture too dark or too bright\n",
114 >                                progname);
115                  quit(1);
116          }
117 +        avgbrt /= (double)npix;
118  
119          scalecolor(exposure,  AVGLVL/avgbrt);
120          
121 <        sprdfact = spread / (hotlvl * bright(exposure))
121 >        sprdfact = spread / (hotlvl * (*ourbright)(exposure))
122                          * ((double)xres*xres + (double)yres*yres) / 4.0;
123   }
124  
125  
126   pass2scan(scan, y)              /* process final pass scanline */
127 < register COLOR  *scan;
127 > register COLOR  *scan;
128   int  y;
129   {
130          int  xmin, xmax;
131          register int  x;
132 <        register HOTPIX  *hp;
132 >        register HOTPIX  *hp;
133          
134          for (hp = head; hp != NULL; hp = hp->next) {
135                  if (hp->slope > FTINY) {
# Line 154 | Line 160 | int  y;
160   starpoint(fcol, x, y, hp)               /* pixel is on the star's point */
161   COLOR  fcol;
162   int  x, y;
163 < register HOTPIX  *hp;
163 > register HOTPIX  *hp;
164   {
165          COLOR  ctmp;
166 <        double  d2;
166 >        double  d2;
167          
168          d2 = (double)(x - hp->x)*(x - hp->x) + (double)(y - hp->y)*(y - hp->y);
169          if (d2 > sprdfact) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines