ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/falsecolor.c
Revision: 3.11
Committed: Thu Jan 7 01:28:36 2021 UTC (3 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: rad5R4, HEAD
Changes since 3.10: +5 -3 lines
Log Message:
refactor: made use of histogram data consistent with new HIST_TYP #define

File Contents

# User Rev Content
1 greg 3.1 #ifndef lint
2 greg 3.11 static const char RCSid[] = "$Id: falsecolor.c,v 3.10 2011/05/20 02:06:38 greg Exp $";
3 greg 3.1 #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 greg 3.2 #include <string.h>
16 greg 3.1 #include "tmprivat.h"
17     #include "falsecolor.h"
18    
19     /* Initialize new false color mapping */
20     FCstruct *
21 greg 3.10 fcInit(uby8 fcscale[256][3])
22 greg 3.1 {
23     FCstruct *fcs = (FCstruct *)malloc(sizeof(FCstruct));
24    
25     if (fcs == NULL)
26     return(NULL);
27     fcs->mbrmin = 10; fcs->mbrmax = -10;
28     fcs->lumap = NULL;
29     if ((fcs->scale = fcscale) == NULL)
30     fcs->scale = fcDefaultScale;
31     return(fcs);
32     }
33    
34     /* Assign fixed linear false color map */
35     int
36     fcFixedLinear(FCstruct *fcs, double Lwmax)
37     {
38 greg 3.2 double mult;
39 greg 3.1 int i;
40    
41     if ((fcs == NULL) | (Lwmax <= MINLUM))
42     return(TM_E_ILLEGAL);
43     if (fcs->lumap != NULL)
44     free((void *)fcs->lumap);
45 greg 3.2 fcs->mbrmin = tmCvLuminance(Lwmax/256.);
46     fcs->mbrmax = tmCvLuminance(Lwmax);
47 greg 3.10 fcs->lumap = (uby8 *)malloc(sizeof(uby8)*(fcs->mbrmax - fcs->mbrmin + 1));
48 greg 3.1 if (fcs->lumap == NULL)
49     return(TM_E_NOMEM);
50 greg 3.2 mult = 255.999/tmLuminance(fcs->mbrmax);
51 greg 3.1 for (i = fcs->mbrmin; i <= fcs->mbrmax; i++)
52 greg 3.3 fcs->lumap[i - fcs->mbrmin] = (int)(mult * tmLuminance(i));
53 greg 3.1 returnOK;
54     }
55    
56     /* Assign fixed logarithmic false color map */
57     int
58     fcFixedLog(FCstruct *fcs, double Lwmin, double Lwmax)
59     {
60     int i;
61    
62     if ((fcs == NULL) | (Lwmin <= MINLUM) | (Lwmax <= Lwmin))
63     return(TM_E_ILLEGAL);
64     if (fcs->lumap != NULL)
65     free((void *)fcs->lumap);
66 greg 3.2 fcs->mbrmin = tmCvLuminance(Lwmin);
67     fcs->mbrmax = tmCvLuminance(Lwmax);
68 greg 3.4 if (fcs->mbrmin >= fcs->mbrmax) {
69     fcs->lumap = NULL;
70     return(TM_E_ILLEGAL);
71     }
72 greg 3.10 fcs->lumap = (uby8 *)malloc(sizeof(uby8)*(fcs->mbrmax - fcs->mbrmin + 1));
73 greg 3.1 if (fcs->lumap == NULL)
74     return(TM_E_NOMEM);
75 greg 3.3 for (i = fcs->mbrmax - fcs->mbrmin; i >= 0; i--)
76     fcs->lumap[i] = 256L * i / (fcs->mbrmax - fcs->mbrmin + 1);
77 greg 3.1 returnOK;
78     }
79    
80     /* Compute linear false color map */
81     int
82 greg 3.3 fcLinearMapping(FCstruct *fcs, TMstruct *tms, double pctile)
83 greg 3.1 {
84 greg 3.4 int i, histlen;
85 greg 3.11 HIST_TYP histot;
86     long cnt;
87 greg 3.4 int brt0;
88 greg 3.1
89     if ((fcs == NULL) | (tms == NULL) || (tms->histo == NULL) |
90 greg 3.3 (0 > pctile) | (pctile >= 50))
91 greg 3.1 return(TM_E_ILLEGAL);
92 greg 3.8 i = HISTI(tms->hbrmin);
93 greg 3.9 brt0 = HISTV(i);
94 greg 3.8 histlen = HISTI(tms->hbrmax) + 1 - i;
95 greg 3.1 histot = 0;
96 greg 3.4 for (i = histlen; i--; )
97     histot += tms->histo[i];
98 greg 3.1 cnt = histot * pctile / 100;
99 greg 3.4 for (i = histlen; i--; )
100 greg 3.1 if ((cnt -= tms->histo[i]) < 0)
101     break;
102 greg 3.4 if (i <= 0)
103 greg 3.1 return(TM_E_TMFAIL);
104 greg 3.4 return(fcFixedLinear(fcs, tmLuminance(brt0 + i*HISTEP)));
105 greg 3.1 }
106    
107     /* Compute logarithmic false color map */
108     int
109 greg 3.3 fcLogMapping(FCstruct *fcs, TMstruct *tms, double pctile)
110 greg 3.1 {
111 greg 3.4 int i, histlen;
112 greg 3.11 HIST_TYP histot;
113     long cnt;
114 greg 3.4 int brt0, wbrmin, wbrmax;
115 greg 3.1
116     if ((fcs == NULL) | (tms == NULL) || (tms->histo == NULL) |
117 greg 3.6 (.0 > pctile) | (pctile >= 50.))
118 greg 3.1 return(TM_E_ILLEGAL);
119 greg 3.8 i = HISTI(tms->hbrmin);
120 greg 3.9 brt0 = HISTV(i);
121 greg 3.8 histlen = HISTI(tms->hbrmax) + 1 - i;
122 greg 3.1 histot = 0;
123 greg 3.4 for (i = histlen; i--; )
124     histot += tms->histo[i];
125 greg 3.6 cnt = histot * pctile * .01;
126 greg 3.4 for (i = 0; i < histlen; i++)
127 greg 3.1 if ((cnt -= tms->histo[i]) < 0)
128     break;
129 greg 3.4 if (i >= histlen)
130 greg 3.1 return(TM_E_TMFAIL);
131 greg 3.4 wbrmin = brt0 + i*HISTEP;
132 greg 3.6 cnt = histot * pctile * .01;
133 greg 3.4 for (i = histlen; i--; )
134 greg 3.1 if ((cnt -= tms->histo[i]) < 0)
135     break;
136 greg 3.4 wbrmax = brt0 + i*HISTEP;
137     if (wbrmax <= wbrmin)
138 greg 3.1 return(TM_E_TMFAIL);
139 greg 3.2 return(fcFixedLog(fcs, tmLuminance(wbrmin), tmLuminance(wbrmax)));
140 greg 3.1 }
141    
142     /* Apply false color mapping to pixel values */
143     int
144 greg 3.10 fcMapPixels(FCstruct *fcs, uby8 *ps, TMbright *ls, int len)
145 greg 3.1 {
146     int li;
147    
148     if (fcs == NULL || (fcs->lumap == NULL) | (fcs->scale == NULL))
149     return(TM_E_ILLEGAL);
150     if ((ps == NULL) | (ls == NULL) | (len < 0))
151     return(TM_E_ILLEGAL);
152     while (len--) {
153     if ((li = *ls++) < fcs->mbrmin)
154     li = 0;
155     else if (li > fcs->mbrmax)
156     li = 255;
157     else
158     li = fcs->lumap[li - fcs->mbrmin];
159     *ps++ = fcs->scale[li][RED];
160     *ps++ = fcs->scale[li][GRN];
161     *ps++ = fcs->scale[li][BLU];
162     }
163     returnOK;
164     }
165    
166 greg 3.2 /* Determine if false color mapping is logarithmic */
167     int
168     fcIsLogMap(FCstruct *fcs)
169     {
170 greg 3.6 int miderr;
171 greg 3.2
172     if (fcs == NULL || fcs->lumap == NULL)
173     return(-1);
174 greg 3.6
175 greg 3.7 miderr = (fcs->mbrmax - fcs->mbrmin)/2;
176     miderr = fcs->lumap[miderr] -
177     256L * miderr / (fcs->mbrmax - fcs->mbrmin + 1);
178 greg 3.6
179     return((-1 <= miderr) & (miderr <= 1));
180 greg 3.2 }
181    
182     /* Duplicate a false color structure */
183     FCstruct *
184     fcDup(FCstruct *fcs)
185     {
186     FCstruct *fcnew;
187    
188     if (fcs == NULL)
189     return(NULL);
190     fcnew = fcInit(fcs->scale);
191     if (fcnew == NULL)
192     return(NULL);
193     if (fcs->lumap != NULL) {
194 greg 3.10 fcnew->lumap = (uby8 *)malloc(sizeof(uby8)*(fcs->mbrmax -
195 greg 3.2 fcs->mbrmin + 1));
196     if (fcnew->lumap == NULL)
197     return(fcnew);
198     fcnew->mbrmin = fcs->mbrmin; fcnew->mbrmax = fcs->mbrmax;
199     memcpy((void *)fcnew->lumap, (void *)fcs->lumap,
200 greg 3.10 sizeof(uby8)*(fcs->mbrmax - fcs->mbrmin + 1));
201 greg 3.2 }
202     return(fcnew);
203     }
204    
205 greg 3.1 /* Free data associated with the given false color mapping structure */
206     void
207     fcDone(FCstruct *fcs)
208     {
209     if (fcs == NULL)
210     return;
211     if (fcs->lumap != NULL)
212     free((void *)fcs->lumap);
213     free((void *)fcs);
214     }
215    
216 greg 3.10 uby8 fcDefaultScale[256][3] = { /* default false color scale */
217 greg 3.5 111,8,132,
218     108,7,133,
219     105,7,134,
220     102,6,136,
221     98,6,137,
222     93,5,139,
223     89,4,141,
224     84,3,143,
225     79,2,145,
226     74,1,148,
227     68,0,150,
228     63,0,153,
229     57,0,155,
230     52,0,157,
231     46,0,160,
232     41,0,162,
233     36,0,164,
234     31,0,166,
235     26,0,168,
236     22,0,170,
237     18,0,172,
238     14,2,174,
239     11,4,175,
240     8,7,176,
241     7,9,177,
242     6,11,177,
243     5,13,178,
244     4,16,178,
245     3,18,179,
246     2,21,180,
247     1,24,180,
248     1,28,181,
249     0,31,181,
250     0,35,182,
251     0,38,182,
252     0,42,183,
253     0,46,184,
254     0,50,184,
255     0,54,184,
256     0,58,185,
257     0,63,185,
258     0,67,186,
259     0,71,186,
260     0,76,186,
261     0,80,187,
262     0,84,187,
263     0,89,187,
264     0,93,187,
265     1,97,187,
266     1,102,187,
267     1,106,187,
268     2,110,187,
269     2,114,187,
270     3,118,186,
271     3,122,186,
272     4,126,186,
273     4,130,185,
274     4,133,185,
275     5,137,184,
276     5,140,183,
277     6,143,182,
278     6,146,181,
279     6,149,180,
280     7,151,179,
281     7,154,178,
282     7,156,177,
283     8,158,175,
284     8,161,172,
285     9,163,169,
286     9,165,165,
287     9,167,161,
288     9,169,157,
289     10,170,153,
290     10,172,148,
291     10,173,143,
292     11,174,138,
293     11,174,133,
294     11,175,127,
295     12,175,122,
296     12,176,117,
297     13,176,111,
298     14,176,106,
299     14,176,101,
300     15,175,95,
301     16,175,90,
302     17,175,86,
303     18,174,81,
304     20,174,77,
305     21,173,73,
306     22,172,69,
307     24,172,66,
308     26,171,63,
309     28,170,60,
310     30,169,58,
311     32,168,57,
312     34,167,56,
313     37,166,55,
314     40,165,54,
315     42,164,54,
316     45,163,54,
317     48,162,55,
318     52,160,55,
319     55,158,56,
320     58,157,57,
321     62,155,57,
322     66,153,59,
323     69,152,60,
324     73,150,61,
325     77,148,63,
326     81,146,64,
327     84,144,66,
328     88,142,67,
329     92,139,69,
330     96,137,70,
331     99,135,72,
332     103,133,73,
333     107,131,75,
334     110,128,76,
335     113,126,77,
336     117,124,78,
337     120,121,79,
338     123,119,80,
339     126,117,80,
340     128,114,81,
341     131,112,81,
342     133,110,81,
343     135,108,80,
344     136,106,80,
345     137,105,80,
346     138,104,79,
347     139,102,79,
348     140,101,79,
349     141,100,78,
350     142,98,78,
351     143,96,77,
352     144,95,76,
353     144,93,76,
354     145,92,75,
355     146,90,74,
356     146,89,73,
357     147,87,73,
358     148,85,72,
359     148,84,71,
360     149,82,70,
361     149,80,69,
362     150,79,68,
363     150,77,67,
364     151,75,66,
365     151,73,65,
366     151,72,64,
367     152,70,63,
368     152,68,62,
369     153,66,61,
370     153,65,60,
371     153,63,59,
372     154,61,58,
373     154,60,57,
374     154,58,56,
375     154,56,55,
376     155,55,54,
377     155,53,53,
378     155,51,51,
379     156,50,50,
380     156,48,49,
381     156,46,48,
382     157,45,47,
383     157,43,46,
384     157,42,45,
385     158,40,44,
386     158,39,43,
387     158,37,42,
388     159,36,41,
389     159,34,40,
390     159,33,39,
391     160,32,38,
392     160,31,37,
393     161,29,37,
394     161,28,36,
395     162,27,35,
396     162,26,34,
397     163,25,33,
398     163,24,33,
399     164,23,32,
400     165,22,31,
401     165,21,31,
402     168,18,29,
403     170,16,28,
404     172,13,26,
405     175,11,25,
406     177,9,24,
407     180,7,23,
408     183,5,22,
409     185,3,21,
410     188,2,21,
411     191,1,20,
412     194,0,19,
413     197,0,19,
414     199,0,18,
415     202,0,17,
416     205,0,17,
417     207,0,16,
418     210,2,16,
419     213,3,15,
420     215,6,14,
421     217,8,13,
422     219,11,13,
423     220,13,12,
424     222,17,11,
425     224,20,11,
426     226,24,10,
427     227,28,9,
428     229,32,8,
429     231,37,7,
430     232,42,6,
431     234,47,5,
432     236,52,5,
433     237,57,4,
434     239,63,3,
435     240,68,2,
436     242,74,2,
437     243,79,1,
438     245,85,0,
439     246,91,0,
440     247,96,0,
441     248,102,0,
442     250,108,0,
443     251,113,0,
444     252,118,0,
445     253,123,0,
446     254,128,0,
447     254,133,0,
448     255,138,0,
449     255,143,1,
450     255,148,2,
451     255,154,3,
452     255,159,4,
453     255,165,6,
454     255,170,7,
455     255,176,9,
456     255,181,11,
457     255,187,13,
458     255,192,15,
459     255,198,17,
460     255,203,20,
461     255,208,22,
462     255,213,24,
463     255,218,26,
464     255,223,28,
465     255,227,30,
466     255,232,32,
467     255,236,34,
468     254,240,35,
469     254,243,37,
470     254,246,38,
471     254,249,39,
472     254,252,40,
473 greg 3.1 };