ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/falsecolor.c
Revision: 3.1
Committed: Mon Nov 14 22:18:18 2005 UTC (18 years, 5 months ago) by greg
Content type: text/plain
Branch: MAIN
Log Message:
Added routines for false color tone mapping

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id$";
3 #endif
4 /*
5 * False color mapping functions.
6 * See falsecolor.h for detailed function descriptions.
7 *
8 * Externals declared in falsecolor.h
9 */
10
11 #include "copyright.h"
12
13 #include <stdio.h>
14 #include <math.h>
15 #include "tmprivat.h"
16 #include "falsecolor.h"
17
18 /* Initialize new false color mapping */
19 FCstruct *
20 fcInit(BYTE fcscale[256][3])
21 {
22 FCstruct *fcs = (FCstruct *)malloc(sizeof(FCstruct));
23
24 if (fcs == NULL)
25 return(NULL);
26 fcs->mbrmin = 10; fcs->mbrmax = -10;
27 fcs->lumap = NULL;
28 if ((fcs->scale = fcscale) == NULL)
29 fcs->scale = fcDefaultScale;
30 return(fcs);
31 }
32
33 /* Assign fixed linear false color map */
34 int
35 fcFixedLinear(FCstruct *fcs, double Lwmax)
36 {
37 double v;
38 int i;
39
40 if ((fcs == NULL) | (Lwmax <= MINLUM))
41 return(TM_E_ILLEGAL);
42 if (fcs->lumap != NULL)
43 free((void *)fcs->lumap);
44 v = TM_BRTSCALE * log(Lwmax);
45 fcs->mbrmax = (int)(v<0. ? v-.5 : v+.5);
46 v = TM_BRTSCALE * log(Lwmax/256.);
47 fcs->mbrmin = (int)(v<0. ? v-.5 : v+.5);
48 fcs->lumap = (BYTE *)malloc(sizeof(BYTE)*(fcs->mbrmax - fcs->mbrmin + 1));
49 if (fcs->lumap == NULL)
50 return(TM_E_NOMEM);
51 v = 255.999/tmLuminance(fcs->mbrmax);
52 for (i = fcs->mbrmin; i <= fcs->mbrmax; i++)
53 fcs->lumap[i] = (int)(v * tmLuminance(i));
54 returnOK;
55 }
56
57 /* Assign fixed logarithmic false color map */
58 int
59 fcFixedLog(FCstruct *fcs, double Lwmin, double Lwmax)
60 {
61 double v;
62 int i;
63
64 if ((fcs == NULL) | (Lwmin <= MINLUM) | (Lwmax <= Lwmin))
65 return(TM_E_ILLEGAL);
66 if (fcs->lumap != NULL)
67 free((void *)fcs->lumap);
68 v = TM_BRTSCALE * log(Lwmin);
69 fcs->mbrmin = (int)(v<0. ? v-.5 : v+.5);
70 v = TM_BRTSCALE * log(Lwmax);
71 fcs->mbrmax = (int)(v<0. ? v-.5 : v+.5);
72 fcs->lumap = (BYTE *)malloc(sizeof(BYTE)*(fcs->mbrmax - fcs->mbrmin + 1));
73 if (fcs->lumap == NULL)
74 return(TM_E_NOMEM);
75 for (i = fcs->mbrmin; i <= fcs->mbrmax; i++)
76 fcs->lumap[i] = 256*(i - fcs->mbrmin) /
77 (fcs->mbrmax - fcs->mbrmin + 1);
78 returnOK;
79 }
80
81 /* Compute linear false color map */
82 int
83 fcLinearMapping(FCstruct *fcs, TMstruct *tms, int pctile)
84 {
85 int i;
86 int32 histot, cnt;
87 TMbright wbrmin, wbrmax;
88
89 if ((fcs == NULL) | (tms == NULL) || (tms->histo == NULL) |
90 (0 > pctile) | (pctile >= 100))
91 return(TM_E_ILLEGAL);
92 histot = 0;
93 for (i = tms->hbrmax - tms->hbrmin; i >= 0; )
94 histot += tms->histo[i--];
95 cnt = histot * pctile / 100;
96 for (i = tms->hbrmax - tms->hbrmin; i >= 0; i--)
97 if ((cnt -= tms->histo[i]) < 0)
98 break;
99 if (i < 0)
100 return(TM_E_TMFAIL);
101 return(fcFixedLinear(fcs, tmLuminance(tms->hbrmin + i)));
102 }
103
104 /* Compute logarithmic false color map */
105 int
106 fcLogMapping(FCstruct *fcs, TMstruct *tms, int pctile)
107 {
108 int i;
109 int32 histot, cnt;
110 TMbright wbrmin, wbrmax;
111
112 if ((fcs == NULL) | (tms == NULL) || (tms->histo == NULL) |
113 (0 > pctile) | (pctile >= 100))
114 return(TM_E_ILLEGAL);
115 histot = 0;
116 for (i = tms->hbrmax - tms->hbrmin; i >= 0; )
117 histot += tms->histo[i--];
118 cnt = histot * pctile / 100;
119 for (i = 0; i <= tms->hbrmax - tms->hbrmin; i++)
120 if ((cnt -= tms->histo[i]) < 0)
121 break;
122 if (i >= tms->hbrmax - tms->hbrmin)
123 return(TM_E_TMFAIL);
124 wbrmin = tms->hbrmin + i;
125 cnt = histot * pctile / 100;
126 for (i = tms->hbrmax - tms->hbrmin; i >= 0; i--)
127 if ((cnt -= tms->histo[i]) < 0)
128 break;
129 if (i < 0)
130 return(TM_E_TMFAIL);
131 wbrmax = tms->hbrmin + i;
132 return(fcFixedLog(fcs, tmLuminannce(wbrmin), tmLuminance(wbrmax)));
133 }
134
135 /* Apply false color mapping to pixel values */
136 int
137 fcMapPixels(FCstruct *fcs, BYTE *ps, TMbright *ls, int len)
138 {
139 int li;
140
141 if (fcs == NULL || (fcs->lumap == NULL) | (fcs->scale == NULL))
142 return(TM_E_ILLEGAL);
143 if ((ps == NULL) | (ls == NULL) | (len < 0))
144 return(TM_E_ILLEGAL);
145 while (len--) {
146 if ((li = *ls++) < fcs->mbrmin)
147 li = 0;
148 else if (li > fcs->mbrmax)
149 li = 255;
150 else
151 li = fcs->lumap[li - fcs->mbrmin];
152 *ps++ = fcs->scale[li][RED];
153 *ps++ = fcs->scale[li][GRN];
154 *ps++ = fcs->scale[li][BLU];
155 }
156 returnOK;
157 }
158
159 /* Free data associated with the given false color mapping structure */
160 void
161 fcDone(FCstruct *fcs)
162 {
163 if (fcs == NULL)
164 return;
165 if (fcs->lumap != NULL)
166 free((void *)fcs->lumap);
167 free((void *)fcs);
168 }
169
170 BYTE fcDefaultScale[256][3] = { /* default false color scale */
171 48,0,68, 45,0,70, 42,0,72, 39,0,74, 36,0,76, 33,0,78, 30,0,81,
172 27,0,83, 24,0,85, 21,0,87, 18,0,89, 15,0,91, 13,0,94, 12,0,96,
173 11,0,99, 9,0,101, 8,0,104, 7,0,106, 6,0,109, 5,0,111, 4,0,114,
174 2,0,116, 1,0,119, 0,0,121, 0,0,122, 0,1,123, 0,1,124, 0,2,125,
175 0,2,125, 0,3,126, 0,4,127, 0,4,128, 0,5,129, 0,5,129, 0,6,130,
176 0,7,131, 0,9,131, 0,11,132, 0,13,133, 0,16,133, 0,18,134,
177 0,20,134, 0,22,135, 0,24,135, 0,26,136, 0,29,136, 0,31,137,
178 0,34,137, 0,37,136, 0,41,136, 0,45,135, 0,48,135, 0,52,135,
179 0,55,134, 0,59,134, 0,62,134, 0,66,133, 0,69,133, 0,73,132,
180 0,76,130, 0,79,127, 0,82,125, 0,85,123, 0,88,120, 0,91,118,
181 0,94,115, 0,97,113, 0,101,110, 0,104,108, 0,107,106, 0,109,102,
182 0,110,97, 0,111,91, 0,112,86, 0,113,81, 0,115,76, 0,116,71,
183 0,117,65, 0,118,60, 0,119,55, 0,120,50, 0,122,45, 0,121,42,
184 1,120,39, 1,119,36, 1,119,34, 1,118,31, 2,117,28, 2,116,26,
185 2,115,23, 2,115,20, 3,114,18, 3,113,15, 3,112,13, 4,110,13,
186 5,108,13, 6,106,13, 7,104,12, 9,102,12, 10,100,12, 11,98,12,
187 12,97,12, 13,95,12, 14,93,11, 15,91,11, 17,89,12, 19,86,12,
188 22,83,12, 24,81,13, 26,78,13, 29,76,14, 31,73,14, 34,70,15,
189 36,68,15, 39,65,16, 41,63,16, 44,60,17, 46,58,17, 49,56,17,
190 51,54,17, 54,52,17, 57,50,17, 59,48,17, 62,45,17, 64,43,17,
191 67,41,17, 70,39,17, 72,37,17, 74,35,17, 75,34,16, 76,33,16,
192 77,32,16, 79,31,15, 80,30,15, 81,29,14, 82,28,14, 83,26,13,
193 84,25,13, 85,24,13, 87,23,12, 87,22,12, 88,21,11, 89,20,11,
194 90,19,10, 91,18,10, 92,17,9, 93,16,9, 94,15,8, 95,14,8,
195 95,13,7, 96,12,7, 97,11,7, 98,11,6, 99,10,6, 99,9,5, 100,9,5,
196 101,8,5, 102,8,4, 102,7,4, 103,6,4, 104,6,3, 104,5,3, 105,4,2,
197 106,4,2, 107,4,2, 107,3,2, 108,3,2, 109,3,2, 109,2,1, 110,2,1,
198 111,2,1, 112,1,1, 112,1,1, 113,1,0, 114,1,0, 115,0,0, 116,0,0,
199 117,0,0, 118,0,0, 119,0,0, 121,0,0, 122,0,0, 123,0,0, 124,0,0,
200 125,0,0, 126,0,0, 128,0,0, 131,0,0, 134,0,0, 137,0,0, 140,0,0,
201 144,0,0, 147,0,0, 150,0,0, 153,0,0, 156,0,0, 159,0,0, 162,0,0,
202 165,0,0, 168,0,0, 171,0,0, 174,0,0, 177,0,0, 180,1,0, 183,1,0,
203 186,1,0, 189,1,0, 192,1,0, 195,2,0, 198,2,0, 201,5,0, 204,7,0,
204 207,9,0, 210,11,0, 213,13,0, 216,15,0, 219,17,0, 222,19,0,
205 225,21,0, 228,23,0, 230,25,0, 233,29,0, 235,34,0, 237,39,0,
206 239,43,0, 241,48,0, 243,52,0, 245,57,0, 247,61,0, 250,66,0,
207 252,71,0, 254,75,0, 255,80,0, 255,88,0, 255,95,1, 255,103,1,
208 255,110,1, 255,117,1, 255,125,1, 255,132,2, 255,139,2, 255,147,2,
209 255,154,2, 255,162,2, 255,169,3, 255,176,3, 255,183,3, 254,190,4,
210 254,198,4, 254,205,4, 254,212,4, 253,219,5, 253,226,5, 253,234,5,
211 252,241,6, 252,248,6
212 };