PICCANTE  0.4
The hottest HDR imaging library!
rgbe.hpp
Go to the documentation of this file.
1 /*
2 
3 PICCANTE
4 The hottest HDR imaging library!
5 http://vcg.isti.cnr.it/piccante
6 
7 Copyright (C) 2014
8 Visual Computing Laboratory - ISTI CNR
9 http://vcg.isti.cnr.it
10 First author: Francesco Banterle
11 
12 This Source Code Form is subject to the terms of the Mozilla Public
13 License, v. 2.0. If a copy of the MPL was not distributed with this
14 file, You can obtain one at http://mozilla.org/MPL/2.0/.
15 
16 */
17 
18 #ifndef PIC_COLORS_RGBE_HPP
19 #define PIC_COLORS_RGBE_HPP
20 
29 #include "../base.hpp"
30 
31 namespace pic {
32 
38 PIC_INLINE void fromFloatToRGBE(float *colFloat, unsigned char *colRGBE)
39 {
40  float v;
41  int e;
42 
43  v = *colFloat;
44 
45  if(v < * (colFloat + 1)) {
46  v = *(colFloat + 1);
47  }
48 
49  if(v < * (colFloat + 2)) {
50  v = *(colFloat + 2);
51  }
52 
53  if(v < 1e-32f) { //is it too small?
54  *(colRGBE) = 0;
55  *(colRGBE + 1) = 0;
56  *(colRGBE + 2) = 0;
57  *(colRGBE + 3) = 0;
58  return;
59  }
60 
61  v = frexp(v, &e) * 256.0f / v;
62 
63  *(colRGBE) = int((*(colFloat)) * v);
64  *(colRGBE + 1) = int((*(colFloat + 1)) * v);
65  *(colRGBE + 2) = int((*(colFloat + 2)) * v);
66  *(colRGBE + 3) = (e + 128);
67 }
68 
74 PIC_INLINE void fromSingleFloatToRGBE(float *colFloat, unsigned char *colRGBE)
75 {
76  float v;
77  int e;
78 
79  v = *colFloat;
80 
81  if(v < 1e-32f) { //is it too small?
82  *(colRGBE) = 0;
83  *(colRGBE + 1) = 0;
84  *(colRGBE + 2) = 0;
85  *(colRGBE + 3) = 0;
86  return;
87  }
88 
89  v = frexp(v, &e) * 256.0f / v;
90 
91  *(colRGBE) = int((*(colFloat)) * v);
92  *(colRGBE + 1) = *colRGBE;
93  *(colRGBE + 2) = *colRGBE;
94  *(colRGBE + 3) = (e + 128);
95 }
96 
102 PIC_INLINE void fromRGBEToFloat(unsigned char *colRGBE, float *colFloat)
103 {
104 
105  if((*(colRGBE) == 0) && (*(colRGBE + 1) == 0) &&
106  (*(colRGBE + 2) == 0)) { //if it is small
107  *(colFloat) = 0;
108  *(colFloat + 1) = 0;
109  *(colFloat + 2) = 0;
110  return;
111  }
112 
113  int E;
114  float f;
115 
116  E = *(colRGBE + 3) - 128 - 8;
117  f = ldexpf(1.0f, E);
118 
119  *(colFloat) = (float(*(colRGBE)) + 0.5f) * f;
120  *(colFloat + 1) = (float(*(colRGBE + 1)) + 0.5f) * f;
121  *(colFloat + 2) = (float(*(colRGBE + 2)) + 0.5f) * f;
122 }
123 
124 } // end namespace pic
125 
126 #endif /* PIC_COLORS_RGBE_HPP */
127 
PIC_INLINE void fromFloatToRGBE(float *colFloat, unsigned char *colRGBE)
fromFloatToRGBE
Definition: rgbe.hpp:38
PIC_INLINE void fromRGBEToFloat(unsigned char *colRGBE, float *colFloat)
fromRGBEToFloat
Definition: rgbe.hpp:102
PIC_INLINE void fromSingleFloatToRGBE(float *colFloat, unsigned char *colRGBE)
fromSingleFloatToRGBE
Definition: rgbe.hpp:74
#define PIC_INLINE
Definition: base.hpp:33
Definition: bilateral_separation.hpp:25