From 3a8c0148c840a5ae7cee58e5d95595bf828e0588 Mon Sep 17 00:00:00 2001 From: Jared Roberts Date: Tue, 1 Nov 2016 04:08:55 -0700 Subject: [PATCH] read rle .EGA files --- src/ega.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/ega.rs b/src/ega.rs index 8882108..325e4b9 100644 --- a/src/ega.rs +++ b/src/ega.rs @@ -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 { .collect() } +fn decode_rle(bytes: &[u8]) -> Vec { + 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>>, load: u16,