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 {
|
out = match compression {
|
||||||
Compression::Uncompressed => decode_uncompressed(buf),
|
Compression::Uncompressed => decode_uncompressed(buf),
|
||||||
Compression::Rle => unimplemented!(),
|
Compression::Rle => {
|
||||||
|
decode_uncompressed(&decode_rle(buf))
|
||||||
|
},
|
||||||
Compression::Lzw => {
|
Compression::Lzw => {
|
||||||
let mut decoder = U4Lzw::new();
|
let mut decoder = U4Lzw::new();
|
||||||
decode_uncompressed(&decoder.decode(buf))
|
decode_uncompressed(&decoder.decode(buf))
|
||||||
@@ -130,6 +132,22 @@ fn decode_uncompressed(buf: &[u8]) -> Vec<u8> {
|
|||||||
.collect()
|
.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 {
|
struct U4Lzw {
|
||||||
table: Vec<RefCell<Vec<u8>>>,
|
table: Vec<RefCell<Vec<u8>>>,
|
||||||
load: u16,
|
load: u16,
|
||||||
|
|||||||
Reference in New Issue
Block a user