read rle .EGA files

This commit is contained in:
2016-11-01 04:08:55 -07:00
parent ddc135e09a
commit 3a8c0148c8

View File

@@ -105,7 +105,9 @@ pub fn decode<'a>(buf: &[u8], compression: Compression, tiling: Tiling)
out = match compression {
Compression::Uncompressed => decode_uncompressed(buf),
Compression::Rle => unimplemented!(),
Compression::Rle => {
decode_uncompressed(&decode_rle(buf))
},
Compression::Lzw => {
let mut decoder = U4Lzw::new();
decode_uncompressed(&decoder.decode(buf))
@@ -130,6 +132,22 @@ fn decode_uncompressed(buf: &[u8]) -> Vec<u8> {
.collect()
}
fn decode_rle(bytes: &[u8]) -> Vec<u8> {
let mut out = Vec::new();
let mut iter = bytes.iter();
while let Some(cmd) = iter.next() {
match cmd {
&0x02 => {
let len = *iter.next().expect("rle missing run length") as usize;
out.extend(::std::iter::repeat(*iter.next().expect("rle missing run value")).take(len));
},
val => out.push(*val),
}
}
out
}
struct U4Lzw {
table: Vec<RefCell<Vec<u8>>>,
load: u16,