1 /**************************************************************************
3 * Copyright 2013-2014 RAD Game Tools and Valve Software
4 * Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC
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:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
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
25 **************************************************************************/
27 // File: vogl_pixel_format.cpp
28 #include "vogl_core.h"
29 #include "vogl_pixel_format.h"
30 #include "vogl_image.h"
34 namespace pixel_format_helpers
36 const pixel_format g_all_pixel_formats[] =
59 uint get_num_formats()
61 return sizeof(g_all_pixel_formats) / sizeof(g_all_pixel_formats[0]);
64 pixel_format get_pixel_format_by_index(uint index)
66 VOGL_ASSERT(index < get_num_formats());
67 return g_all_pixel_formats[index];
70 const char *get_pixel_format_string(pixel_format fmt)
74 case PIXEL_FMT_INVALID:
94 case PIXEL_FMT_DXT5_CCxY:
96 case PIXEL_FMT_DXT5_xGxR:
98 case PIXEL_FMT_DXT5_xGBR:
100 case PIXEL_FMT_DXT5_AGBR:
104 case PIXEL_FMT_R8G8B8:
106 case PIXEL_FMT_A8R8G8B8:
121 const char *get_vogl_format_string(vogl_format fmt)
131 case cCRNFmtDXT5_CCxY:
133 case cCRNFmtDXT5_xGBR:
135 case cCRNFmtDXT5_AGBR:
137 case cCRNFmtDXT5_xGxR:
154 component_flags get_component_flags(pixel_format fmt)
156 // These flags are for *uncooked* pixels, i.e. after after adding Z to DXN maps, or converting YCC maps to RGB, etc.
158 uint flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagGrayscale;
164 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid;
167 case PIXEL_FMT_DXT1A:
169 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
175 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
181 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
184 case PIXEL_FMT_DXT5A:
186 flags = cCompFlagAValid;
189 case PIXEL_FMT_DXT5_CCxY:
191 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagLumaChroma;
194 case PIXEL_FMT_DXT5_xGBR:
196 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
199 case PIXEL_FMT_DXT5_AGBR:
201 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagNormalMap;
204 case PIXEL_FMT_DXT5_xGxR:
206 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
211 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
216 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
219 case PIXEL_FMT_R8G8B8:
221 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid;
224 case PIXEL_FMT_A8R8G8B8:
226 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
231 flags = cCompFlagAValid;
236 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagGrayscale;
241 flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagGrayscale;
250 return static_cast<component_flags>(flags);
253 vogl_format convert_pixel_format_to_best_vogl_format(pixel_format vogl_fmt)
255 vogl_format fmt = cCRNFmtDXT1;
259 case PIXEL_FMT_DXT1A:
274 case PIXEL_FMT_DXT5A:
277 case PIXEL_FMT_R8G8B8:
281 case PIXEL_FMT_A8R8G8B8:
286 case PIXEL_FMT_DXT5_CCxY:
287 fmt = cCRNFmtDXT5_CCxY;
289 case PIXEL_FMT_DXT5_xGBR:
290 fmt = cCRNFmtDXT5_xGBR;
292 case PIXEL_FMT_DXT5_AGBR:
293 fmt = cCRNFmtDXT5_AGBR;
295 case PIXEL_FMT_DXT5_xGxR:
296 fmt = cCRNFmtDXT5_xGxR;
310 pixel_format convert_vogl_format_to_pixel_format(vogl_format fmt)
315 return PIXEL_FMT_DXT1;
317 return PIXEL_FMT_DXT3;
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;
329 return PIXEL_FMT_DXN;
331 return PIXEL_FMT_3DC;
333 return PIXEL_FMT_DXT5A;
335 return PIXEL_FMT_ETC1;
343 return PIXEL_FMT_INVALID;
346 } // namespace pixel_format