Skip to main content

urma_core/
avatar.rs

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}