1use crate::error::{Error, ensure};
2use crate::format::Urma;
3
4pub fn decode_pixels(bytes: &[u8; Urma::AVATAR_BYTES]) -> [u8; Urma::AVATAR_PIXELS] {
5 let mut pixels = [0; Urma::AVATAR_PIXELS];
6 for (at, byte) in bytes.iter().enumerate() {
7 pixels[at * 2] = byte >> 4;
8 pixels[at * 2 + 1] = byte & 0x0F;
9 }
10 pixels
11}
12
13pub fn encode_pixels(
14 pixels: &[u8; Urma::AVATAR_PIXELS],
15) -> Result<[u8; Urma::AVATAR_BYTES], Error> {
16 let mut bytes = [0; Urma::AVATAR_BYTES];
17 for (at, pair) in pixels.as_chunks::<2>().0.iter().enumerate() {
18 ensure!(
19 usize::from(pair[0]) < Urma::AVATAR_PALETTE.len()
20 && usize::from(pair[1]) < Urma::AVATAR_PALETTE.len(),
21 "avatar color indices must be in 0..=15"
22 );
23 bytes[at] = (pair[0] << 4) | pair[1];
24 }
25 Ok(bytes)
26}