use crate::_impl_init;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
#[allow(
dead_code,
reason = "Only exposed: Rgb332, Rgb565, Xrgb8888, Argb8888 Bgr332, Bgr565, Xbgr8888, Abgr8888"
)]
pub(crate) enum RasterPackedChannels {
#[default]
Unknown,
Rgb332,
Rgb565,
Rgb555,
Rgba5551,
Argb1555,
Rgba4444,
Xrgb8888,
Rgbx8888,
Argb8888,
Rgba8888,
Bgr332,
Bgr565,
Bgr555,
Bgra5551,
Abgr1555,
Bgra4444,
Xbgr8888,
Bgrx8888,
Abgr8888,
Bgra8888,
}
_impl_init![Self::Unknown => RasterPackedChannels];
impl RasterPackedChannels {
pub const fn is_unknown(self) -> bool {
matches!(self, Self::Unknown)
}
pub const fn channel_count(self) -> Option<u8> {
match self {
Self::Unknown => None,
Self::Rgb332
| Self::Rgb565
| Self::Rgb555
| Self::Bgr332
| Self::Bgr565
| Self::Bgr555 => Some(3),
_ => Some(4),
}
}
pub const fn color_channel_count(self) -> Option<u8> {
match self {
Self::Unknown => None,
_ => Some(3),
}
}
pub const fn has_alpha(self) -> bool {
matches!(
self,
Self::Rgba5551
| Self::Argb1555
| Self::Rgba4444
| Self::Argb8888
| Self::Rgba8888
| Self::Bgra5551
| Self::Abgr1555
| Self::Bgra4444
| Self::Abgr8888
| Self::Bgra8888
)
}
pub const fn has_padding_channel(self) -> bool {
matches!(self, Self::Xrgb8888 | Self::Rgbx8888 | Self::Xbgr8888 | Self::Bgrx8888)
}
pub const fn depth_bits(self) -> Option<u16> {
match self {
Self::Unknown => None,
Self::Rgb332 | Self::Bgr332 => Some(8),
Self::Rgb555 | Self::Bgr555 => Some(15),
Self::Rgb565
| Self::Rgba5551
| Self::Argb1555
| Self::Rgba4444
| Self::Bgr565
| Self::Bgra5551
| Self::Abgr1555
| Self::Bgra4444 => Some(16),
Self::Xrgb8888 | Self::Rgbx8888 | Self::Xbgr8888 | Self::Bgrx8888 => Some(24),
Self::Argb8888 | Self::Rgba8888 | Self::Abgr8888 | Self::Bgra8888 => Some(32),
}
}
pub const fn bits_per_pixel(self) -> Option<u16> {
match self {
Self::Unknown => None,
Self::Rgb332 | Self::Bgr332 => Some(8),
Self::Rgb555 | Self::Bgr555 => Some(16),
Self::Rgb565
| Self::Rgba5551
| Self::Argb1555
| Self::Rgba4444
| Self::Bgr565
| Self::Bgra5551
| Self::Abgr1555
| Self::Bgra4444 => Some(16),
Self::Xrgb8888
| Self::Rgbx8888
| Self::Argb8888
| Self::Rgba8888
| Self::Xbgr8888
| Self::Bgrx8888
| Self::Abgr8888
| Self::Bgra8888 => Some(32),
}
}
#[allow(dead_code, reason = "WIP")]
pub const fn stored_bytes_per_pixel(self) -> Option<u16> {
match self.bits_per_pixel() {
Some(bits) if bits % 8 == 0 => Some(bits / 8),
_ => None,
}
}
}