#![allow(dead_code)]
use crate::bit_writer::BitWriter;
use crate::error::Result;
use crate::modular::rct::RctType;
pub(crate) fn write_rct_transform(
writer: &mut BitWriter,
begin_c: usize,
rct_type: RctType,
) -> Result<()> {
writer.write(2, 0)?;
if begin_c < 8 {
writer.write(2, 0)?; writer.write(3, begin_c as u64)?;
} else if begin_c < 72 {
writer.write(2, 1)?; writer.write(6, (begin_c - 8) as u64)?;
} else if begin_c < 1096 {
writer.write(2, 2)?; writer.write(10, (begin_c - 72) as u64)?;
} else {
writer.write(2, 3)?; writer.write(13, (begin_c - 1096) as u64)?;
}
let rct_val = rct_type.0 as u64;
if rct_val == 6 {
writer.write(2, 0)?; } else if rct_val < 2 {
writer.write(2, 1)?;
writer.write(2, rct_val)?;
} else if rct_val < 10 {
writer.write(2, 2)?;
writer.write(4, rct_val - 2)?;
} else {
writer.write(2, 3)?;
writer.write(6, rct_val - 10)?;
}
Ok(())
}
pub(super) fn write_palette_transform(
writer: &mut BitWriter,
begin_c: usize,
num_c: usize,
nb_colors: usize,
nb_deltas: usize,
predictor: u8,
) -> Result<()> {
writer.write(2, 1)?;
if begin_c < 8 {
writer.write(2, 0)?;
writer.write(3, begin_c as u64)?;
} else if begin_c < 72 {
writer.write(2, 1)?;
writer.write(6, (begin_c - 8) as u64)?;
} else if begin_c < 1096 {
writer.write(2, 2)?;
writer.write(10, (begin_c - 72) as u64)?;
} else {
writer.write(2, 3)?;
writer.write(13, (begin_c - 1096) as u64)?;
}
match num_c {
1 => writer.write(2, 0)?, 3 => writer.write(2, 1)?, 4 => writer.write(2, 2)?, _ => {
writer.write(2, 3)?; writer.write(13, (num_c - 1) as u64)?;
}
}
if nb_colors < 256 {
writer.write(2, 0)?;
writer.write(8, nb_colors as u64)?;
} else if nb_colors < 1280 {
writer.write(2, 1)?;
writer.write(10, (nb_colors - 256) as u64)?;
} else if nb_colors < 5376 {
writer.write(2, 2)?;
writer.write(12, (nb_colors - 1280) as u64)?;
} else {
writer.write(2, 3)?;
writer.write(16, (nb_colors - 5376) as u64)?;
}
if nb_deltas == 0 {
writer.write(2, 0)?; } else if nb_deltas <= 256 {
writer.write(2, 1)?; writer.write(8, (nb_deltas - 1) as u64)?;
} else if nb_deltas <= 1280 {
writer.write(2, 2)?; writer.write(10, (nb_deltas - 257) as u64)?;
} else {
writer.write(2, 3)?; writer.write(16, (nb_deltas - 1281) as u64)?;
}
writer.write(4, predictor as u64)?;
Ok(())
}
pub(crate) fn write_squeeze_transform(
writer: &mut BitWriter,
params: &[super::squeeze::SqueezeParams],
) -> Result<()> {
writer.write(2, 2)?;
if params.is_empty() {
writer.write(2, 0)?; } else {
let n = params.len();
if (1..=16).contains(&n) {
writer.write(2, 1)?; writer.write(4, (n - 1) as u64)?;
} else if (9..=72).contains(&n) {
writer.write(2, 2)?; writer.write(6, (n - 9) as u64)?;
} else {
writer.write(2, 3)?; writer.write(8, (n - 41) as u64)?;
}
for sp in params {
writer.write(1, sp.horizontal as u64)?;
writer.write(1, sp.in_place as u64)?;
let bc = sp.begin_c as usize;
if bc < 8 {
writer.write(2, 0)?;
writer.write(3, bc as u64)?;
} else if bc < 72 {
writer.write(2, 1)?;
writer.write(6, (bc - 8) as u64)?;
} else if bc < 1096 {
writer.write(2, 2)?;
writer.write(10, (bc - 72) as u64)?;
} else {
writer.write(2, 3)?;
writer.write(13, (bc - 1096) as u64)?;
}
match sp.num_c {
1 => writer.write(2, 0)?,
2 => writer.write(2, 1)?,
3 => writer.write(2, 2)?,
_ => {
writer.write(2, 3)?;
writer.write(4, (sp.num_c - 4) as u64)?;
}
}
}
}
Ok(())
}