285 lines
8.3 KiB
C
285 lines
8.3 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
|
||
|
|