use alloc::vec::Vec;
use super::{J2kDirectColorPlan, J2kDirectGrayscalePlan, J2kDirectRgbaPlan};
use crate::{HtCodeBlockPayloadRanges, J2kRect, J2kWaveletTransform};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct J2kReferencedPayloadRecordSpan {
pub first_record: usize,
pub record_count: usize,
}
impl J2kReferencedPayloadRecordSpan {
#[must_use]
pub const fn end_record(self) -> Option<usize> {
self.first_record.checked_add(self.record_count)
}
}
#[derive(Debug)]
pub enum J2kReferencedTileGeometry {
Grayscale(J2kDirectGrayscalePlan),
Color(J2kDirectColorPlan),
Rgba(J2kDirectRgbaPlan),
}
#[derive(Debug)]
pub struct J2kReferencedTilePlan {
tile_index: usize,
decoded_rect: J2kRect,
destination_rect: J2kRect,
payload_records: J2kReferencedPayloadRecordSpan,
wavelet_transform: J2kWaveletTransform,
geometry: J2kReferencedTileGeometry,
}
impl J2kReferencedTilePlan {
#[must_use]
pub const fn tile_index(&self) -> usize {
self.tile_index
}
#[must_use]
pub const fn decoded_rect(&self) -> J2kRect {
self.decoded_rect
}
#[must_use]
pub const fn destination_rect(&self) -> J2kRect {
self.destination_rect
}
#[must_use]
pub const fn payload_records(&self) -> J2kReferencedPayloadRecordSpan {
self.payload_records
}
#[must_use]
pub const fn grayscale_geometry(&self) -> Option<&J2kDirectGrayscalePlan> {
match &self.geometry {
J2kReferencedTileGeometry::Grayscale(geometry) => Some(geometry),
J2kReferencedTileGeometry::Color(_) | J2kReferencedTileGeometry::Rgba(_) => None,
}
}
#[must_use]
pub const fn color_geometry(&self) -> Option<&J2kDirectColorPlan> {
match &self.geometry {
J2kReferencedTileGeometry::Color(geometry) => Some(geometry),
J2kReferencedTileGeometry::Grayscale(_) | J2kReferencedTileGeometry::Rgba(_) => None,
}
}
#[must_use]
pub const fn rgba_geometry(&self) -> Option<&J2kDirectRgbaPlan> {
match &self.geometry {
J2kReferencedTileGeometry::Rgba(geometry) => Some(geometry),
J2kReferencedTileGeometry::Grayscale(_) | J2kReferencedTileGeometry::Color(_) => None,
}
}
#[must_use]
pub const fn wavelet_transform(&self) -> J2kWaveletTransform {
self.wavelet_transform
}
pub(crate) const fn new(
tile_index: usize,
decoded_rect: J2kRect,
destination_rect: J2kRect,
payload_records: J2kReferencedPayloadRecordSpan,
wavelet_transform: J2kWaveletTransform,
geometry: J2kReferencedTileGeometry,
) -> Self {
Self {
tile_index,
decoded_rect,
destination_rect,
payload_records,
wavelet_transform,
geometry,
}
}
}
#[derive(Debug)]
pub enum J2kReferencedHtj2kPlan {
Grayscale {
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<HtCodeBlockPayloadRanges>,
},
Color {
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<HtCodeBlockPayloadRanges>,
},
Rgba {
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<HtCodeBlockPayloadRanges>,
},
}
impl J2kReferencedHtj2kPlan {
#[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) -> &[HtCodeBlockPayloadRanges] {
match self {
Self::Grayscale { payloads, .. }
| Self::Color { payloads, .. }
| Self::Rgba { payloads, .. } => payloads,
}
}
pub(crate) fn grayscale(
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<HtCodeBlockPayloadRanges>,
) -> Self {
Self::Grayscale {
tiles,
full_dimensions,
output_rect,
payloads,
}
}
pub(crate) fn color(
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<HtCodeBlockPayloadRanges>,
) -> Self {
Self::Color {
tiles,
full_dimensions,
output_rect,
payloads,
}
}
pub(crate) fn rgba(
tiles: Vec<J2kReferencedTilePlan>,
full_dimensions: (u32, u32),
output_rect: J2kRect,
payloads: Vec<HtCodeBlockPayloadRanges>,
) -> Self {
Self::Rgba {
tiles,
full_dimensions,
output_rect,
payloads,
}
}
}