use super::fn258::Fn258Mode;
use crate::consts::CONST_N149_IS_256;
use crate::expand::{RExpandData, Result};
use crate::support::BitRead;
use std::io::Write;
impl<R: BitRead, W: Write> RExpandData<R, W> {
pub fn fn253(&mut self, var254: i16, var220: i16, var221: i16) -> Result<()> {
let mut var283: u16;
let bits_to_load219: i16 = self.get_bits(cast!(var220 as i16))? as i16;
if bits_to_load219 == 0 {
let byte_or_run_length203: i16 = self.get_bits(cast!(var220 as i16))? as i16;
let mut run_start226: i16 = 0;
while (run_start226) < var254 {
self.dat_arr181[cast!(run_start226 as usize)] = 0 as u8;
run_start226 += 1
}
run_start226 = 0 as i16;
while (run_start226) < 256 {
self.dat_arr241[cast!(run_start226 as usize)] = cast!(byte_or_run_length203 as u16);
run_start226 += 1
}
} else {
let mut run_start226: i16 = 0;
while (run_start226) < bits_to_load219 {
let mut byte_or_run_length203: i16 = ((self).bits182 >> 13) as i16;
if byte_or_run_length203 == 7 {
let mut bytes_read: usize = 3;
var283 = (1 << 12) as u16;
while 0 != var283 & (self).bits182 {
var283 = (var283 >> 1) as u16;
byte_or_run_length203 += 1;
bytes_read = bytes_read.wrapping_add(1)
}
self.read_bits(bytes_read.wrapping_add(1) as i16)?;
} else {
self.read_bits(3)?;
}
self.dat_arr181[cast!(run_start226 as usize)] = cast!(byte_or_run_length203 as u8);
run_start226 += 1;
if run_start226 != var221 {
continue;
}
byte_or_run_length203 = self.get_bits(2)? as i16;
while byte_or_run_length203 > 0 {
let fresh1 = run_start226;
run_start226 += 1;
self.dat_arr181[cast!(fresh1 as usize)] = 0 as u8;
byte_or_run_length203 -= 1
}
}
while (run_start226) < var254 {
self.dat_arr181[cast!(run_start226 as usize)] = 0 as u8;
run_start226 += 1;
}
self.fn258(
Fn258Mode::Fn253,
cast!(var254 as usize),
8,
cast!(CONST_N149_IS_256 as u16),
)?;
};
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::consts::{CONST_N145_IS_19, CONST_N147_IS_5};
use crate::support::BitReader;
#[test]
fn test_name() {
let out = vec![];
let data = vec![
0x00, 0x12, 0x43, 0x88, 0x81, 0xA7, 0xFF, 0x0D, 0x9A, 0xC8, 0xF4, 0x61, 0xB4, 0x81, 0x94,
0x00, 0x20, 0x9B, 0xD4, 0x90, 0x00, 0x00, 0x19, 0x3C, 0x00, 0x62, 0xA5, 0xC1, 0x81, 0xAF,
0xF0,
];
let length = data.len();
let mut test = RExpandData::new(BitReader::from(&data[..]), out, length, 10).unwrap();
test.read_bits(16).unwrap();
test.get_bits(16).unwrap();
test
.fn253(
cast!(CONST_N145_IS_19 as i16),
cast!(CONST_N147_IS_5 as i16),
3,
)
.unwrap();
let expected_array181 = [
0x3, 0x4, 0x2, 0x4, 0, 0x3, 0x2, 0x3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
];
assert_eq!(test.dat_arr181[..], expected_array181[..]);
let expected_array241 = [
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
0x02, 0x02, 0x02, 0x02, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06,
0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03,
];
assert_eq!(test.dat_arr241[..], expected_array241[..]);
}
}