1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
use stb_sys as sys;
pub enum CompressionMode {
Normal = 0,
Dither = 1,
Highqual = 2,
}
pub fn stb_compress_dxt_block(
dest: &mut [u8],
src_rgba_four_bytes_per_pixel: &[u8],
alpha: i32,
mode: CompressionMode,
) {
debug_assert_ne!(src_rgba_four_bytes_per_pixel.len(), 0);
debug_assert_eq!(src_rgba_four_bytes_per_pixel.len() % 16, 0);
debug_assert_ne!(dest.len(), 0);
debug_assert_eq!(dest.len() % 8, 0);
unsafe {
sys::stb_compress_dxt_block(
dest.as_mut_ptr(),
src_rgba_four_bytes_per_pixel.as_ptr(),
alpha,
mode as i32,
)
}
}
pub fn stb_compress_bc4_block(dest: &mut [u8], src_r_one_byte_per_pixel: &[u8]) {
unsafe { sys::stb_compress_bc4_block(dest.as_mut_ptr(), src_r_one_byte_per_pixel.as_ptr()) }
}
pub fn stb_compress_bc5_block(dest: &mut [u8], src_rg_two_byte_per_pixel: &[u8]) {
unsafe { sys::stb_compress_bc5_block(dest.as_mut_ptr(), src_rg_two_byte_per_pixel.as_ptr()) }
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn compress_dxt_block() {
let src: [u8; 16] = [
255, 255, 0, 128, 255, 0, 128, 255, 255, 128, 0, 128, 128, 0, 128, 255,
];
let mut dst: [u8; 8] = [0; 8];
stb_compress_dxt_block(&mut dst, &src, 0, CompressionMode::Normal);
}
}