deckster/crates/loupedeck_serial/src/util.rs
2024-01-31 01:23:56 +01:00

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,
}