svn merge -r 12208:12294 https://svn.blender.org/svnroot/bf-blender/trunk/blender
[blender.git] / source / blender / imbuf / intern / dds / BlockDXT.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * Contributors: Amorilia (amorilia@gamebox.net)
24  *
25  * ***** END GPL/BL DUAL LICENSE BLOCK *****
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 _DDS_BLOCKDXT_H
59 #define _DDS_BLOCKDXT_H
60
61 #include <Color.h>
62 #include <ColorBlock.h>
63 #include <Stream.h>
64
65 /// DXT1 block.
66 struct BlockDXT1
67 {
68         Color16 col0;
69         Color16 col1;
70         union {
71                 unsigned char row[4];
72                 unsigned int indices;
73         };
74
75         bool isFourColorMode() const;
76
77         unsigned int evaluatePalette(Color32 color_array[4]) const;
78         unsigned int evaluatePaletteFast(Color32 color_array[4]) const;
79         void evaluatePalette3(Color32 color_array[4]) const;
80         void evaluatePalette4(Color32 color_array[4]) const;
81         
82         void decodeBlock(ColorBlock * block) const;
83         
84         void setIndices(int * idx);
85
86         void flip4();
87         void flip2();
88 };
89
90 /// Return true if the block uses four color mode, false otherwise.
91 inline bool BlockDXT1::isFourColorMode() const
92 {
93         return col0.u >= col1.u;        // @@ > or >= ?
94 }
95
96
97 /// DXT3 alpha block with explicit alpha.
98 struct AlphaBlockDXT3
99 {
100         union {
101                 struct {
102                         unsigned int alpha0 : 4;
103                         unsigned int alpha1 : 4;
104                         unsigned int alpha2 : 4;
105                         unsigned int alpha3 : 4;
106                         unsigned int alpha4 : 4;
107                         unsigned int alpha5 : 4;
108                         unsigned int alpha6 : 4;
109                         unsigned int alpha7 : 4;
110                         unsigned int alpha8 : 4;
111                         unsigned int alpha9 : 4;
112                         unsigned int alphaA : 4;
113                         unsigned int alphaB : 4;
114                         unsigned int alphaC : 4;
115                         unsigned int alphaD : 4;
116                         unsigned int alphaE : 4;
117                         unsigned int alphaF : 4;
118                 };
119                 unsigned short row[4];
120         };
121         
122         void decodeBlock(ColorBlock * block) const;
123         
124         void flip4();
125         void flip2();
126 };
127
128
129 /// DXT3 block.
130 struct BlockDXT3
131 {
132         AlphaBlockDXT3 alpha;
133         BlockDXT1 color;
134         
135         void decodeBlock(ColorBlock * block) const;
136         
137         void flip4();
138         void flip2();
139 };
140
141
142 /// DXT5 alpha block.
143 struct AlphaBlockDXT5
144 {
145         union {
146                 struct {
147                         unsigned int alpha0 : 8;        // 8
148                         unsigned int alpha1 : 8;        // 16
149                         unsigned int bits0 : 3;         // 3 - 19
150                         unsigned int bits1 : 3;         // 6 - 22
151                         unsigned int bits2 : 3;         // 9 - 25
152                         unsigned int bits3 : 3;         // 12 - 28
153                         unsigned int bits4 : 3;         // 15 - 31
154                         unsigned int bits5 : 3;         // 18 - 34
155                         unsigned int bits6 : 3;         // 21 - 37
156                         unsigned int bits7 : 3;         // 24 - 40
157                         unsigned int bits8 : 3;         // 27 - 43
158                         unsigned int bits9 : 3;         // 30 - 46
159                         unsigned int bitsA : 3;         // 33 - 49
160                         unsigned int bitsB : 3;         // 36 - 52
161                         unsigned int bitsC : 3;         // 39 - 55
162                         unsigned int bitsD : 3;         // 42 - 58
163                         unsigned int bitsE : 3;         // 45 - 61
164                         unsigned int bitsF : 3;         // 48 - 64
165                 };
166                 unsigned long long u;
167         };
168         
169         void evaluatePalette(unsigned char alpha[8]) const;
170         void evaluatePalette8(unsigned char alpha[8]) const;
171         void evaluatePalette6(unsigned char alpha[8]) const;
172         void indices(unsigned char index_array[16]) const;
173
174         unsigned int index(unsigned int index) const;
175         void setIndex(unsigned int index, unsigned int value);
176         
177         void decodeBlock(ColorBlock * block) const;
178         
179         void flip4();
180         void flip2();
181 };
182
183
184 /// DXT5 block.
185 struct BlockDXT5
186 {
187         AlphaBlockDXT5 alpha;
188         BlockDXT1 color;
189         
190         void decodeBlock(ColorBlock * block) const;
191         
192         void flip4();
193         void flip2();
194 };
195
196 /// ATI1 block.
197 struct BlockATI1
198 {
199         AlphaBlockDXT5 alpha;
200         
201         void decodeBlock(ColorBlock * block) const;
202         
203         void flip4();
204         void flip2();
205 };
206
207 /// ATI2 block.
208 struct BlockATI2
209 {
210         AlphaBlockDXT5 x;
211         AlphaBlockDXT5 y;
212         
213         void decodeBlock(ColorBlock * block) const;
214         
215         void flip4();
216         void flip2();
217 };
218
219 void mem_read(Stream & mem, BlockDXT1 & block);
220 void mem_read(Stream & mem, AlphaBlockDXT3 & block);
221 void mem_read(Stream & mem, BlockDXT3 & block);
222 void mem_read(Stream & mem, AlphaBlockDXT5 & block);
223 void mem_read(Stream & mem, BlockDXT5 & block);
224 void mem_read(Stream & mem, BlockATI1 & block);
225 void mem_read(Stream & mem, BlockATI2 & block);
226
227 #endif // _DDS_BLOCKDXT_H