code cleanup: make header defines more consistent, JOYSENSOR header guard had a typo...
[blender-staging.git] / source / blender / imbuf / intern / dds / PixelFormat.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributors: Amorilia (amorilia@users.sourceforge.net)
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/imbuf/intern/dds/PixelFormat.h
24  *  \ingroup imbdds
25  */
26
27
28 /*
29  * This file is based on a similar file from the NVIDIA texture tools
30  * (http://nvidia-texture-tools.googlecode.com/)
31  *
32  * Original license from NVIDIA follows.
33  */
34
35 // Copyright NVIDIA Corporation 2007 -- Ignacio Castano <icastano@nvidia.com>
36 // 
37 // Permission is hereby granted, free of charge, to any person
38 // obtaining a copy of this software and associated documentation
39 // files (the "Software"), to deal in the Software without
40 // restriction, including without limitation the rights to use,
41 // copy, modify, merge, publish, distribute, sublicense, and/or sell
42 // copies of the Software, and to permit persons to whom the
43 // Software is furnished to do so, subject to the following
44 // conditions:
45 // 
46 // The above copyright notice and this permission notice shall be
47 // included in all copies or substantial portions of the Software.
48 // 
49 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
50 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
51 // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
52 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
53 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
54 // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
55 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
56 // OTHER DEALINGS IN THE SOFTWARE.
57
58 #ifndef __PIXELFORMAT_H__
59 #define __PIXELFORMAT_H__
60
61 #include <Common.h>
62
63         namespace PixelFormat
64         {
65
66                 // Convert component \a c having \a inbits to the returned value having \a outbits.
67                 inline uint convert(uint c, uint inbits, uint outbits)
68                 {
69                         if (inbits == 0) {
70                                 return 0;
71                         }
72                         else if (inbits >= outbits) {
73                                 // truncate
74                                 return c >> (inbits - outbits);
75                         }
76                         else {
77                                 // bitexpand
78                                 return (c << (outbits - inbits)) | convert(c, inbits, outbits - inbits);
79                         }
80                 }
81
82                 // Get pixel component shift and size given its mask.
83                 inline void maskShiftAndSize(uint mask, uint * shift, uint * size)
84                 {
85                         if (!mask) {
86                                 *shift = 0;
87                                 *size = 0;
88                                 return;
89                         }
90
91                         *shift = 0;
92                         while ((mask & 1) == 0) {
93                                 ++(*shift);
94                                 mask >>= 1;
95                         }
96                         
97                         *size = 0;
98                         while ((mask & 1) == 1) {
99                                 ++(*size);
100                                 mask >>= 1;
101                         }
102                 }
103
104         inline float quantizeCeil(float f, int inbits, int outbits)
105         {
106             //uint i = f * (float(1 << inbits) - 1);
107             //i = convert(i, inbits, outbits);
108             //float result = float(i) / (float(1 << outbits) - 1);
109             //nvCheck(result >= f);
110             float result;
111             int offset = 0;
112             do {
113                 uint i = offset + uint(f * (float(1 << inbits) - 1));
114                 i = convert(i, inbits, outbits);
115                 result = float(i) / (float(1 << outbits) - 1);
116                 offset++;
117             } while (result < f);
118
119             return result;
120         }
121
122         /*
123         inline float quantizeRound(float f, int bits)
124         {
125             float scale = float(1 << bits);
126             return fround(f * scale) / scale;
127         }
128
129         inline float quantizeFloor(float f, int bits)
130         {
131             float scale = float(1 << bits);
132             return floor(f * scale) / scale;
133         }
134         */
135
136         } // PixelFormat namespace
137
138 #endif  /* __PIXELFORMAT_H__ */