Blender  V2.93
BlockDXT.h
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16 
21 /*
22  * This file is based on a similar file from the NVIDIA texture tools
23  * (http://nvidia-texture-tools.googlecode.com/)
24  *
25  * Original license from NVIDIA follows.
26  */
27 
28 /* Copyright NVIDIA Corporation 2007 -- Ignacio Castano <icastano@nvidia.com>
29  *
30  * Permission is hereby granted, free of charge, to any person
31  * obtaining a copy of this software and associated documentation
32  * files (the "Software"), to deal in the Software without
33  * restriction, including without limitation the rights to use,
34  * copy, modify, merge, publish, distribute, sublicense, and/or sell
35  * copies of the Software, and to permit persons to whom the
36  * Software is furnished to do so, subject to the following
37  * conditions:
38  *
39  * The above copyright notice and this permission notice shall be
40  * included in all copies or substantial portions of the Software.
41  *
42  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
43  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
44  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
45  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
46  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
47  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
48  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
49  * OTHER DEALINGS IN THE SOFTWARE. */
50 
51 #pragma once
52 
53 #include <Color.h>
54 #include <ColorBlock.h>
55 #include <Common.h>
56 #include <Stream.h>
57 
59 struct BlockDXT1 {
62  union {
63  uint8 row[4];
65  };
66 
67  bool isFourColorMode() const;
68 
69  uint evaluatePalette(Color32 color_array[4]) const;
70  uint evaluatePaletteNV5x(Color32 color_array[4]) const;
71 
72  void evaluatePalette3(Color32 color_array[4]) const;
73  void evaluatePalette4(Color32 color_array[4]) const;
74 
75  void decodeBlock(ColorBlock *block) const;
76  void decodeBlockNV5x(ColorBlock *block) const;
77 
78  void setIndices(const int *idx);
79 
80  void flip4();
81  void flip2();
82 };
83 
85 inline bool BlockDXT1::isFourColorMode() const
86 {
87  return col0.u > col1.u;
88 }
89 
92  union {
93  struct {
94  uint alpha0 : 4;
95  uint alpha1 : 4;
96  uint alpha2 : 4;
97  uint alpha3 : 4;
98  uint alpha4 : 4;
99  uint alpha5 : 4;
110  };
112  };
113 
114  void decodeBlock(ColorBlock *block) const;
115 
116  void flip4();
117  void flip2();
118 };
119 
121 struct BlockDXT3 {
124 
125  void decodeBlock(ColorBlock *block) const;
126  void decodeBlockNV5x(ColorBlock *block) const;
127 
128  void flip4();
129  void flip2();
130 };
131 
134  /* uint64 unions do not compile on all platforms */
135 #if 0
136  union {
137  struct {
138  uint64 alpha0 : 8; /* 8 */
139  uint64 alpha1 : 8; /* 16 */
140  uint64 bits0 : 3; /* 3 - 19 */
141  uint64 bits1 : 3; /* 6 - 22 */
142  uint64 bits2 : 3; /* 9 - 25 */
143  uint64 bits3 : 3; /* 12 - 28 */
144  uint64 bits4 : 3; /* 15 - 31 */
145  uint64 bits5 : 3; /* 18 - 34 */
146  uint64 bits6 : 3; /* 21 - 37 */
147  uint64 bits7 : 3; /* 24 - 40 */
148  uint64 bits8 : 3; /* 27 - 43 */
149  uint64 bits9 : 3; /* 30 - 46 */
150  uint64 bitsA : 3; /* 33 - 49 */
151  uint64 bitsB : 3; /* 36 - 52 */
152  uint64 bitsC : 3; /* 39 - 55 */
153  uint64 bitsD : 3; /* 42 - 58 */
154  uint64 bitsE : 3; /* 45 - 61 */
155  uint64 bitsF : 3; /* 48 - 64 */
156  };
157  uint64 u;
158  };
159 #endif
161  uint8 alpha0() const
162  {
163  return u & 0xffLL;
164  }
165  uint8 alpha1() const
166  {
167  return (u >> 8) & 0xffLL;
168  }
169  uint8 bits0() const
170  {
171  return (u >> 16) & 0x7LL;
172  }
173  uint8 bits1() const
174  {
175  return (u >> 19) & 0x7LL;
176  }
177  uint8 bits2() const
178  {
179  return (u >> 22) & 0x7LL;
180  }
181  uint8 bits3() const
182  {
183  return (u >> 25) & 0x7LL;
184  }
185  uint8 bits4() const
186  {
187  return (u >> 28) & 0x7LL;
188  }
189  uint8 bits5() const
190  {
191  return (u >> 31) & 0x7LL;
192  }
193  uint8 bits6() const
194  {
195  return (u >> 34) & 0x7LL;
196  }
197  uint8 bits7() const
198  {
199  return (u >> 37) & 0x7LL;
200  }
201  uint8 bits8() const
202  {
203  return (u >> 40) & 0x7LL;
204  }
205  uint8 bits9() const
206  {
207  return (u >> 43) & 0x7LL;
208  }
209  uint8 bitsA() const
210  {
211  return (u >> 46) & 0x7LL;
212  }
213  uint8 bitsB() const
214  {
215  return (u >> 49) & 0x7LL;
216  }
217  uint8 bitsC() const
218  {
219  return (u >> 52) & 0x7LL;
220  }
221  uint8 bitsD() const
222  {
223  return (u >> 55) & 0x7LL;
224  }
225  uint8 bitsE() const
226  {
227  return (u >> 58) & 0x7LL;
228  }
229  uint8 bitsF() const
230  {
231  return (u >> 61) & 0x7LL;
232  }
233 
234  void evaluatePalette(uint8 alpha[8]) const;
235  void evaluatePalette8(uint8 alpha[8]) const;
236  void evaluatePalette6(uint8 alpha[8]) const;
237  void indices(uint8 index_array[16]) const;
238 
239  uint index(uint index) const;
240  void setIndex(uint index, uint value);
241 
242  void decodeBlock(ColorBlock *block) const;
243 
244  void flip4();
245  void flip2();
246 };
247 
249 struct BlockDXT5 {
252 
253  void decodeBlock(ColorBlock *block) const;
254  void decodeBlockNV5x(ColorBlock *block) const;
255 
256  void flip4();
257  void flip2();
258 };
259 
261 struct BlockATI1 {
263 
264  void decodeBlock(ColorBlock *block) const;
265 
266  void flip4();
267  void flip2();
268 };
269 
271 struct BlockATI2 {
274 
275  void decodeBlock(ColorBlock *block) const;
276 
277  void flip4();
278  void flip2();
279 };
280 
282 struct BlockCTX1 {
285  union {
286  uint8 row[4];
288  };
289 
290  void evaluatePalette(Color32 color_array[4]) const;
291  void setIndices(const int *idx);
292 
293  void decodeBlock(ColorBlock *block) const;
294 
295  void flip4();
296  void flip2();
297 };
298 
299 void mem_read(Stream &mem, BlockDXT1 &block);
300 void mem_read(Stream &mem, AlphaBlockDXT3 &block);
301 void mem_read(Stream &mem, BlockDXT3 &block);
302 void mem_read(Stream &mem, AlphaBlockDXT5 &block);
303 void mem_read(Stream &mem, BlockDXT5 &block);
304 void mem_read(Stream &mem, BlockATI1 &block);
305 void mem_read(Stream &mem, BlockATI2 &block);
306 void mem_read(Stream &mem, BlockCTX1 &block);
unsigned int uint
Definition: BLI_sys_types.h:83
void mem_read(Stream &mem, BlockDXT1 &block)
Definition: BlockDXT.cpp:602
unsigned short uint16
Definition: Common.h:41
unsigned long long uint64
Definition: Common.h:44
unsigned char uint8
Definition: Common.h:40
Definition: Color.h:97
unsigned short u
Definition: Color.h:115
Definition: Color.h:33
static CCL_NAMESPACE_BEGIN const double alpha
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:282
uint16 row[4]
Definition: BlockDXT.h:111
void indices(uint8 index_array[16]) const
Definition: BlockDXT.cpp:371
uint index(uint index) const
Definition: BlockDXT.cpp:391
uint8 bits6() const
Definition: BlockDXT.h:193
void setIndex(uint index, uint value)
Definition: BlockDXT.cpp:397
uint8 alpha0() const
Definition: BlockDXT.h:161
uint8 bitsF() const
Definition: BlockDXT.h:229
uint8 bitsD() const
Definition: BlockDXT.h:221
uint8 bits9() const
Definition: BlockDXT.h:205
uint8 bits2() const
Definition: BlockDXT.h:177
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:404
uint8 bits0() const
Definition: BlockDXT.h:169
uint8 bitsC() const
Definition: BlockDXT.h:217
void evaluatePalette8(uint8 alpha[8]) const
Definition: BlockDXT.cpp:343
void evaluatePalette(uint8 alpha[8]) const
Definition: BlockDXT.cpp:333
uint8 bitsB() const
Definition: BlockDXT.h:213
uint8 bits7() const
Definition: BlockDXT.h:197
void evaluatePalette6(uint8 alpha[8]) const
Definition: BlockDXT.cpp:357
uint8 bits5() const
Definition: BlockDXT.h:189
uint8 bits4() const
Definition: BlockDXT.h:185
uint8 bitsE() const
Definition: BlockDXT.h:225
uint8 alpha1() const
Definition: BlockDXT.h:165
uint8 bits8() const
Definition: BlockDXT.h:201
uint8 bits3() const
Definition: BlockDXT.h:181
uint8 bits1() const
Definition: BlockDXT.h:173
uint8 bitsA() const
Definition: BlockDXT.h:209
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:476
void flip2()
Definition: BlockDXT.cpp:498
AlphaBlockDXT5 alpha
Definition: BlockDXT.h:262
void flip4()
Definition: BlockDXT.cpp:492
AlphaBlockDXT5 y
Definition: BlockDXT.h:273
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:504
AlphaBlockDXT5 x
Definition: BlockDXT.h:272
void flip2()
Definition: BlockDXT.cpp:536
void flip4()
Definition: BlockDXT.cpp:529
void flip4()
Definition: BlockDXT.cpp:590
uint indices
Definition: BlockDXT.h:287
uint8 col1[2]
Definition: BlockDXT.h:284
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:566
void flip2()
Definition: BlockDXT.cpp:597
void setIndices(const int *idx)
Definition: BlockDXT.cpp:581
uint8 row[4]
Definition: BlockDXT.h:286
uint8 col0[2]
Definition: BlockDXT.h:283
void evaluatePalette(Color32 color_array[4]) const
Definition: BlockDXT.cpp:542
Color16 col1
Definition: BlockDXT.h:61
void evaluatePalette3(Color32 color_array[4]) const
Definition: BlockDXT.cpp:162
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:212
void evaluatePalette4(Color32 color_array[4]) const
Definition: BlockDXT.cpp:188
void setIndices(const int *idx)
Definition: BlockDXT.cpp:242
void flip4()
Definition: BlockDXT.cpp:251
Color16 col0
Definition: BlockDXT.h:60
uint evaluatePalette(Color32 color_array[4]) const
Definition: BlockDXT.cpp:60
void flip2()
Definition: BlockDXT.cpp:258
uint indices
Definition: BlockDXT.h:64
void decodeBlockNV5x(ColorBlock *block) const
Definition: BlockDXT.cpp:227
uint8 row[4]
Definition: BlockDXT.h:63
uint evaluatePaletteNV5x(Color32 color_array[4]) const
Definition: BlockDXT.cpp:116
bool isFourColorMode() const
Definition: BlockDXT.h:85
void decodeBlockNV5x(ColorBlock *block) const
Definition: BlockDXT.cpp:276
void flip4()
Definition: BlockDXT.cpp:316
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:267
BlockDXT1 color
Definition: BlockDXT.h:123
void flip2()
Definition: BlockDXT.cpp:323
AlphaBlockDXT3 alpha
Definition: BlockDXT.h:122
BlockDXT1 color
Definition: BlockDXT.h:251
void decodeBlockNV5x(ColorBlock *block) const
Definition: BlockDXT.cpp:452
void flip4()
Definition: BlockDXT.cpp:462
void flip2()
Definition: BlockDXT.cpp:469
AlphaBlockDXT5 alpha
Definition: BlockDXT.h:250
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:443
Definition: Stream.h:25