#![no_std]
#![forbid(unsafe_code)]
#![forbid(missing_docs)]
extern crate alloc;
use crate::bit_reader::BitReader;
mod bit_reader;
mod codes;
mod context;
mod error;
mod group3;
mod group4;
mod tables;
pub use context::DecoderContext;
pub use error::{DecodeError, Result};
pub fn decode(data: &[u8], decoder: &mut impl Decoder, ctx: &mut DecoderContext) -> Result<usize> {
ctx.reset();
let mut reader = BitReader::new(data);
if ctx.settings.columns == 0 {
return Ok(0);
}
match ctx.settings.encoding {
EncodingMode::Group4 => group4::decode(ctx, &mut reader, decoder)?,
EncodingMode::Group3_1D => group3::decode_1d(ctx, &mut reader, decoder)?,
EncodingMode::Group3_2D => group3::decode_2d(ctx, &mut reader, decoder)?,
}
reader.align();
Ok(reader.byte_pos())
}
pub trait Decoder {
fn push_row(&mut self, changes: &[u32]);
}
#[derive(Copy, Clone, Debug)]
pub struct DecodeSettings {
pub columns: u32,
pub rows: u32,
pub end_of_block: bool,
pub end_of_line: bool,
pub rows_are_byte_aligned: bool,
pub encoding: EncodingMode,
pub strict: bool,
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum EncodingMode {
Group4,
Group3_1D,
Group3_2D,
}