use crate::pixels::convert::{PFrom, RGB, RGBA, Y, YA};
#[inline]
pub const fn pack(x: [u8; 4]) -> u32 {
u32::from_le_bytes(x).rotate_left(8).swap_bytes()
}
#[inline]
pub const fn unpack(n: u32) -> [u8; 4] {
n.rotate_left(8).to_be_bytes()
}
pub trait Pack<P = u32> {
fn pack(&self) -> P;
fn unpack(from: P) -> Self;
}
macro_rules! simple {
($p:ident) => {
impl Pack for $p {
fn pack(&self) -> u32 {
pack(PFrom::pfrom(*self))
}
fn unpack(from: u32) -> $p {
PFrom::pfrom(unpack(from))
}
}
};
}
simple!(RGBA);
simple!(RGB);
simple!(YA);
simple!(Y);
impl Pack<u8> for Y {
fn pack(&self) -> u8 {
self[0]
}
fn unpack(from: u8) -> Self {
[from]
}
}