ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/pf2.c
Revision: 2.7
Committed: Sun Mar 28 20:33:14 2004 UTC (20 years ago) by schorsch
Content type: text/plain
Branch: MAIN
CVS Tags: rad4R2P2, rad5R0, rad5R1, rad3R7P2, rad3R7P1, rad4R2, rad4R1, rad4R0, rad3R6, rad3R6P1, rad3R8, rad3R9, rad4R2P1
Changes since 2.6: +28 -36 lines
Log Message:
Continued ANSIfication, and other fixes and clarifications.

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: pf2.c,v 2.6 2003/02/22 02:07:27 greg Exp $";
3 #endif
4 /*
5 * pf2.c - routines used by pfilt.
6 */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <math.h>
11
12 #include "rterror.h"
13 #include "random.h"
14 #include "color.h"
15 #include "pfilt.h"
16
17 #define PI 3.14159265359
18 #define FTINY (1e-6)
19
20 #define AVGLVL 0.5 /* target mean brightness */
21
22 double avgbrt; /* average picture brightness */
23 long npix; /* # pixels in average */
24
25 typedef struct hotpix { /* structure for avgbrt pixels */
26 struct hotpix *next; /* next in list */
27 COLOR val; /* pixel color */
28 short x, y; /* pixel position */
29 float slope; /* random slope for diffraction */
30 } HOTPIX;
31
32 HOTPIX *head; /* head of avgbrt pixel list */
33
34 double sprdfact; /* computed spread factor */
35
36 static void starpoint(COLOR fcol, int x, int y, HOTPIX *hp);
37
38
39 extern void
40 pass1init(void) /* prepare for first pass */
41 {
42 avgbrt = 0.0;
43 npix = 0;
44 head = NULL;
45 }
46
47
48 extern void
49 pass1default(void) /* for single pass */
50 {
51 avgbrt = AVGLVL;
52 npix = 1;
53 head = NULL;
54 }
55
56
57 extern void
58 pass1scan( /* process first pass scanline */
59 register COLOR *scan,
60 int y
61 )
62 {
63 double cbrt;
64 register int x;
65 register HOTPIX *hp;
66
67 for (x = 0; x < xres; x++) {
68
69 cbrt = (*ourbright)(scan[x]);
70
71 if (cbrt <= 0)
72 continue;
73
74 if (avghot || cbrt < hotlvl) {
75 avgbrt += cbrt;
76 npix++;
77 }
78 if (npts && cbrt >= hotlvl) {
79 hp = (HOTPIX *)malloc(sizeof(HOTPIX));
80 if (hp == NULL) {
81 fprintf(stderr, "%s: out of memory\n",
82 progname);
83 quit(1);
84 }
85 copycolor(hp->val, scan[x]);
86 hp->x = x;
87 hp->y = y;
88 hp->slope = tan(PI*(0.5-(random()%npts+0.5)/npts));
89 hp->next = head;
90 head = hp;
91 }
92 }
93 }
94
95
96 extern void
97 pass2init(void) /* prepare for final pass */
98 {
99 if (!npix) {
100 fprintf(stderr, "%s: picture too dark or too bright\n",
101 progname);
102 quit(1);
103 }
104 avgbrt /= (double)npix;
105
106 scalecolor(exposure, AVGLVL/avgbrt);
107
108 sprdfact = spread / (hotlvl * (*ourbright)(exposure))
109 * ((double)xres*xres + (double)yres*yres) / 4.0;
110 }
111
112
113 extern void
114 pass2scan( /* process final pass scanline */
115 register COLOR *scan,
116 int y
117 )
118 {
119 int xmin, xmax;
120 register int x;
121 register HOTPIX *hp;
122
123 for (hp = head; hp != NULL; hp = hp->next) {
124 if (hp->slope > FTINY) {
125 xmin = (y - hp->y - 0.5)/hp->slope + hp->x;
126 xmax = (y - hp->y + 0.5)/hp->slope + hp->x;
127 } else if (hp->slope < -FTINY) {
128 xmin = (y - hp->y + 0.5)/hp->slope + hp->x;
129 xmax = (y - hp->y - 0.5)/hp->slope + hp->x;
130 } else if (y == hp->y) {
131 xmin = 0;
132 xmax = xres-1;
133 } else {
134 xmin = 1;
135 xmax = 0;
136 }
137 if (xmin < 0)
138 xmin = 0;
139 if (xmax >= xres)
140 xmax = xres-1;
141 for (x = xmin; x <= xmax; x++)
142 starpoint(scan[x], x, y, hp);
143 }
144 for (x = 0; x < xres; x++)
145 multcolor(scan[x], exposure);
146 }
147
148
149 static void
150 starpoint( /* pixel is on the star's point */
151 COLOR fcol,
152 int x,
153 int y,
154 register HOTPIX *hp
155 )
156 {
157 COLOR ctmp;
158 double d2;
159
160 d2 = (double)(x - hp->x)*(x - hp->x) + (double)(y - hp->y)*(y - hp->y);
161 if (d2 > sprdfact) {
162 d2 = sprdfact / d2;
163 if (d2 < FTINY)
164 return;
165 copycolor(ctmp, hp->val);
166 scalecolor(ctmp, d2);
167 addcolor(fcol, ctmp);
168 } else if (d2 > FTINY) {
169 addcolor(fcol, hp->val);
170 }
171 }