mirx 0.50.0

MIRX binary image format — flat & chunk-based container for ahead-of-time UI assets
Documentation
use super::SurfaceDescriptor;
use crate::palette::ColorTableView;

impl SurfaceDescriptor {
    pub(crate) fn read_color_table(
        self,
        bytes: Option<&[u8]>,
    ) -> Result<Option<ColorTableView<'_>>, ColorTableError> {
        match (self.sample_layout().color_table_entries(), bytes) {
            (Some(entries), Some(bytes)) => {
                let expected = usize::try_from(entries)
                    .ok()
                    .and_then(|entries| entries.checked_mul(4))
                    .ok_or(ColorTableError::SizeOverflow)?;
                if bytes.len() != expected {
                    return Err(ColorTableError::SizeMismatch {
                        expected,
                        actual: bytes.len(),
                    });
                }
                Ok(Some(
                    ColorTableView::from_rgba_bytes(bytes).expect("checked palette length"),
                ))
            }
            (Some(_), None) => Err(ColorTableError::Missing),
            (None, Some(_)) => Err(ColorTableError::Unexpected),
            (None, None) => Ok(None),
        }
    }
}

#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum ColorTableError {
    Missing,
    Unexpected,
    SizeMismatch { expected: usize, actual: usize },
    SizeOverflow,
}