1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//! Channel orders for packed Luma types.

use crate::{cast::ComponentOrder, luma};

/// Luma+Alpha color packed in LA order.
///
/// See [Packed](crate::cast::Packed) for more details.
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct La;

impl<S, T> ComponentOrder<luma::Lumaa<S, T>, [T; 2]> for La {
    #[inline]
    fn pack(color: luma::Lumaa<S, T>) -> [T; 2] {
        color.into()
    }

    #[inline]
    fn unpack(packed: [T; 2]) -> luma::Lumaa<S, T> {
        packed.into()
    }
}

/// Luma+Alpha color packed in AL order.
///
/// See [Packed](crate::cast::Packed) for more details.
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct Al;

impl<S, T> ComponentOrder<luma::Lumaa<S, T>, [T; 2]> for Al {
    #[inline]
    fn pack(color: luma::Lumaa<S, T>) -> [T; 2] {
        let [luma, alpha]: [T; 2] = color.into();
        [alpha, luma]
    }

    #[inline]
    fn unpack(packed: [T; 2]) -> luma::Lumaa<S, T> {
        let [alpha, luma] = packed;
        luma::Lumaa::new(luma, alpha)
    }
}