1use crate::pixels::convert::{PFrom, RGB, RGBA, Y, YA};
4
5#[inline]
6pub const fn pack(x: [u8; 4]) -> u32 {
7 u32::from_le_bytes(x).rotate_left(8).swap_bytes()
8}
9
10#[inline]
11pub const fn unpack(n: u32) -> [u8; 4] {
12 n.rotate_left(8).to_be_bytes()
13}
14
15pub trait Pack<P = u32> {
18 fn pack(&self) -> P;
20 fn unpack(from: P) -> Self;
22}
23
24macro_rules! simple {
25 ($p:ident) => {
26 impl Pack for $p {
27 fn pack(&self) -> u32 {
28 pack(PFrom::pfrom(*self))
29 }
30
31 fn unpack(from: u32) -> $p {
32 PFrom::pfrom(unpack(from))
33 }
34 }
35 };
36}
37simple!(RGBA);
38simple!(RGB);
39simple!(YA);
40simple!(Y);
41
42impl Pack<u8> for Y {
43 fn pack(&self) -> u8 {
44 self[0]
45 }
46
47 fn unpack(from: u8) -> Self {
48 [from]
49 }
50}