use alloc::vec::Vec;
use super::{
J2kClassicCodeBlockPayload, J2kCodestreamRange, J2kDirectColorPlan, J2kDirectGrayscalePlan,
J2kDirectRgbaPlan, J2kReferencedTilePlan,
};
use crate::J2kRect;
#[derive(Debug)]
pub enum J2kReferencedClassicPlan {
Grayscale {
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<J2kClassicCodeBlockPayload>,
ranges: Vec<J2kCodestreamRange>,
},
Color {
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<J2kClassicCodeBlockPayload>,
ranges: Vec<J2kCodestreamRange>,
},
Rgba {
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<J2kClassicCodeBlockPayload>,
ranges: Vec<J2kCodestreamRange>,
},
}
impl J2kReferencedClassicPlan {
#[must_use]
pub fn grayscale_geometry(&self) -> Option<&J2kDirectGrayscalePlan> {
match self {
Self::Grayscale { tiles, .. } if tiles.len() == 1 => tiles[0].grayscale_geometry(),
_ => None,
}
}
#[must_use]
pub fn color_geometry(&self) -> Option<&J2kDirectColorPlan> {
match self {
Self::Color { tiles, .. } if tiles.len() == 1 => tiles[0].color_geometry(),
_ => None,
}
}
#[must_use]
pub fn rgba_geometry(&self) -> Option<&J2kDirectRgbaPlan> {
match self {
Self::Rgba { tiles, .. } if tiles.len() == 1 => tiles[0].rgba_geometry(),
_ => None,
}
}
#[must_use]
pub fn tiles(&self) -> &[J2kReferencedTilePlan] {
match self {
Self::Grayscale { tiles, .. }
| Self::Color { tiles, .. }
| Self::Rgba { tiles, .. } => tiles,
}
}
#[must_use]
pub const fn full_dimensions(&self) -> (u32, u32) {
match self {
Self::Grayscale {
full_dimensions, ..
}
| Self::Color {
full_dimensions, ..
}
| Self::Rgba {
full_dimensions, ..
} => *full_dimensions,
}
}
#[must_use]
pub const fn output_rect(&self) -> J2kRect {
match self {
Self::Grayscale { output_rect, .. }
| Self::Color { output_rect, .. }
| Self::Rgba { output_rect, .. } => *output_rect,
}
}
#[must_use]
pub fn payloads(&self) -> &[J2kClassicCodeBlockPayload] {
match self {
Self::Grayscale { payloads, .. }
| Self::Color { payloads, .. }
| Self::Rgba { payloads, .. } => payloads,
}
}
#[must_use]
pub fn ranges(&self) -> &[J2kCodestreamRange] {
match self {
Self::Grayscale { ranges, .. }
| Self::Color { ranges, .. }
| Self::Rgba { ranges, .. } => ranges,
}
}
pub(crate) fn grayscale(
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<J2kClassicCodeBlockPayload>,
ranges: Vec<J2kCodestreamRange>,
) -> Self {
Self::Grayscale {
tiles,
full_dimensions,
output_rect,
payloads,
ranges,
}
}
pub(crate) fn color(
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<J2kClassicCodeBlockPayload>,
ranges: Vec<J2kCodestreamRange>,
) -> Self {
Self::Color {
tiles,
full_dimensions,
output_rect,
payloads,
ranges,
}
}
pub(crate) fn rgba(
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<J2kClassicCodeBlockPayload>,
ranges: Vec<J2kCodestreamRange>,
) -> Self {
Self::Rgba {
tiles,
full_dimensions,
output_rect,
payloads,
ranges,
}
}
}