#![forbid(unsafe_code)]
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub(crate) enum Rgb30 {
Ar30 = 0,
Ra30 = 1,
}
impl From<usize> for Rgb30 {
fn from(value: usize) -> Self {
match value {
0 => Rgb30::Ar30,
1 => Rgb30::Ra30,
_ => {
unimplemented!("Rgb30 is not implemented for value {}", value)
}
}
}
}
#[inline]
const fn htonl(hostlong: u32) -> u32 {
hostlong.to_be()
}
#[inline]
const fn ntohl(netlong: u32) -> u32 {
u32::from_be(netlong)
}
impl Rgb30 {
#[inline]
pub(crate) const fn pack_w_a<const STORE: usize>(self, r: i32, g: i32, b: i32, _: i32) -> u32 {
let value: u32 = match self {
Rgb30::Ar30 => ((3u32 << 30u32) | ((b as u32) << 20)) | (((g as u32) << 10) | r as u32),
Rgb30::Ra30 => (((r as u32) << 22) | ((g as u32) << 12)) | (((b as u32) << 2) | 3),
};
if STORE == 0 { value } else { htonl(value) }
}
#[inline(always)]
pub(crate) const fn unpack<const STORE: usize>(self, value: u32) -> (u32, u32, u32, u32) {
let pixel = if STORE == 0 { value } else { ntohl(value) };
match self {
Rgb30::Ar30 => {
let r10 = pixel & 0x3ff;
let g10 = (pixel >> 10) & 0x3ff;
let b10 = (pixel >> 20) & 0x3ff;
(r10, g10, b10, 3)
}
Rgb30::Ra30 => {
let r10 = (pixel >> 22) & 0x3ff;
let g10 = (pixel >> 12) & 0x3ff;
let b10 = (pixel >> 2) & 0x3ff;
(r10, g10, b10, 3)
}
}
}
}
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)]
pub enum Ar30ByteOrder {
Host = 0,
Network = 1,
}
impl From<usize> for Ar30ByteOrder {
fn from(value: usize) -> Self {
match value {
0 => Ar30ByteOrder::Host,
1 => Ar30ByteOrder::Network,
_ => {
unimplemented!("Rgb30ByteOrder is not implemented for value {}", value)
}
}
}
}