Blender  V3.3
BlockDXT.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 /*
8  * This file is based on a similar file from the NVIDIA texture tools
9  * (http://nvidia-texture-tools.googlecode.com/)
10  *
11  * Original license from NVIDIA follows.
12  */
13 
14 /* Copyright NVIDIA Corporation 2007 -- Ignacio Castano <icastano@nvidia.com>
15  *
16  * Permission is hereby granted, free of charge, to any person
17  * obtaining a copy of this software and associated documentation
18  * files (the "Software"), to deal in the Software without
19  * restriction, including without limitation the rights to use,
20  * copy, modify, merge, publish, distribute, sublicense, and/or sell
21  * copies of the Software, and to permit persons to whom the
22  * Software is furnished to do so, subject to the following
23  * conditions:
24  *
25  * The above copyright notice and this permission notice shall be
26  * included in all copies or substantial portions of the Software.
27  *
28  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
29  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
30  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
31  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
32  * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
33  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
34  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
35  * OTHER DEALINGS IN THE SOFTWARE. */
36 
37 #pragma once
38 
39 #include <Color.h>
40 #include <ColorBlock.h>
41 #include <Common.h>
42 #include <Stream.h>
43 
45 struct BlockDXT1 {
48  union {
49  uint8 row[4];
51  };
52 
53  bool isFourColorMode() const;
54 
55  uint evaluatePalette(Color32 color_array[4]) const;
56  uint evaluatePaletteNV5x(Color32 color_array[4]) const;
57 
59  void evaluatePalette3(Color32 color_array[4]) const;
61  void evaluatePalette4(Color32 color_array[4]) const;
62 
63  void decodeBlock(ColorBlock *block) const;
64  void decodeBlockNV5x(ColorBlock *block) const;
65 
66  void setIndices(const int *idx);
67 
69  void flip4();
71  void flip2();
72 };
73 
75 inline bool BlockDXT1::isFourColorMode() const
76 {
77  return col0.u > col1.u;
78 }
79 
82  union {
83  struct {
84  uint alpha0 : 4;
85  uint alpha1 : 4;
86  uint alpha2 : 4;
87  uint alpha3 : 4;
88  uint alpha4 : 4;
89  uint alpha5 : 4;
90  uint alpha6 : 4;
91  uint alpha7 : 4;
92  uint alpha8 : 4;
93  uint alpha9 : 4;
94  uint alphaA : 4;
95  uint alphaB : 4;
96  uint alphaC : 4;
97  uint alphaD : 4;
98  uint alphaE : 4;
99  uint alphaF : 4;
100  };
102  };
103 
104  void decodeBlock(ColorBlock *block) const;
105 
107  void flip4();
109  void flip2();
110 };
111 
113 struct BlockDXT3 {
116 
117  void decodeBlock(ColorBlock *block) const;
118  void decodeBlockNV5x(ColorBlock *block) const;
119 
121  void flip4();
123  void flip2();
124 };
125 
128  /* uint64 unions do not compile on all platforms */
129 #if 0
130  union {
131  struct {
132  uint64 alpha0 : 8; /* 8 */
133  uint64 alpha1 : 8; /* 16 */
134  uint64 bits0 : 3; /* 3 - 19 */
135  uint64 bits1 : 3; /* 6 - 22 */
136  uint64 bits2 : 3; /* 9 - 25 */
137  uint64 bits3 : 3; /* 12 - 28 */
138  uint64 bits4 : 3; /* 15 - 31 */
139  uint64 bits5 : 3; /* 18 - 34 */
140  uint64 bits6 : 3; /* 21 - 37 */
141  uint64 bits7 : 3; /* 24 - 40 */
142  uint64 bits8 : 3; /* 27 - 43 */
143  uint64 bits9 : 3; /* 30 - 46 */
144  uint64 bitsA : 3; /* 33 - 49 */
145  uint64 bitsB : 3; /* 36 - 52 */
146  uint64 bitsC : 3; /* 39 - 55 */
147  uint64 bitsD : 3; /* 42 - 58 */
148  uint64 bitsE : 3; /* 45 - 61 */
149  uint64 bitsF : 3; /* 48 - 64 */
150  };
151  uint64 u;
152  };
153 #endif
155  uint8 alpha0() const
156  {
157  return u & 0xffLL;
158  }
159  uint8 alpha1() const
160  {
161  return (u >> 8) & 0xffLL;
162  }
163  uint8 bits0() const
164  {
165  return (u >> 16) & 0x7LL;
166  }
167  uint8 bits1() const
168  {
169  return (u >> 19) & 0x7LL;
170  }
171  uint8 bits2() const
172  {
173  return (u >> 22) & 0x7LL;
174  }
175  uint8 bits3() const
176  {
177  return (u >> 25) & 0x7LL;
178  }
179  uint8 bits4() const
180  {
181  return (u >> 28) & 0x7LL;
182  }
183  uint8 bits5() const
184  {
185  return (u >> 31) & 0x7LL;
186  }
187  uint8 bits6() const
188  {
189  return (u >> 34) & 0x7LL;
190  }
191  uint8 bits7() const
192  {
193  return (u >> 37) & 0x7LL;
194  }
195  uint8 bits8() const
196  {
197  return (u >> 40) & 0x7LL;
198  }
199  uint8 bits9() const
200  {
201  return (u >> 43) & 0x7LL;
202  }
203  uint8 bitsA() const
204  {
205  return (u >> 46) & 0x7LL;
206  }
207  uint8 bitsB() const
208  {
209  return (u >> 49) & 0x7LL;
210  }
211  uint8 bitsC() const
212  {
213  return (u >> 52) & 0x7LL;
214  }
215  uint8 bitsD() const
216  {
217  return (u >> 55) & 0x7LL;
218  }
219  uint8 bitsE() const
220  {
221  return (u >> 58) & 0x7LL;
222  }
223  uint8 bitsF() const
224  {
225  return (u >> 61) & 0x7LL;
226  }
227 
228  void evaluatePalette(uint8 alpha[8]) const;
229  void evaluatePalette8(uint8 alpha[8]) const;
230  void evaluatePalette6(uint8 alpha[8]) const;
231  void indices(uint8 index_array[16]) const;
232 
233  uint index(uint index) const;
234  void setIndex(uint index, uint value);
235 
236  void decodeBlock(ColorBlock *block) const;
237 
238  void flip4();
239  void flip2();
240 };
241 
243 struct BlockDXT5 {
246 
247  void decodeBlock(ColorBlock *block) const;
248  void decodeBlockNV5x(ColorBlock *block) const;
249 
251  void flip4();
253  void flip2();
254 };
255 
257 struct BlockATI1 {
259 
261  void decodeBlock(ColorBlock *block) const;
262 
264  void flip4();
266  void flip2();
267 };
268 
270 struct BlockATI2 {
273 
275  void decodeBlock(ColorBlock *block) const;
276 
278  void flip4();
280  void flip2();
281 };
282 
284 struct BlockCTX1 {
287  union {
288  uint8 row[4];
290  };
291 
292  void evaluatePalette(Color32 color_array[4]) const;
293  void setIndices(const int *idx);
294 
295  void decodeBlock(ColorBlock *block) const;
296 
298  void flip4();
300  void flip2();
301 };
302 
303 void mem_read(Stream &mem, BlockDXT1 &block);
304 void mem_read(Stream &mem, AlphaBlockDXT3 &block);
305 void mem_read(Stream &mem, BlockDXT3 &block);
306 void mem_read(Stream &mem, AlphaBlockDXT5 &block);
307 void mem_read(Stream &mem, BlockDXT5 &block);
308 void mem_read(Stream &mem, BlockATI1 &block);
309 void mem_read(Stream &mem, BlockATI2 &block);
310 void mem_read(Stream &mem, BlockCTX1 &block);
unsigned int uint
Definition: BLI_sys_types.h:67
void mem_read(Stream &mem, BlockDXT1 &block)
Definition: BlockDXT.cpp:570
unsigned short uint16
Definition: Common.h:27
unsigned long long uint64
Definition: Common.h:30
unsigned char uint8
Definition: Common.h:26
Definition: Color.h:82
unsigned short u
Definition: Color.h:100
Definition: Color.h:19
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:264
uint16 row[4]
Definition: BlockDXT.h:101
void indices(uint8 index_array[16]) const
Definition: BlockDXT.cpp:349
uint index(uint index) const
Definition: BlockDXT.cpp:369
uint8 bits6() const
Definition: BlockDXT.h:187
void setIndex(uint index, uint value)
Definition: BlockDXT.cpp:375
uint8 alpha0() const
Definition: BlockDXT.h:155
uint8 bitsF() const
Definition: BlockDXT.h:223
uint8 bitsD() const
Definition: BlockDXT.h:215
uint8 bits9() const
Definition: BlockDXT.h:199
uint8 bits2() const
Definition: BlockDXT.h:171
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:382
uint8 bits0() const
Definition: BlockDXT.h:163
uint8 bitsC() const
Definition: BlockDXT.h:211
void evaluatePalette8(uint8 alpha[8]) const
Definition: BlockDXT.cpp:321
void evaluatePalette(uint8 alpha[8]) const
Definition: BlockDXT.cpp:311
uint8 bitsB() const
Definition: BlockDXT.h:207
uint8 bits7() const
Definition: BlockDXT.h:191
void evaluatePalette6(uint8 alpha[8]) const
Definition: BlockDXT.cpp:335
uint8 bits5() const
Definition: BlockDXT.h:183
uint8 bits4() const
Definition: BlockDXT.h:179
uint8 bitsE() const
Definition: BlockDXT.h:219
uint8 alpha1() const
Definition: BlockDXT.h:159
uint8 bits8() const
Definition: BlockDXT.h:195
uint8 bits3() const
Definition: BlockDXT.h:175
uint8 bits1() const
Definition: BlockDXT.h:167
uint8 bitsA() const
Definition: BlockDXT.h:203
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:451
void flip2()
Definition: BlockDXT.cpp:471
AlphaBlockDXT5 alpha
Definition: BlockDXT.h:258
void flip4()
Definition: BlockDXT.cpp:466
AlphaBlockDXT5 y
Definition: BlockDXT.h:272
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:476
AlphaBlockDXT5 x
Definition: BlockDXT.h:271
void flip2()
Definition: BlockDXT.cpp:506
void flip4()
Definition: BlockDXT.cpp:500
void flip4()
Definition: BlockDXT.cpp:559
uint indices
Definition: BlockDXT.h:289
uint8 col1[2]
Definition: BlockDXT.h:286
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:536
void flip2()
Definition: BlockDXT.cpp:565
void setIndices(const int *idx)
Definition: BlockDXT.cpp:551
uint8 row[4]
Definition: BlockDXT.h:288
uint8 col0[2]
Definition: BlockDXT.h:285
void evaluatePalette(Color32 color_array[4]) const
Definition: BlockDXT.cpp:512
Color16 col1
Definition: BlockDXT.h:47
void evaluatePalette3(Color32 color_array[4]) const
Definition: BlockDXT.cpp:147
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:196
void evaluatePalette4(Color32 color_array[4]) const
Definition: BlockDXT.cpp:172
void setIndices(const int *idx)
Definition: BlockDXT.cpp:226
void flip4()
Definition: BlockDXT.cpp:234
Color16 col0
Definition: BlockDXT.h:46
uint evaluatePalette(Color32 color_array[4]) const
Definition: BlockDXT.cpp:46
void flip2()
Definition: BlockDXT.cpp:240
uint indices
Definition: BlockDXT.h:50
void decodeBlockNV5x(ColorBlock *block) const
Definition: BlockDXT.cpp:211
uint8 row[4]
Definition: BlockDXT.h:49
uint evaluatePaletteNV5x(Color32 color_array[4]) const
Definition: BlockDXT.cpp:102
bool isFourColorMode() const
Definition: BlockDXT.h:75
void decodeBlockNV5x(ColorBlock *block) const
Definition: BlockDXT.cpp:258
void flip4()
Definition: BlockDXT.cpp:295
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:249
BlockDXT1 color
Definition: BlockDXT.h:115
void flip2()
Definition: BlockDXT.cpp:301
AlphaBlockDXT3 alpha
Definition: BlockDXT.h:114
BlockDXT1 color
Definition: BlockDXT.h:245
void decodeBlockNV5x(ColorBlock *block) const
Definition: BlockDXT.cpp:430
void flip4()
Definition: BlockDXT.cpp:439
void flip2()
Definition: BlockDXT.cpp:445
AlphaBlockDXT5 alpha
Definition: BlockDXT.h:244
void decodeBlock(ColorBlock *block) const
Definition: BlockDXT.cpp:421
Definition: Stream.h:11