315 lines
6.9 KiB
C++
315 lines
6.9 KiB
C++
// File: crn_pixel_format.h
|
|
// See Copyright Notice and license at the end of inc/crnlib.h
|
|
#pragma once
|
|
#include "crn_dxt.h"
|
|
#include "../inc/crnlib.h"
|
|
#include "../inc/dds_defs.h"
|
|
|
|
namespace crnlib {
|
|
namespace pixel_format_helpers {
|
|
uint get_num_formats();
|
|
pixel_format get_pixel_format_by_index(uint index);
|
|
|
|
const char* get_pixel_format_string(pixel_format fmt);
|
|
|
|
const char* get_crn_format_string(crn_format fmt);
|
|
|
|
inline bool is_grayscale(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_L8:
|
|
case PIXEL_FMT_A8L8:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
inline bool is_dxt1(pixel_format fmt) {
|
|
return (fmt == PIXEL_FMT_DXT1) || (fmt == PIXEL_FMT_DXT1A);
|
|
}
|
|
|
|
// has_alpha() should probably be called "has_opacity()" - it indicates if the format encodes opacity
|
|
// because some swizzled DXT5 formats do not encode opacity.
|
|
inline bool has_alpha(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_DXT1A:
|
|
case PIXEL_FMT_DXT2:
|
|
case PIXEL_FMT_DXT3:
|
|
case PIXEL_FMT_DXT4:
|
|
case PIXEL_FMT_DXT5:
|
|
case PIXEL_FMT_DXT5A:
|
|
case PIXEL_FMT_A8R8G8B8:
|
|
case PIXEL_FMT_A8:
|
|
case PIXEL_FMT_A8L8:
|
|
case PIXEL_FMT_DXT5_AGBR:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
inline bool is_alpha_only(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_A8:
|
|
case PIXEL_FMT_DXT5A:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
inline bool is_normal_map(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_3DC:
|
|
case PIXEL_FMT_DXN:
|
|
case PIXEL_FMT_DXT5_xGBR:
|
|
case PIXEL_FMT_DXT5_xGxR:
|
|
case PIXEL_FMT_DXT5_AGBR:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
inline int is_dxt(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_DXT1:
|
|
case PIXEL_FMT_DXT1A:
|
|
case PIXEL_FMT_DXT2:
|
|
case PIXEL_FMT_DXT3:
|
|
case PIXEL_FMT_DXT4:
|
|
case PIXEL_FMT_DXT5:
|
|
case PIXEL_FMT_3DC:
|
|
case PIXEL_FMT_DXT5A:
|
|
case PIXEL_FMT_DXN:
|
|
case PIXEL_FMT_DXT5_CCxY:
|
|
case PIXEL_FMT_DXT5_xGxR:
|
|
case PIXEL_FMT_DXT5_xGBR:
|
|
case PIXEL_FMT_DXT5_AGBR:
|
|
case PIXEL_FMT_ETC1:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
inline int get_fundamental_format(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_DXT1A:
|
|
return PIXEL_FMT_DXT1;
|
|
case PIXEL_FMT_DXT5_CCxY:
|
|
case PIXEL_FMT_DXT5_xGxR:
|
|
case PIXEL_FMT_DXT5_xGBR:
|
|
case PIXEL_FMT_DXT5_AGBR:
|
|
return PIXEL_FMT_DXT5;
|
|
default:
|
|
break;
|
|
}
|
|
return fmt;
|
|
}
|
|
|
|
inline dxt_format get_dxt_format(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_DXT1:
|
|
return cDXT1;
|
|
case PIXEL_FMT_DXT1A:
|
|
return cDXT1A;
|
|
case PIXEL_FMT_DXT2:
|
|
return cDXT3;
|
|
case PIXEL_FMT_DXT3:
|
|
return cDXT3;
|
|
case PIXEL_FMT_DXT4:
|
|
return cDXT5;
|
|
case PIXEL_FMT_DXT5:
|
|
return cDXT5;
|
|
case PIXEL_FMT_3DC:
|
|
return cDXN_YX;
|
|
case PIXEL_FMT_DXT5A:
|
|
return cDXT5A;
|
|
case PIXEL_FMT_DXN:
|
|
return cDXN_XY;
|
|
case PIXEL_FMT_DXT5_CCxY:
|
|
return cDXT5;
|
|
case PIXEL_FMT_DXT5_xGxR:
|
|
return cDXT5;
|
|
case PIXEL_FMT_DXT5_xGBR:
|
|
return cDXT5;
|
|
case PIXEL_FMT_DXT5_AGBR:
|
|
return cDXT5;
|
|
case PIXEL_FMT_ETC1:
|
|
return cETC1;
|
|
default:
|
|
break;
|
|
}
|
|
return cDXTInvalid;
|
|
}
|
|
|
|
inline pixel_format from_dxt_format(dxt_format dxt_fmt) {
|
|
switch (dxt_fmt) {
|
|
case cDXT1:
|
|
return PIXEL_FMT_DXT1;
|
|
case cDXT1A:
|
|
return PIXEL_FMT_DXT1A;
|
|
case cDXT3:
|
|
return PIXEL_FMT_DXT3;
|
|
case cDXT5:
|
|
return PIXEL_FMT_DXT5;
|
|
case cDXN_XY:
|
|
return PIXEL_FMT_DXN;
|
|
case cDXN_YX:
|
|
return PIXEL_FMT_3DC;
|
|
case cDXT5A:
|
|
return PIXEL_FMT_DXT5A;
|
|
case cETC1:
|
|
return PIXEL_FMT_ETC1;
|
|
default:
|
|
break;
|
|
}
|
|
CRNLIB_ASSERT(false);
|
|
return PIXEL_FMT_INVALID;
|
|
}
|
|
|
|
inline bool is_pixel_format_non_srgb(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_3DC:
|
|
case PIXEL_FMT_DXN:
|
|
case PIXEL_FMT_DXT5A:
|
|
case PIXEL_FMT_DXT5_CCxY:
|
|
case PIXEL_FMT_DXT5_xGxR:
|
|
case PIXEL_FMT_DXT5_xGBR:
|
|
case PIXEL_FMT_DXT5_AGBR:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
inline bool is_crn_format_non_srgb(crn_format fmt) {
|
|
switch (fmt) {
|
|
case cCRNFmtDXN_XY:
|
|
case cCRNFmtDXN_YX:
|
|
case cCRNFmtDXT5A:
|
|
case cCRNFmtDXT5_CCxY:
|
|
case cCRNFmtDXT5_xGxR:
|
|
case cCRNFmtDXT5_xGBR:
|
|
case cCRNFmtDXT5_AGBR:
|
|
return true;
|
|
default:
|
|
break;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
inline uint get_bpp(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_DXT1:
|
|
return 4;
|
|
case PIXEL_FMT_DXT1A:
|
|
return 4;
|
|
case PIXEL_FMT_ETC1:
|
|
return 4;
|
|
case PIXEL_FMT_DXT2:
|
|
return 8;
|
|
case PIXEL_FMT_DXT3:
|
|
return 8;
|
|
case PIXEL_FMT_DXT4:
|
|
return 8;
|
|
case PIXEL_FMT_DXT5:
|
|
return 8;
|
|
case PIXEL_FMT_3DC:
|
|
return 8;
|
|
case PIXEL_FMT_DXT5A:
|
|
return 4;
|
|
case PIXEL_FMT_R8G8B8:
|
|
return 24;
|
|
case PIXEL_FMT_A8R8G8B8:
|
|
return 32;
|
|
case PIXEL_FMT_A8:
|
|
return 8;
|
|
case PIXEL_FMT_L8:
|
|
return 8;
|
|
case PIXEL_FMT_A8L8:
|
|
return 16;
|
|
case PIXEL_FMT_DXN:
|
|
return 8;
|
|
case PIXEL_FMT_DXT5_CCxY:
|
|
return 8;
|
|
case PIXEL_FMT_DXT5_xGxR:
|
|
return 8;
|
|
case PIXEL_FMT_DXT5_xGBR:
|
|
return 8;
|
|
case PIXEL_FMT_DXT5_AGBR:
|
|
return 8;
|
|
default:
|
|
break;
|
|
}
|
|
CRNLIB_ASSERT(false);
|
|
return 0;
|
|
};
|
|
|
|
inline uint get_dxt_bytes_per_block(pixel_format fmt) {
|
|
switch (fmt) {
|
|
case PIXEL_FMT_DXT1:
|
|
return 8;
|
|
case PIXEL_FMT_DXT1A:
|
|
return 8;
|
|
case PIXEL_FMT_DXT5A:
|
|
return 8;
|
|
case PIXEL_FMT_ETC1:
|
|
return 8;
|
|
case PIXEL_FMT_DXT2:
|
|
return 16;
|
|
case PIXEL_FMT_DXT3:
|
|
return 16;
|
|
case PIXEL_FMT_DXT4:
|
|
return 16;
|
|
case PIXEL_FMT_DXT5:
|
|
return 16;
|
|
case PIXEL_FMT_3DC:
|
|
return 16;
|
|
case PIXEL_FMT_DXN:
|
|
return 16;
|
|
case PIXEL_FMT_DXT5_CCxY:
|
|
return 16;
|
|
case PIXEL_FMT_DXT5_xGxR:
|
|
return 16;
|
|
case PIXEL_FMT_DXT5_xGBR:
|
|
return 16;
|
|
case PIXEL_FMT_DXT5_AGBR:
|
|
return 16;
|
|
default:
|
|
break;
|
|
}
|
|
CRNLIB_ASSERT(false);
|
|
return 0;
|
|
}
|
|
|
|
enum component_flags {
|
|
cCompFlagRValid = 1,
|
|
cCompFlagGValid = 2,
|
|
cCompFlagBValid = 4,
|
|
cCompFlagAValid = 8,
|
|
|
|
cCompFlagGrayscale = 16,
|
|
cCompFlagNormalMap = 32,
|
|
cCompFlagLumaChroma = 64,
|
|
|
|
cDefaultCompFlags = cCompFlagRValid | cCompFlagGValid | cCompFlagBValid | cCompFlagAValid
|
|
};
|
|
|
|
component_flags get_component_flags(pixel_format fmt);
|
|
|
|
crn_format convert_pixel_format_to_best_crn_format(pixel_format crn_fmt);
|
|
|
|
pixel_format convert_crn_format_to_pixel_format(crn_format fmt);
|
|
|
|
} // namespace pixel_format_helpers
|
|
|
|
} // namespace crnlib
|