lerc-reader 0.5.0

Pure-Rust decoder for the LERC raster compression format
Documentation
pub(crate) use lerc_core::{
    bits_required, count_valid_in_block, fletcher32, output_value, read_scalar, read_typed_values,
    read_values_as, words_from_padded, Sample,
};

#[derive(Debug, Clone, Copy)]
pub(crate) struct AllValid;

#[derive(Debug, Clone, Copy)]
pub(crate) struct MaskValidity<'a>(&'a [u8]);

impl<'a> MaskValidity<'a> {
    pub(crate) fn new(mask: &'a [u8]) -> Self {
        Self(mask)
    }
}

pub(crate) trait Validity: Copy {
    fn is_valid(self, pixel: usize) -> bool;

    fn count_in_block(
        self,
        width: usize,
        x: usize,
        y: usize,
        block_width: usize,
        block_height: usize,
    ) -> usize;
}

impl Validity for AllValid {
    #[inline]
    fn is_valid(self, _pixel: usize) -> bool {
        true
    }

    #[inline]
    fn count_in_block(
        self,
        _width: usize,
        _x: usize,
        _y: usize,
        block_width: usize,
        block_height: usize,
    ) -> usize {
        block_width * block_height
    }
}

impl Validity for MaskValidity<'_> {
    #[inline]
    fn is_valid(self, pixel: usize) -> bool {
        self.0[pixel] != 0
    }

    #[inline]
    fn count_in_block(
        self,
        width: usize,
        x: usize,
        y: usize,
        block_width: usize,
        block_height: usize,
    ) -> usize {
        count_valid_in_block(self.0, width, x, y, block_width, block_height)
    }
}