#![cfg_attr(not(feature = "std"), no_std)]
extern crate alloc;
use alloc::vec::Vec;
pub mod error;
pub mod image;
pub mod bitreader;
pub mod arith;
pub mod arith_int;
pub mod arith_iaid;
pub mod huffman;
pub mod header;
pub mod segment;
pub mod page;
pub mod decoder;
pub mod generic;
pub mod mmr;
pub mod refinement;
pub mod symbol_dict;
pub mod text;
pub mod halftone;
pub use error::{Jbig2Error, Result};
pub use decoder::Decoder;
#[derive(Debug, Clone)]
pub struct Page {
pub width: u32,
pub height: u32,
pub stride: u32,
pub data: Vec<u8>,
}
impl Page {
pub fn get_pixel(&self, x: u32, y: u32) -> u8 {
if x >= self.width || y >= self.height {
return 0;
}
let byte_idx = (y * self.stride + x / 8) as usize;
let bit_idx = 7 - (x % 8);
(self.data[byte_idx] >> bit_idx) & 1
}
}
impl Decoder {
pub fn page(&mut self) -> Option<Page> {
self.page_out().map(|img| Page {
width: img.width,
height: img.height,
stride: img.stride,
data: img.data,
})
}
}
pub fn decode(data: &[u8]) -> Result<Vec<Page>> {
let mut decoder = Decoder::new();
decoder.write(data)?;
let mut pages = Vec::new();
while let Some(page) = decoder.page() {
pages.push(page);
}
Ok(pages)
}
pub fn decode_embedded(data: &[u8]) -> Result<Vec<Page>> {
let mut decoder = Decoder::new_embedded();
decoder.write(data)?;
let mut pages = Vec::new();
while let Some(page) = decoder.page() {
pages.push(page);
}
Ok(pages)
}
#[cfg(test)]
mod tests;