Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fn rle_decompress(input: &[u8]) -> SegmentReadResult<Vec<Vec<u8>>> {
- let mut output = Vec::<Vec<u8>>::new();
- let mut line = vec![];
- let mut iter = input.iter();
- loop {
- match iter.next() {
- Some(byte_1) => {
- if *byte_1 == 0x00 {
- match iter.next() {
- Some(byte_2) => {
- if *byte_2 >> 6 == 0 {
- for _ in 0..(*byte_2 & 0x3F) {
- line.push(0);
- }
- } else if *byte_2 >> 6 == 1 {
- match iter.next() {
- Some(byte_3) => {
- for _ in 0..(
- (*byte_2 as u16 & 0x3F) << 8
- | *byte_3 as u16
- ) {
- line.push(0);
- }
- }
- None => {
- return Err(ReadError::IncompleteRleSequence)
- }
- }
- } else if *byte_2 >> 6 == 2 {
- match iter.next() {
- Some(byte_3) => {
- for _ in 0..(*byte_2 & 0x3F) {
- line.push(*byte_3);
- }
- }
- None => {
- return Err(ReadError::IncompleteRleSequence)
- }
- }
- } else if *byte_2 >> 6 == 3 {
- match iter.next() {
- Some(byte_3) => {
- match iter.next() {
- Some(byte_4) => {
- for _ in 0..(
- (*byte_2 as u16 & 0x3F) << 8
- | *byte_3 as u16
- ) {
- line.push(*byte_4);
- }
- }
- None => {
- return Err(ReadError::IncompleteRleSequence)
- }
- }
- }
- None => {
- return Err(ReadError::IncompleteRleSequence)
- }
- }
- } else if *byte_2 == 0x00 {
- output.push(line);
- line = vec![];
- } else {
- return Err(ReadError::InvalidRleSequence)
- }
- }
- None => {
- return Err(ReadError::IncompleteRleSequence)
- }
- }
- } else {
- line.push(*byte_1);
- }
- }
- None => {
- break
- }
- }
- }
- Ok(output)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement