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
mod ffi;
use std::{io::Result, ptr, slice};
pub fn compress(pixel_data: &[u8], width: usize, height: usize, has_alpha: bool, quality: ETC1Quality) -> Result<Vec<u8>> {
let mut output_data: *mut u8 = core::ptr::null_mut();
unsafe {
ffi::encodeETC1(pixel_data.as_ptr(), &mut output_data, width as u16, height as u16, has_alpha, quality as u8);
}
let output_data_ptr: ptr::NonNull<u8> = ptr::NonNull::new(output_data)
.expect("Error: got NULL ptr");
let output_data_len = ((width * height * 4)/8) as usize;
let result: &mut [u8];
unsafe {
result = slice::from_raw_parts_mut(output_data_ptr.as_ptr(), output_data_len);
ffi::free_ptr(output_data_ptr.as_ptr());
};
Ok(result.to_vec())
}
pub enum ETC1Quality
{
LowQuality,
MediumQuality,
HighQuality,
}