use alloc::sync::Arc;
pub use j2k_types::{
HtCodeBlockPayloadRanges as Htj2kPayloadRanges,
J2kClassicCodeBlockPayload as ClassicCodeBlockPayload, J2kCodestreamRange,
};
pub type ClassicPreparedGeometry = j2k_types::J2kReferencedClassicPlan;
pub type Htj2kPreparedGeometry = j2k_types::J2kReferencedHtj2kPlan;
pub type PreparedImageGeometry<'a> = j2k_types::J2kReferencedImageGeometry<'a>;
#[derive(Debug, Clone)]
pub struct PreparedClassicPlan {
plan: Arc<ClassicPreparedGeometry>,
}
impl PreparedClassicPlan {
pub(super) fn from_native(plan: ClassicPreparedGeometry) -> Self {
Self {
plan: Arc::new(plan),
}
}
pub(crate) fn native_plan(&self) -> &ClassicPreparedGeometry {
&self.plan
}
#[must_use]
pub fn geometry(&self) -> &ClassicPreparedGeometry {
&self.plan
}
#[must_use]
pub fn image_geometry(&self) -> PreparedImageGeometry<'_> {
self.plan.image_geometry()
}
#[must_use]
pub fn is_grayscale(&self) -> bool {
self.image_geometry().is_grayscale()
}
#[must_use]
pub fn is_color(&self) -> bool {
self.image_geometry().is_color()
}
#[must_use]
pub fn is_rgba(&self) -> bool {
self.image_geometry().is_rgba()
}
#[must_use]
pub fn payload_count(&self) -> usize {
self.plan.payloads().len()
}
#[must_use]
pub fn range_count(&self) -> usize {
self.plan.ranges().len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.plan.payloads().is_empty()
}
pub(super) fn uniform_wavelet_transform(&self) -> Option<j2k_native::J2kWaveletTransform> {
self.image_geometry().uniform_wavelet_transform()
}
#[must_use]
pub fn payload(&self, index: usize) -> Option<ClassicCodeBlockPayload> {
self.plan.payloads().get(index).copied()
}
pub fn payloads(&self) -> impl ExactSizeIterator<Item = ClassicCodeBlockPayload> + '_ {
self.plan.payloads().iter().copied()
}
#[must_use]
pub fn range(&self, index: usize) -> Option<J2kCodestreamRange> {
self.plan.ranges().get(index).copied()
}
pub fn ranges(&self) -> impl ExactSizeIterator<Item = J2kCodestreamRange> + '_ {
self.plan.ranges().iter().copied()
}
}
#[derive(Debug, Clone)]
pub struct PreparedHtj2kPlan {
plan: Arc<Htj2kPreparedGeometry>,
}
impl PreparedHtj2kPlan {
pub(super) fn from_native(plan: Htj2kPreparedGeometry) -> Self {
Self {
plan: Arc::new(plan),
}
}
pub(crate) fn native_plan(&self) -> &Htj2kPreparedGeometry {
&self.plan
}
#[must_use]
pub fn geometry(&self) -> &Htj2kPreparedGeometry {
&self.plan
}
#[must_use]
pub fn image_geometry(&self) -> PreparedImageGeometry<'_> {
self.plan.image_geometry()
}
#[must_use]
pub fn is_grayscale(&self) -> bool {
self.image_geometry().is_grayscale()
}
#[must_use]
pub fn is_color(&self) -> bool {
self.image_geometry().is_color()
}
#[must_use]
pub fn is_rgba(&self) -> bool {
self.image_geometry().is_rgba()
}
#[must_use]
pub fn payload_count(&self) -> usize {
self.plan.payloads().len()
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.plan.payloads().is_empty()
}
pub(super) fn uniform_wavelet_transform(&self) -> Option<j2k_native::J2kWaveletTransform> {
self.image_geometry().uniform_wavelet_transform()
}
#[must_use]
pub fn payload(&self, index: usize) -> Option<Htj2kPayloadRanges> {
self.plan.payloads().get(index).copied()
}
pub fn payloads(&self) -> impl ExactSizeIterator<Item = Htj2kPayloadRanges> + '_ {
self.plan.payloads().iter().copied()
}
}