use basis_universal_sys as sys;
use std::ffi::CStr;
#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(u32)]
pub enum BasisTextureType {
TextureType2D = sys::basist_basis_texture_type_cBASISTexType2D,
TextureType2DArray = sys::basist_basis_texture_type_cBASISTexType2DArray,
TextureTypeCubemapArray = sys::basist_basis_texture_type_cBASISTexTypeCubemapArray,
TextureTypeVideoFrames = sys::basist_basis_texture_type_cBASISTexTypeVideoFrames,
TextureTypeVolume = sys::basist_basis_texture_type_cBASISTexTypeVolume,
}
impl Into<sys::basist_basis_texture_type> for BasisTextureType {
fn into(self) -> sys::basist_basis_texture_type {
self as sys::basist_basis_texture_type
}
}
impl From<sys::basist_basis_texture_type> for BasisTextureType {
fn from(value: sys::basist_basis_texture_type) -> Self {
unsafe { std::mem::transmute(value as u32) }
}
}
impl BasisTextureType {
pub fn texture_type_name(self) -> &'static str {
unsafe {
let value = sys::basis_get_texture_type_name(self.into());
CStr::from_ptr(value).to_str().unwrap()
}
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(i32)]
pub enum BasisTextureFormat {
ETC1S = sys::basist_basis_tex_format_cETC1S,
UASTC4x4 = sys::basist_basis_tex_format_cUASTC4x4,
}
impl Into<sys::basist_basis_tex_format> for BasisTextureFormat {
fn into(self) -> sys::basist_basis_tex_format {
self as sys::basist_basis_tex_format
}
}
impl From<sys::basist_basis_tex_format> for BasisTextureFormat {
fn from(value: sys::basist_basis_tex_format) -> Self {
unsafe { std::mem::transmute(value as i32) }
}
}
impl BasisTextureFormat {
pub fn can_transcode_to_format(
self,
transcoder_texture_format: TranscoderTextureFormat,
) -> bool {
unsafe { sys::basis_is_format_supported(transcoder_texture_format.into(), self.into()) }
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(i32)]
pub enum TranscoderTextureFormat {
ETC1_RGB = sys::basist_transcoder_texture_format_cTFETC1_RGB,
ETC2_RBG = sys::basist_transcoder_texture_format_cTFETC2_RGBA,
BC1_RGB = sys::basist_transcoder_texture_format_cTFBC1_RGB,
BC3_RGBA = sys::basist_transcoder_texture_format_cTFBC3_RGBA,
BC4_R = sys::basist_transcoder_texture_format_cTFBC4_R,
BC5_RG = sys::basist_transcoder_texture_format_cTFBC5_RG,
BC7_RGBA = sys::basist_transcoder_texture_format_cTFBC7_RGBA,
PVRTC1_4_RGB = sys::basist_transcoder_texture_format_cTFPVRTC1_4_RGB,
PVRTC1_4_RGBA = sys::basist_transcoder_texture_format_cTFPVRTC1_4_RGBA,
ASTC_4x4_RGBA = sys::basist_transcoder_texture_format_cTFASTC_4x4_RGBA,
ATC_RGB = sys::basist_transcoder_texture_format_cTFATC_RGB,
ATC_RGBA = sys::basist_transcoder_texture_format_cTFATC_RGBA,
FXT1_RGB = sys::basist_transcoder_texture_format_cTFFXT1_RGB,
PVRTC2_4_RGB = sys::basist_transcoder_texture_format_cTFPVRTC2_4_RGB,
PVRTC2_4_RGBA = sys::basist_transcoder_texture_format_cTFPVRTC2_4_RGBA,
ETC2_EAC_R11 = sys::basist_transcoder_texture_format_cTFETC2_EAC_R11,
ETC2_EAC_RG11 = sys::basist_transcoder_texture_format_cTFETC2_EAC_RG11,
RGBA32 = sys::basist_transcoder_texture_format_cTFRGBA32,
RGB565 = sys::basist_transcoder_texture_format_cTFRGB565,
BGR565 = sys::basist_transcoder_texture_format_cTFBGR565,
RGBA4444 = sys::basist_transcoder_texture_format_cTFRGBA4444,
}
impl Into<sys::basist_transcoder_texture_format> for TranscoderTextureFormat {
fn into(self) -> sys::basist_transcoder_texture_format {
self as sys::basist_transcoder_texture_format
}
}
impl From<sys::basist_transcoder_texture_format> for TranscoderTextureFormat {
fn from(value: sys::basist_transcoder_texture_format) -> Self {
unsafe { std::mem::transmute(value as i32) }
}
}
impl TranscoderTextureFormat {
pub fn bytes_per_block_or_pixel(self) -> u32 {
unsafe { sys::basis_get_bytes_per_block_or_pixel(self.into()) }
}
pub fn format_name(self) -> &'static str {
unsafe {
let value = sys::basis_get_format_name(self.into());
CStr::from_ptr(value).to_str().unwrap()
}
}
pub fn has_alpha(self) -> bool {
unsafe { sys::basis_transcoder_format_has_alpha(self.into()) }
}
pub fn texture_format(self) -> TextureFormat {
unsafe { sys::basis_get_basisu_texture_format(self.into()).into() }
}
pub fn is_compressed(self) -> bool {
unsafe { !sys::basis_transcoder_format_is_uncompressed(self.into()) }
}
pub fn uncompressed_bytes_per_pixel(self) -> u32 {
unsafe { sys::basis_get_uncompressed_bytes_per_pixel(self.into()) }
}
pub fn block_width(self) -> u32 {
unsafe { sys::basis_get_block_width(self.into()) }
}
pub fn block_height(self) -> u32 {
unsafe { sys::basis_get_block_height(self.into()) }
}
pub fn can_transcode_from_format(
self,
basis_texture_format: BasisTextureFormat,
) -> bool {
basis_texture_format.can_transcode_to_format(self)
}
pub fn calculate_minimum_output_buffer_blocks_or_pixels(
self,
original_width: u32,
original_height: u32,
total_slice_blocks: u32,
output_row_pitch_in_blocks_or_pixels: Option<u32>,
output_rows_in_pixels: Option<u32>,
) -> u32 {
let mut output_row_pitch_in_blocks_or_pixels =
output_row_pitch_in_blocks_or_pixels.unwrap_or(0);
let mut output_rows_in_pixels = output_rows_in_pixels.unwrap_or(0);
let minimum_output_buffer_blocks_or_pixels = if !self.is_compressed() {
if output_row_pitch_in_blocks_or_pixels == 0 {
output_row_pitch_in_blocks_or_pixels = original_width;
}
if output_rows_in_pixels == 0 {
output_rows_in_pixels = original_height;
}
output_rows_in_pixels * output_row_pitch_in_blocks_or_pixels
} else if self == TranscoderTextureFormat::FXT1_RGB {
let num_blocks_fxt1_x = (original_width + 7) / 8;
let num_blocks_fxt1_y = (original_height + 3) / 4;
let total_blocks_fxt1 = num_blocks_fxt1_x * num_blocks_fxt1_y;
total_blocks_fxt1
} else {
total_slice_blocks
};
debug_assert!(self.validate_output_buffer_size(
minimum_output_buffer_blocks_or_pixels,
original_width,
original_height,
total_slice_blocks,
Some(output_row_pitch_in_blocks_or_pixels),
Some(output_rows_in_pixels),
));
minimum_output_buffer_blocks_or_pixels
}
pub fn calculate_minimum_output_buffer_bytes(
self,
original_width: u32,
original_height: u32,
total_slice_blocks: u32,
output_row_pitch_in_blocks_or_pixels: Option<u32>,
output_rows_in_pixels: Option<u32>,
) -> u32 {
self.calculate_minimum_output_buffer_blocks_or_pixels(
original_width,
original_height,
total_slice_blocks,
output_row_pitch_in_blocks_or_pixels,
output_rows_in_pixels,
) * self.bytes_per_block_or_pixel()
}
pub fn validate_output_buffer_size(
self,
output_blocks_buf_size_in_blocks_or_pixels: u32,
original_width: u32,
original_height: u32,
total_slice_blocks: u32,
output_row_pitch_in_blocks_or_pixels: Option<u32>,
output_rows_in_pixels: Option<u32>,
) -> bool {
unsafe {
sys::basis_validate_output_buffer_size(
self.into(),
output_blocks_buf_size_in_blocks_or_pixels,
original_width,
original_height,
output_row_pitch_in_blocks_or_pixels.unwrap_or(0),
output_rows_in_pixels.unwrap_or(0),
total_slice_blocks,
)
}
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(i32)]
pub enum TranscoderBlockFormat {
ETC1 = sys::basist_block_format_cETC1,
ETC2_RGBA = sys::basist_block_format_cETC2_RGBA,
BC1 = sys::basist_block_format_cBC1,
BC3 = sys::basist_block_format_cBC3,
BC4 = sys::basist_block_format_cBC4,
BC5 = sys::basist_block_format_cBC5,
PVRTC1_4_RGB = sys::basist_block_format_cPVRTC1_4_RGB,
PVRTC1_4_RGBA = sys::basist_block_format_cPVRTC1_4_RGBA,
BC7 = sys::basist_block_format_cBC7,
BC7_M5_COLOR = sys::basist_block_format_cBC7_M5_COLOR,
BC7_M5_ALPHA = sys::basist_block_format_cBC7_M5_ALPHA,
ETC2_EAC_A8 = sys::basist_block_format_cETC2_EAC_A8,
ASTC_4x4 = sys::basist_block_format_cASTC_4x4,
ATC_RGB = sys::basist_block_format_cATC_RGB,
ATC_RGBA_INTERPOLATED_ALPHA = sys::basist_block_format_cATC_RGBA_INTERPOLATED_ALPHA,
FXT1_RGB = sys::basist_block_format_cFXT1_RGB,
PVRTC2_4_RGB = sys::basist_block_format_cPVRTC2_4_RGB,
PVRTC2_4_RGBA = sys::basist_block_format_cPVRTC2_4_RGBA,
ETC2_EAC_R11 = sys::basist_block_format_cETC2_EAC_R11,
ETC2_EAC_RG11 = sys::basist_block_format_cETC2_EAC_RG11,
RGB32 = sys::basist_block_format_cRGB32,
RGBA32 = sys::basist_block_format_cRGBA32,
A32 = sys::basist_block_format_cA32,
RGB565 = sys::basist_block_format_cRGB565,
BGR565 = sys::basist_block_format_cBGR565,
RGBA4444_COLOR = sys::basist_block_format_cRGBA4444_COLOR,
RGBA4444_ALPHA = sys::basist_block_format_cRGBA4444_ALPHA,
RGBA4444_COLOR_OPAQUE = sys::basist_block_format_cRGBA4444_COLOR_OPAQUE,
RGBA4444 = sys::basist_block_format_cRGBA4444,
}
impl Into<sys::basist_block_format> for TranscoderBlockFormat {
fn into(self) -> sys::basist_block_format {
self as sys::basist_block_format
}
}
impl From<sys::basist_block_format> for TranscoderBlockFormat {
fn from(value: sys::basist_block_format) -> Self {
unsafe { std::mem::transmute(value as i32) }
}
}
impl TranscoderBlockFormat {
pub fn block_format_name(self) -> &'static str {
unsafe {
let value = sys::basis_get_block_format_name(self.into());
CStr::from_ptr(value).to_str().unwrap()
}
}
}
#[allow(non_camel_case_types)]
#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(i32)]
pub enum TextureFormat {
Invalid = sys::basisu_texture_format_cInvalidTextureFormat,
ETC1 = sys::basisu_texture_format_cETC1,
ETC1S = sys::basisu_texture_format_cETC1S,
ETC2 = sys::basisu_texture_format_cETC2_RGB,
ETC2_RGBA = sys::basisu_texture_format_cETC2_RGBA,
ETC2_ALPHA = sys::basisu_texture_format_cETC2_ALPHA,
BC1 = sys::basisu_texture_format_cBC1,
BC3 = sys::basisu_texture_format_cBC3,
BC4 = sys::basisu_texture_format_cBC4,
BC5 = sys::basisu_texture_format_cBC5,
BC7 = sys::basisu_texture_format_cBC7,
ASTC4x4 = sys::basisu_texture_format_cASTC4x4,
PVRTC1_4_RGB = sys::basisu_texture_format_cPVRTC1_4_RGB,
PVRTC1_4_RGBA = sys::basisu_texture_format_cPVRTC1_4_RGBA,
ATC_RGB = sys::basisu_texture_format_cATC_RGB,
ATC_RGBA_INTERPOLATED_ALPHA = sys::basisu_texture_format_cATC_RGBA_INTERPOLATED_ALPHA,
cFXT1_RGB = sys::basisu_texture_format_cFXT1_RGB,
cPVRTC2_4_RGBA = sys::basisu_texture_format_cPVRTC2_4_RGBA,
cETC2_R11_EAC = sys::basisu_texture_format_cETC2_R11_EAC,
cETC2_RG11_EAC = sys::basisu_texture_format_cETC2_RG11_EAC,
cUASTC4x4 = sys::basisu_texture_format_cUASTC4x4,
cBC1_NV = sys::basisu_texture_format_cBC1_NV,
cBC1_AMD = sys::basisu_texture_format_cBC1_AMD,
cRGBA32 = sys::basisu_texture_format_cRGBA32,
cRGB565 = sys::basisu_texture_format_cRGB565,
cBGR565 = sys::basisu_texture_format_cBGR565,
cRGBA4444 = sys::basisu_texture_format_cRGBA4444,
cABGR4444 = sys::basisu_texture_format_cABGR4444,
}
impl Into<sys::basisu_texture_format> for TextureFormat {
fn into(self) -> sys::basisu_texture_format {
self as sys::basisu_texture_format
}
}
impl From<sys::basisu_texture_format> for TextureFormat {
fn from(value: sys::basisu_texture_format) -> Self {
unsafe { std::mem::transmute(value as i32) }
}
}
bitflags::bitflags! {
pub struct DecodeFlags: u32 {
const PVRTC_DECODE_TO_NEXT_POW_2 = sys::basist_basisu_decode_flags_cDecodeFlagsPVRTCDecodeToNextPow2;
const TRANSCODE_ALPHA_DATA_TO_OPAQUE_FORMATS = sys::basist_basisu_decode_flags_cDecodeFlagsTranscodeAlphaDataToOpaqueFormats;
const BC1_FORBID_THREE_COLOR_BLOCKS = sys::basist_basisu_decode_flags_cDecodeFlagsBC1ForbidThreeColorBlocks;
const OUTPUT_HAS_ALPHA_INDICES = sys::basist_basisu_decode_flags_cDecodeFlagsOutputHasAlphaIndices;
const HIGH_QULITY = sys::basist_basisu_decode_flags_cDecodeFlagsHighQuality;
}
}