]> git.cworth.org Git - vogl/blob - src/voglcore/vogl_pixel_format.cpp
Initial vogl checkin
[vogl] / src / voglcore / vogl_pixel_format.cpp
1 /**************************************************************************
2  *
3  * Copyright 2013-2014 RAD Game Tools and Valve Software
4  * Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC
5  * All Rights Reserved.
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a copy
8  * of this software and associated documentation files (the "Software"), to deal
9  * in the Software without restriction, including without limitation the rights
10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11  * copies of the Software, and to permit persons to whom the Software is
12  * furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice shall be included in
15  * all copies or substantial portions of the Software.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23  * THE SOFTWARE.
24  *
25  **************************************************************************/
26
27 // File: vogl_pixel_format.cpp
28 #include "vogl_core.h"
29 #include "vogl_pixel_format.h"
30 #include "vogl_image.h"
31
32 namespace vogl
33 {
34     namespace pixel_format_helpers
35     {
36         const pixel_format g_all_pixel_formats[] =
37             {
38                 PIXEL_FMT_DXT1,
39                 PIXEL_FMT_DXT2,
40                 PIXEL_FMT_DXT3,
41                 PIXEL_FMT_DXT4,
42                 PIXEL_FMT_DXT5,
43                 PIXEL_FMT_3DC,
44                 PIXEL_FMT_DXN,
45                 PIXEL_FMT_DXT5A,
46                 PIXEL_FMT_DXT5_CCxY,
47                 PIXEL_FMT_DXT5_xGxR,
48                 PIXEL_FMT_DXT5_xGBR,
49                 PIXEL_FMT_DXT5_AGBR,
50                 PIXEL_FMT_DXT1A,
51                 PIXEL_FMT_ETC1,
52                 PIXEL_FMT_R8G8B8,
53                 PIXEL_FMT_L8,
54                 PIXEL_FMT_A8,
55                 PIXEL_FMT_A8L8,
56                 PIXEL_FMT_A8R8G8B8
57             };
58
59         uint get_num_formats()
60         {
61             return sizeof(g_all_pixel_formats) / sizeof(g_all_pixel_formats[0]);
62         }
63
64         pixel_format get_pixel_format_by_index(uint index)
65         {
66             VOGL_ASSERT(index < get_num_formats());
67             return g_all_pixel_formats[index];
68         }
69
70         const char *get_pixel_format_string(pixel_format fmt)
71         {
72             switch (fmt)
73             {
74                 case PIXEL_FMT_INVALID:
75                     return "INVALID";
76                 case PIXEL_FMT_DXT1:
77                     return "DXT1";
78                 case PIXEL_FMT_DXT1A:
79                     return "DXT1A";
80                 case PIXEL_FMT_DXT2:
81                     return "DXT2";
82                 case PIXEL_FMT_DXT3:
83                     return "DXT3";
84                 case PIXEL_FMT_DXT4:
85                     return "DXT4";
86                 case PIXEL_FMT_DXT5:
87                     return "DXT5";
88                 case PIXEL_FMT_3DC:
89                     return "3DC";
90                 case PIXEL_FMT_DXN:
91                     return "DXN";
92                 case PIXEL_FMT_DXT5A:
93                     return "DXT5A";
94                 case PIXEL_FMT_DXT5_CCxY:
95                     return "DXT5_CCxY";
96                 case PIXEL_FMT_DXT5_xGxR:
97                     return "DXT5_xGxR";
98                 case PIXEL_FMT_DXT5_xGBR:
99                     return "DXT5_xGBR";
100                 case PIXEL_FMT_DXT5_AGBR:
101                     return "DXT5_AGBR";
102                 case PIXEL_FMT_ETC1:
103                     return "ETC1";
104                 case PIXEL_FMT_R8G8B8:
105                     return "R8G8B8";
106                 case PIXEL_FMT_A8R8G8B8:
107                     return "A8R8G8B8";
108                 case PIXEL_FMT_A8:
109                     return "A8";
110                 case PIXEL_FMT_L8:
111                     return "L8";
112                 case PIXEL_FMT_A8L8:
113                     return "A8L8";
114                 default:
115                     break;
116             }
117             VOGL_ASSERT(false);
118             return "?";
119         }
120
121         const char *get_vogl_format_string(vogl_format fmt)
122         {
123             switch (fmt)
124             {
125                 case cCRNFmtDXT1:
126                     return "DXT1";
127                 case cCRNFmtDXT3:
128                     return "DXT3";
129                 case cCRNFmtDXT5:
130                     return "DXT5";
131                 case cCRNFmtDXT5_CCxY:
132                     return "DXT5_CCxY";
133                 case cCRNFmtDXT5_xGBR:
134                     return "DXT5_xGBR";
135                 case cCRNFmtDXT5_AGBR:
136                     return "DXT5_AGBR";
137                 case cCRNFmtDXT5_xGxR:
138                     return "DXT5_xGxR";
139                 case cCRNFmtDXN_XY:
140                     return "DXN_XY";
141                 case cCRNFmtDXN_YX:
142                     return "DXN_YX";
143                 case cCRNFmtDXT5A:
144                     return "DXT5A";
145                 case cCRNFmtETC1:
146                     return "ETC1";
147                 default:
148                     break;
149             }
150             VOGL_ASSERT(false);
151             return "?";
152         }
153
154         component_flags get_component_flags(pixel_format fmt)
155         {
156             // These flags are for *uncooked* pixels, i.e. after after adding Z to DXN maps, or converting YCC maps to RGB, etc.
157
158             uint flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagGrayscale;
159             switch (fmt)
160             {
161                 case PIXEL_FMT_DXT1:
162                 case PIXEL_FMT_ETC1:
163                 {
164                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid;
165                     break;
166                 }
167                 case PIXEL_FMT_DXT1A:
168                 {
169                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
170                     break;
171                 }
172                 case PIXEL_FMT_DXT2:
173                 case PIXEL_FMT_DXT3:
174                 {
175                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
176                     break;
177                 }
178                 case PIXEL_FMT_DXT4:
179                 case PIXEL_FMT_DXT5:
180                 {
181                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
182                     break;
183                 }
184                 case PIXEL_FMT_DXT5A:
185                 {
186                     flags = cCompFlagAValid;
187                     break;
188                 }
189                 case PIXEL_FMT_DXT5_CCxY:
190                 {
191                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagLumaChroma;
192                     break;
193                 }
194                 case PIXEL_FMT_DXT5_xGBR:
195                 {
196                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
197                     break;
198                 }
199                 case PIXEL_FMT_DXT5_AGBR:
200                 {
201                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagNormalMap;
202                     break;
203                 }
204                 case PIXEL_FMT_DXT5_xGxR:
205                 {
206                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
207                     break;
208                 }
209                 case PIXEL_FMT_3DC:
210                 {
211                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
212                     break;
213                 }
214                 case PIXEL_FMT_DXN:
215                 {
216                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
217                     break;
218                 }
219                 case PIXEL_FMT_R8G8B8:
220                 {
221                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid;
222                     break;
223                 }
224                 case PIXEL_FMT_A8R8G8B8:
225                 {
226                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
227                     break;
228                 }
229                 case PIXEL_FMT_A8:
230                 {
231                     flags = cCompFlagAValid;
232                     break;
233                 }
234                 case PIXEL_FMT_L8:
235                 {
236                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagGrayscale;
237                     break;
238                 }
239                 case PIXEL_FMT_A8L8:
240                 {
241                     flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagGrayscale;
242                     break;
243                 }
244                 default:
245                 {
246                     VOGL_ASSERT_ALWAYS;
247                     break;
248                 }
249             }
250             return static_cast<component_flags>(flags);
251         }
252
253         vogl_format convert_pixel_format_to_best_vogl_format(pixel_format vogl_fmt)
254         {
255             vogl_format fmt = cCRNFmtDXT1;
256             switch (vogl_fmt)
257             {
258                 case PIXEL_FMT_DXT1:
259                 case PIXEL_FMT_DXT1A:
260                     fmt = cCRNFmtDXT1;
261                     break;
262                 case PIXEL_FMT_DXT2:
263                 case PIXEL_FMT_DXT3:
264                 case PIXEL_FMT_DXT4:
265                 case PIXEL_FMT_DXT5:
266                     fmt = cCRNFmtDXT5;
267                     break;
268                 case PIXEL_FMT_3DC:
269                     fmt = cCRNFmtDXN_YX;
270                     break;
271                 case PIXEL_FMT_DXN:
272                     fmt = cCRNFmtDXN_XY;
273                     break;
274                 case PIXEL_FMT_DXT5A:
275                     fmt = cCRNFmtDXT5A;
276                     break;
277                 case PIXEL_FMT_R8G8B8:
278                 case PIXEL_FMT_L8:
279                     fmt = cCRNFmtDXT1;
280                     break;
281                 case PIXEL_FMT_A8R8G8B8:
282                 case PIXEL_FMT_A8:
283                 case PIXEL_FMT_A8L8:
284                     fmt = cCRNFmtDXT5;
285                     break;
286                 case PIXEL_FMT_DXT5_CCxY:
287                     fmt = cCRNFmtDXT5_CCxY;
288                     break;
289                 case PIXEL_FMT_DXT5_xGBR:
290                     fmt = cCRNFmtDXT5_xGBR;
291                     break;
292                 case PIXEL_FMT_DXT5_AGBR:
293                     fmt = cCRNFmtDXT5_AGBR;
294                     break;
295                 case PIXEL_FMT_DXT5_xGxR:
296                     fmt = cCRNFmtDXT5_xGxR;
297                     break;
298                 case PIXEL_FMT_ETC1:
299                     fmt = cCRNFmtETC1;
300                     break;
301                 default:
302                 {
303                     VOGL_ASSERT(false);
304                     break;
305                 }
306             }
307             return fmt;
308         }
309
310         pixel_format convert_vogl_format_to_pixel_format(vogl_format fmt)
311         {
312             switch (fmt)
313             {
314                 case cCRNFmtDXT1:
315                     return PIXEL_FMT_DXT1;
316                 case cCRNFmtDXT3:
317                     return PIXEL_FMT_DXT3;
318                 case cCRNFmtDXT5:
319                     return PIXEL_FMT_DXT5;
320                 case cCRNFmtDXT5_CCxY:
321                     return PIXEL_FMT_DXT5_CCxY;
322                 case cCRNFmtDXT5_xGxR:
323                     return PIXEL_FMT_DXT5_xGxR;
324                 case cCRNFmtDXT5_xGBR:
325                     return PIXEL_FMT_DXT5_xGBR;
326                 case cCRNFmtDXT5_AGBR:
327                     return PIXEL_FMT_DXT5_AGBR;
328                 case cCRNFmtDXN_XY:
329                     return PIXEL_FMT_DXN;
330                 case cCRNFmtDXN_YX:
331                     return PIXEL_FMT_3DC;
332                 case cCRNFmtDXT5A:
333                     return PIXEL_FMT_DXT5A;
334                 case cCRNFmtETC1:
335                     return PIXEL_FMT_ETC1;
336                 default:
337                 {
338                     VOGL_ASSERT(false);
339                     break;
340                 }
341             }
342
343             return PIXEL_FMT_INVALID;
344         }
345
346     } // namespace pixel_format
347
348 } // namespace vogl