Skip to main content

j2k_types/
decode_payload.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2
3//! Borrowed-input byte descriptors shared by prepared decode plans.
4
5/// Byte range inside a complete encoded J2K, JP2, or JPH input.
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
7pub struct J2kCodestreamRange {
8    /// Zero-based offset from the beginning of the encoded input.
9    pub offset: usize,
10    /// Number of bytes in the range.
11    pub length: usize,
12}
13
14impl J2kCodestreamRange {
15    /// End offset, or `None` when the range overflows `usize`.
16    #[must_use]
17    pub const fn end(self) -> Option<usize> {
18        self.offset.checked_add(self.length)
19    }
20}
21
22/// Cleanup and optional refinement byte ranges for one HTJ2K code block.
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
24pub struct HtCodeBlockPayloadRanges {
25    /// Cleanup-pass payload range.
26    pub cleanup: J2kCodestreamRange,
27    /// Concatenated SigProp/MagRef payload range, when refinement is present.
28    pub refinement: Option<J2kCodestreamRange>,
29}
30
31/// Ordered encoded-input fragment span for one classic JPEG 2000 code block.
32#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
33pub struct J2kClassicCodeBlockPayload {
34    /// Index of the first fragment in the owning plan's range array.
35    pub first_range: usize,
36    /// Number of ordered fragments contributing to this code block.
37    pub range_count: usize,
38    /// Total bytes after concatenating every fragment.
39    pub combined_length: usize,
40}
41
42impl J2kClassicCodeBlockPayload {
43    /// Exclusive fragment index, or `None` when the descriptor overflows.
44    #[must_use]
45    pub const fn end_range(self) -> Option<usize> {
46        self.first_range.checked_add(self.range_count)
47    }
48}