#[derive(Debug, Clone)]
pub struct ProgressiveScan {
pub component_indices: Vec<usize>,
pub ss: u8,
pub se: u8,
pub ah: u8,
pub al: u8,
}
pub fn simple_progression(num_components: usize) -> Vec<ProgressiveScan> {
let mut scans = Vec::new();
let all_comps: Vec<usize> = (0..num_components).collect();
scans.push(ProgressiveScan {
component_indices: all_comps.clone(),
ss: 0,
se: 0,
ah: 0,
al: 1,
});
for ci in 0..num_components {
scans.push(ProgressiveScan {
component_indices: vec![ci],
ss: 1,
se: 5,
ah: 0,
al: 2,
});
}
for ci in 0..num_components {
scans.push(ProgressiveScan {
component_indices: vec![ci],
ss: 6,
se: 63,
ah: 0,
al: 2,
});
}
for ci in 0..num_components {
scans.push(ProgressiveScan {
component_indices: vec![ci],
ss: 1,
se: 63,
ah: 2,
al: 1,
});
}
scans.push(ProgressiveScan {
component_indices: all_comps,
ss: 0,
se: 0,
ah: 1,
al: 0,
});
for ci in 0..num_components {
scans.push(ProgressiveScan {
component_indices: vec![ci],
ss: 1,
se: 63,
ah: 1,
al: 0,
});
}
scans
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn simple_progression_grayscale() {
let scans = simple_progression(1);
assert_eq!(scans.len(), 6);
assert_eq!(scans[0].ss, 0);
assert_eq!(scans[0].se, 0);
assert_eq!(scans[0].ah, 0);
assert_eq!(scans[0].al, 1);
assert_eq!(scans[1].al, 2);
assert_eq!(scans[3].ah, 2);
assert_eq!(scans[3].al, 1);
assert_eq!(scans[5].ah, 1);
assert_eq!(scans[5].al, 0);
}
#[test]
fn simple_progression_3_components() {
let scans = simple_progression(3);
assert_eq!(scans.len(), 14);
assert_eq!(scans[0].ss, 0);
assert_eq!(scans[0].se, 0);
assert_eq!(scans[0].component_indices.len(), 3);
assert_eq!(scans[0].al, 1);
let last = &scans[13];
assert_eq!(last.ah, 1);
assert_eq!(last.al, 0);
assert_eq!(last.component_indices, vec![2]);
}
}