use jxr_core::{ImageInfo, JxrError};
use jxr_native::{ParsedCodestream, image_info, parse_codestream};
use crate::{JxrDecoder, map_native_error};
#[derive(Debug)]
pub struct JxrView<'a> {
bytes: &'a [u8],
parsed: ParsedCodestream,
info: ImageInfo,
}
impl<'a> JxrView<'a> {
pub fn parse(bytes: &'a [u8]) -> Result<Self, JxrError> {
let parsed = parse_codestream(bytes).map_err(map_native_error)?;
let info = image_info(&parsed).map_err(map_native_error)?;
Ok(Self {
bytes,
parsed,
info,
})
}
#[must_use]
pub const fn info(&self) -> &ImageInfo {
&self.info
}
#[must_use]
pub const fn bytes(&self) -> &'a [u8] {
self.bytes
}
#[must_use]
pub fn codestream(&self) -> &'a [u8] {
&self.bytes[self.parsed.codestream_range.clone()]
}
#[must_use]
pub fn separate_alpha_codestream(&self) -> Option<&'a [u8]> {
self.parsed
.annex_a
.as_ref()?
.alpha_range
.clone()
.map(|range| &self.bytes[range])
}
#[must_use]
pub fn icc_profile(&self) -> Option<&'a [u8]> {
let range = self.info.metadata.icc_profile?;
range
.end()
.and_then(|end| self.bytes.get(range.offset..end))
}
#[must_use]
pub fn decoder(&self) -> JxrDecoder<'_> {
JxrDecoder::new(self.bytes, &self.parsed, &self.info)
}
}