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