read rle .EGA files
This commit is contained in:
20
src/ega.rs
20
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<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,
|
||||
|
||||
Reference in New Issue
Block a user