32 lines
956 B
Rust
32 lines
956 B
Rust
use bytes::{BufMut, Bytes, BytesMut};
|
|
|
|
pub fn convert_rgb888_to_rgb565(original: Bytes, endianness: Endianness) -> BytesMut {
|
|
let pixel_count = original.len() / 3;
|
|
let excess_bytes = original.len() % 3;
|
|
|
|
if excess_bytes != 0 {
|
|
panic!("Found {} excess bytes at the end of the original buffer", excess_bytes);
|
|
}
|
|
|
|
let mut result = BytesMut::with_capacity(pixel_count * 2);
|
|
|
|
for index in 0..pixel_count {
|
|
let red = original[index * 3] as u16;
|
|
let green = original[index * 3 + 1] as u16;
|
|
let blue = original[index * 3 + 2] as u16;
|
|
let color = ((red & 0b11111000) << 8) | ((green & 0b11111100) << 3) | (blue.wrapping_shr(3));
|
|
|
|
match endianness {
|
|
Endianness::LittleEndian => result.put_u16_le(color),
|
|
Endianness::BigEndian => result.put_u16(color),
|
|
}
|
|
}
|
|
|
|
result
|
|
}
|
|
|
|
#[derive(Debug, Copy, Clone)]
|
|
pub enum Endianness {
|
|
BigEndian,
|
|
LittleEndian,
|
|
}
|