fimg/
pack.rs

1//! trait for packing pixels
2
3use 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
15/// packs and unpacks this pixel
16/// note that `unpack(pack(p))` may not equal `p`
17pub trait Pack<P = u32> {
18    /// pack this pixel
19    fn pack(&self) -> P;
20    /// unpacks this pixel
21    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}