| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- // File: crn_pixel_format.cpp
- // See Copyright Notice and license at the end of inc/crnlib.h
- #include "crn_core.h"
- #include "crn_pixel_format.h"
- #include "crn_image.h"
- namespace crnlib
- {
- namespace pixel_format_helpers
- {
- const pixel_format g_all_pixel_formats[] =
- {
- PIXEL_FMT_DXT1,
- PIXEL_FMT_DXT2,
- PIXEL_FMT_DXT3,
- PIXEL_FMT_DXT4,
- PIXEL_FMT_DXT5,
- PIXEL_FMT_3DC,
- PIXEL_FMT_DXN,
- PIXEL_FMT_DXT5A,
- PIXEL_FMT_DXT5_CCxY,
- PIXEL_FMT_DXT5_xGxR,
- PIXEL_FMT_DXT5_xGBR,
- PIXEL_FMT_DXT5_AGBR,
- PIXEL_FMT_DXT1A,
- PIXEL_FMT_ETC1,
- PIXEL_FMT_R8G8B8,
- PIXEL_FMT_L8,
- PIXEL_FMT_A8,
- PIXEL_FMT_A8L8,
- PIXEL_FMT_A8R8G8B8
- };
- uint get_num_formats()
- {
- return sizeof(g_all_pixel_formats) / sizeof(g_all_pixel_formats[0]);
- }
- pixel_format get_pixel_format_by_index(uint index)
- {
- CRNLIB_ASSERT(index < get_num_formats());
- return g_all_pixel_formats[index];
- }
- const char* get_pixel_format_string(pixel_format fmt)
- {
- switch (fmt)
- {
- case PIXEL_FMT_INVALID: return "INVALID";
- case PIXEL_FMT_DXT1: return "DXT1";
- case PIXEL_FMT_DXT1A: return "DXT1A";
- case PIXEL_FMT_DXT2: return "DXT2";
- case PIXEL_FMT_DXT3: return "DXT3";
- case PIXEL_FMT_DXT4: return "DXT4";
- case PIXEL_FMT_DXT5: return "DXT5";
- case PIXEL_FMT_3DC: return "3DC";
- case PIXEL_FMT_DXN: return "DXN";
- case PIXEL_FMT_DXT5A: return "DXT5A";
- case PIXEL_FMT_DXT5_CCxY: return "DXT5_CCxY";
- case PIXEL_FMT_DXT5_xGxR: return "DXT5_xGxR";
- case PIXEL_FMT_DXT5_xGBR: return "DXT5_xGBR";
- case PIXEL_FMT_DXT5_AGBR: return "DXT5_AGBR";
- case PIXEL_FMT_ETC1: return "ETC1";
- case PIXEL_FMT_R8G8B8: return "R8G8B8";
- case PIXEL_FMT_A8R8G8B8: return "A8R8G8B8";
- case PIXEL_FMT_A8: return "A8";
- case PIXEL_FMT_L8: return "L8";
- case PIXEL_FMT_A8L8: return "A8L8";
- default: break;
- }
- CRNLIB_ASSERT(false);
- return "?";
- }
- const char* get_crn_format_string(crn_format fmt)
- {
- switch (fmt)
- {
- case cCRNFmtDXT1: return "DXT1";
- case cCRNFmtDXT3: return "DXT3";
- case cCRNFmtDXT5: return "DXT5";
- case cCRNFmtDXT5_CCxY: return "DXT5_CCxY";
- case cCRNFmtDXT5_xGBR: return "DXT5_xGBR";
- case cCRNFmtDXT5_AGBR: return "DXT5_AGBR";
- case cCRNFmtDXT5_xGxR: return "DXT5_xGxR";
- case cCRNFmtDXN_XY: return "DXN_XY";
- case cCRNFmtDXN_YX: return "DXN_YX";
- case cCRNFmtDXT5A: return "DXT5A";
- case cCRNFmtETC1: return "ETC1";
- default: break;
- }
- CRNLIB_ASSERT(false);
- return "?";
- }
- component_flags get_component_flags(pixel_format fmt)
- {
- // These flags are for *uncooked* pixels, i.e. after after adding Z to DXN maps, or converting YCC maps to RGB, etc.
- uint flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagGrayscale;
- switch (fmt)
- {
- case PIXEL_FMT_DXT1:
- case PIXEL_FMT_ETC1:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid;
- break;
- }
- case PIXEL_FMT_DXT1A:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
- break;
- }
- case PIXEL_FMT_DXT2:
- case PIXEL_FMT_DXT3:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
- break;
- }
- case PIXEL_FMT_DXT4:
- case PIXEL_FMT_DXT5:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
- break;
- }
- case PIXEL_FMT_DXT5A:
- {
- flags = cCompFlagAValid;
- break;
- }
- case PIXEL_FMT_DXT5_CCxY:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagLumaChroma;
- break;
- }
- case PIXEL_FMT_DXT5_xGBR:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
- break;
- }
- case PIXEL_FMT_DXT5_AGBR:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagNormalMap;
- break;
- }
- case PIXEL_FMT_DXT5_xGxR:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
- break;
- }
- case PIXEL_FMT_3DC:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
- break;
- }
- case PIXEL_FMT_DXN:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagNormalMap;
- break;
- }
- case PIXEL_FMT_R8G8B8:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid;
- break;
- }
- case PIXEL_FMT_A8R8G8B8:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid;
- break;
- }
- case PIXEL_FMT_A8:
- {
- flags = cCompFlagAValid;
- break;
- }
- case PIXEL_FMT_L8:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagGrayscale;
- break;
- }
- case PIXEL_FMT_A8L8:
- {
- flags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid | cCompFlagGrayscale;
- break;
- }
- default:
- {
- CRNLIB_ASSERT(0);
- break;
- }
- }
- return static_cast<component_flags>(flags);
- }
- crn_format convert_pixel_format_to_best_crn_format(pixel_format crn_fmt)
- {
- crn_format fmt = cCRNFmtDXT1;
- switch (crn_fmt)
- {
- case PIXEL_FMT_DXT1:
- case PIXEL_FMT_DXT1A:
- fmt = cCRNFmtDXT1;
- break;
- case PIXEL_FMT_DXT2:
- case PIXEL_FMT_DXT3:
- case PIXEL_FMT_DXT4:
- case PIXEL_FMT_DXT5:
- fmt = cCRNFmtDXT5;
- break;
- case PIXEL_FMT_3DC:
- fmt = cCRNFmtDXN_YX;
- break;
- case PIXEL_FMT_DXN:
- fmt = cCRNFmtDXN_XY;
- break;
- case PIXEL_FMT_DXT5A:
- fmt = cCRNFmtDXT5A;
- break;
- case PIXEL_FMT_R8G8B8:
- case PIXEL_FMT_L8:
- fmt = cCRNFmtDXT1;
- break;
- case PIXEL_FMT_A8R8G8B8:
- case PIXEL_FMT_A8:
- case PIXEL_FMT_A8L8:
- fmt = cCRNFmtDXT5;
- break;
- case PIXEL_FMT_DXT5_CCxY:
- fmt = cCRNFmtDXT5_CCxY;
- break;
- case PIXEL_FMT_DXT5_xGBR:
- fmt = cCRNFmtDXT5_xGBR;
- break;
- case PIXEL_FMT_DXT5_AGBR:
- fmt = cCRNFmtDXT5_AGBR;
- break;
- case PIXEL_FMT_DXT5_xGxR:
- fmt = cCRNFmtDXT5_xGxR;
- break;
- case PIXEL_FMT_ETC1:
- fmt = cCRNFmtETC1;
- break;
- default:
- {
- CRNLIB_ASSERT(false);
- break;
- }
- }
- return fmt;
- }
- pixel_format convert_crn_format_to_pixel_format(crn_format fmt)
- {
- switch (fmt)
- {
- case cCRNFmtDXT1: return PIXEL_FMT_DXT1;
- case cCRNFmtDXT3: return PIXEL_FMT_DXT3;
- case cCRNFmtDXT5: return PIXEL_FMT_DXT5;
- case cCRNFmtDXT5_CCxY: return PIXEL_FMT_DXT5_CCxY;
- case cCRNFmtDXT5_xGxR: return PIXEL_FMT_DXT5_xGxR;
- case cCRNFmtDXT5_xGBR: return PIXEL_FMT_DXT5_xGBR;
- case cCRNFmtDXT5_AGBR: return PIXEL_FMT_DXT5_AGBR;
- case cCRNFmtDXN_XY: return PIXEL_FMT_DXN;
- case cCRNFmtDXN_YX: return PIXEL_FMT_3DC;
- case cCRNFmtDXT5A: return PIXEL_FMT_DXT5A;
- case cCRNFmtETC1: return PIXEL_FMT_ETC1;
- default:
- {
- CRNLIB_ASSERT(false);
- break;
- }
- }
- return PIXEL_FMT_INVALID;
- }
- } // namespace pixel_format
- } // namespace crnlib
|