Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,20 @@ categories = [
paste = "^1.0.12"

[features]
default = ["alloc"]
default = ["alloc", "astc", "atc", "bc1", "bc2", "bc3", "bc4", "bc5", "bc6", "bc7", "crunch", "etc", "pvrtc"]
alloc = []
astc = []
atc = ["bc3"]
bc1 = []
bc2 = ["bc1"]
bc3 = ["bc1"]
bc4 = ["bc3"]
bc5 = ["bc3"]
bc6 = []
bc7 = []
crunch = ["bc1", "bc3", "bc4", "bc5", "etc"]
etc = []
pvrtc = []

[dev-dependencies]
ddsfile = "^0.5.1"
Expand Down
25 changes: 25 additions & 0 deletions src/bcn.rs
Original file line number Diff line number Diff line change
@@ -1,33 +1,58 @@
use crate::macros::block_decoder;

#[cfg(feature = "bc1")]
pub(crate) mod bc1;
#[cfg(feature = "bc2")]
pub(crate) mod bc2;
#[cfg(feature = "bc3")]
pub(crate) mod bc3;
#[cfg(feature = "bc4")]
pub(crate) mod bc4;
#[cfg(feature = "bc5")]
pub(crate) mod bc5;
#[cfg(feature = "bc6")]
pub(crate) mod bc6;
#[cfg(feature = "bc7")]
pub(crate) mod bc7;
pub(crate) mod consts;

#[cfg(feature = "bc1")]
pub use bc1::decode_bc1_block;
#[cfg(feature = "bc1")]
pub use bc1::decode_bc1a_block;
#[cfg(feature = "bc2")]
pub use bc2::decode_bc2_block;
#[cfg(feature = "bc3")]
pub use bc3::decode_bc3_block;
#[cfg(feature = "bc4")]
pub use bc4::decode_bc4_block;
#[cfg(feature = "bc5")]
pub use bc5::decode_bc5_block;
#[cfg(feature = "bc6")]
pub use bc6::{decode_bc6_block, decode_bc6_block_signed, decode_bc6_block_unsigned};
#[cfg(feature = "bc7")]
pub use bc7::decode_bc7_block;

#[cfg(feature = "bc1")]
block_decoder!("bc1", 4, 4, 8, decode_bc1_block);
#[cfg(feature = "bc1")]
block_decoder!("bc1a", 4, 4, 8, decode_bc1a_block);
#[cfg(feature = "bc2")]
block_decoder!("bc2", 4, 4, 16, decode_bc2_block);
#[cfg(feature = "bc3")]
block_decoder!("bc3", 4, 4, 16, decode_bc3_block);
#[cfg(feature = "bc4")]
block_decoder!("bc4", 4, 4, 8, decode_bc4_block);
#[cfg(feature = "bc5")]
block_decoder!("bc5", 4, 4, 16, decode_bc5_block);
#[cfg(feature = "bc6")]
block_decoder!("bc6_signed", 4, 4, 16, decode_bc6_block_signed);
#[cfg(feature = "bc6")]
block_decoder!("bc6_unsigned", 4, 4, 16, decode_bc6_block_unsigned);
#[cfg(feature = "bc7")]
block_decoder!("bc7", 4, 4, 16, decode_bc7_block);

#[cfg(feature = "bc6")]
pub fn decode_bc6(
data: &[u8],
width: usize,
Expand Down
5 changes: 5 additions & 0 deletions src/bcn/consts.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
// BC 6 & 7
#[cfg(any(feature = "bc6", feature = "bc7"))]
pub(crate) static S_BPTC_A2: [usize; 64] = [
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 8, 2, 2, 8, 8, 15, 2, 8,
2, 2, 8, 8, 2, 2, 15, 15, 6, 8, 2, 8, 15, 15, 2, 8, 2, 2, 2, 15, 15, 6, 6, 2, 6, 8, 15, 15, 2,
2, 15, 15, 15, 15, 15, 2, 2, 15,
];

// BC7
#[cfg(feature = "bc7")]
pub(crate) static S_BPTC_A3: [[usize; 64]; 2] = [
[
3, 3, 15, 15, 8, 3, 15, 15, 8, 8, 6, 6, 6, 5, 3, 3, 3, 3, 8, 15, 3, 3, 6, 10, 5, 8, 8, 6,
Expand All @@ -20,13 +22,15 @@ pub(crate) static S_BPTC_A3: [[usize; 64]; 2] = [
];

// BC 6 & 7
#[cfg(any(feature = "bc6", feature = "bc7"))]
pub(crate) static S_BPTC_FACTORS: [[u8; 16]; 3] = [
[0, 21, 43, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 9, 18, 27, 37, 46, 55, 64, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64],
];

// BC 6 & 7
#[cfg(any(feature = "bc6", feature = "bc7"))]
pub(crate) static S_BPTC_P2: [usize; 64] = [
// 3210 0000000000 1111111111 2222222222 3333333333
0xcccc, // 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1
Expand Down Expand Up @@ -96,6 +100,7 @@ pub(crate) static S_BPTC_P2: [usize; 64] = [
];

// BC7
#[cfg(feature = "bc7")]
pub(crate) static S_BPTC_P3: [usize; 64] = [
// 76543210 0000 1111 2222 3333 4444 5555 6666 7777
0xaa685050, // 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 1, 2, 2, 2, 2
Expand Down
5 changes: 5 additions & 0 deletions src/bitreader.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
#[cfg(any(feature = "astc", feature = "bc6", feature = "bc7"))]
#[inline]
fn getbits_raw(buf: &[u8], bit_offset: usize, num_bits: usize, dst: &mut [u8]) {
let bytes_offset = bit_offset / 8;
let bytes_end: usize = (bit_offset + num_bits).div_ceil(8);
dst[0..(bytes_end - bytes_offset)].copy_from_slice(&buf[bytes_offset..bytes_end]);
}

#[cfg(feature = "astc")]
#[inline]
pub fn getbits(buf: &[u8], bit_offset: usize, num_bits: usize) -> i32 {
let shift = bit_offset % 8;
Expand All @@ -16,6 +18,7 @@ pub fn getbits(buf: &[u8], bit_offset: usize, num_bits: usize) -> i32 {
i32::from_le_bytes(raw) >> shift & ((1 << num_bits) - 1)
}

#[cfg(feature = "astc")]
#[inline]
pub fn getbits64(buf: &[u8], bit: isize, len: usize) -> u64 {
let mask: u64 = if len == 64 {
Expand All @@ -38,11 +41,13 @@ pub fn getbits64(buf: &[u8], bit: isize, len: usize) -> u64 {
}
}

#[cfg(any(feature = "bc6", feature = "bc7"))]
pub struct BitReader<'a> {
data: &'a [u8],
bit_pos: usize,
}

#[cfg(any(feature = "bc6", feature = "bc7"))]
impl BitReader<'_> {
#[inline]
pub const fn new(data: &[u8], bit_pos: usize) -> BitReader {
Expand Down
3 changes: 3 additions & 0 deletions src/color.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#![allow(clippy::too_many_arguments)]

#[cfg(feature = "etc")]
pub static TRANSPARENT_MASK: u32 = {
#[cfg(target_endian = "little")]
{
Expand All @@ -11,6 +12,7 @@ pub static TRANSPARENT_MASK: u32 = {
}
};

#[cfg(feature = "etc")]
pub static TRANSPARENT_SHIFT: u32 = {
#[cfg(target_endian = "little")]
{
Expand Down Expand Up @@ -40,6 +42,7 @@ pub const fn color(r: u8, g: u8, b: u8, a: u8) -> u32 {
// }

// #[cfg(target_endian = "little")]
#[cfg(feature = "bc1")]
#[inline]
pub const fn rgb565_le(d: u16) -> (u8, u8, u8) {
(
Expand Down
22 changes: 20 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,28 +80,46 @@
//!
#![no_std]

#[cfg(not(any(feature = "astc", feature = "atc", feature = "bc1", feature = "bc2", feature = "bc3", feature = "bc4", feature = "bc5", feature = "bc6", feature = "bc7", feature = "crunch", feature = "etc", feature = "pvrtc")))]
compile_error!("at least one of the texture formats must be enabled");

mod bitreader;
mod color;
#[cfg(any(feature = "astc", feature = "bc6"))]
mod f16;
mod macros;

#[cfg(feature = "astc")]
mod astc;
#[cfg(feature = "atc")]
mod atc;
#[cfg(any(feature = "bc1", feature = "bc2", feature = "bc3", feature = "bc4", feature = "bc5", feature = "bc6", feature = "bc7"))]
mod bcn;
#[cfg(feature = "crunch")]
mod crnlib;
#[cfg(feature = "alloc")]
#[cfg(all(feature = "crunch", feature = "alloc"))]
mod crunch;
#[cfg(feature = "etc")]
mod etc;
#[cfg(feature = "pvrtc")]
mod pvrtc;
#[cfg(feature = "alloc")]
#[cfg(all(feature = "crunch", feature = "alloc"))]
mod unitycrunch;

// import decode functions
#[cfg(feature = "astc")]
pub use astc::*;
#[cfg(feature = "atc")]
pub use atc::*;
#[cfg(any(feature = "bc1", feature = "bc2", feature = "bc3", feature = "bc4", feature = "bc5", feature = "bc6", feature = "bc7"))]
pub use bcn::*;
#[cfg(feature = "crunch")]
pub use crnlib::CrnTextureInfo;
#[cfg(feature = "crunch")]
pub use crunch::decode_crunch;
#[cfg(feature = "etc")]
pub use etc::*;
#[cfg(feature = "pvrtc")]
pub use pvrtc::*;
#[cfg(feature = "crunch")]
pub use unitycrunch::decode_unity_crunch;
18 changes: 15 additions & 3 deletions src/macros.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// macro to generate generic block decoder functions
#[cfg(any(feature = "atc", feature = "bc1", feature = "bc2", feature = "bc3", feature = "bc4", feature = "bc5", feature = "bc6", feature = "bc7", feature = "etc"))]
macro_rules! block_decoder{
($name: expr, $block_width: expr, $block_height: expr, $raw_block_size: expr, $block_decode_func: expr) => {
paste::item! {
Expand Down Expand Up @@ -43,6 +44,10 @@ macro_rules! block_decoder{
};
}

#[cfg(any(feature = "atc", feature = "bc1", feature = "bc2", feature = "bc3", feature = "bc4", feature = "bc5", feature = "bc6", feature = "bc7", feature = "etc"))]
pub(crate) use block_decoder;

#[cfg(feature = "crunch")]
macro_rules! CRND_HUFF_DECODE {
($codec: expr, $model: expr, $symbol: expr) => {
$symbol = match $codec.decode($model) {
Expand All @@ -52,6 +57,10 @@ macro_rules! CRND_HUFF_DECODE {
};
}

#[cfg(feature = "crunch")]
pub(crate) use CRND_HUFF_DECODE;

#[cfg(feature = "crunch")]
macro_rules! WRITE_TO_INT_BUFFER {
($buf: expr, $index: expr, $val: expr) => {
let t_index = ($index * 4) as usize;
Expand All @@ -66,6 +75,10 @@ macro_rules! WRITE_TO_INT_BUFFER {
};
}

#[cfg(feature = "crunch")]
pub(crate) use WRITE_TO_INT_BUFFER;

#[cfg(feature = "crunch")]
macro_rules! WRITE_OR_U8_INTO_U16_BUFFER {
($buf: expr, $index: expr, $val: expr) => {
let t_index = ($index >> 1) as usize;
Expand All @@ -78,6 +91,5 @@ macro_rules! WRITE_OR_U8_INTO_U16_BUFFER {
};
}

pub(crate) use {
block_decoder, CRND_HUFF_DECODE, WRITE_OR_U8_INTO_U16_BUFFER, WRITE_TO_INT_BUFFER,
};
#[cfg(feature = "crunch")]
pub(crate) use WRITE_OR_U8_INTO_U16_BUFFER;
Loading