Get rid of magic numbers
parent
2ff6b35af1
commit
7e8c28b6ca
|
@ -100,6 +100,8 @@ fn expand_data(b: Vec<u8>, depth: u16) -> Result<Vec<u8>, &'static str>
|
||||||
/// Process a CopyBits operation.
|
/// Process a CopyBits operation.
|
||||||
fn read_bitmap_area(mut im: Image, b: &[u8], packed: bool, clip: bool) -> Result<Image, &str>
|
fn read_bitmap_area(mut im: Image, b: &[u8], packed: bool, clip: bool) -> Result<Image, &str>
|
||||||
{
|
{
|
||||||
|
const SIZE_HEAD: usize = 46;
|
||||||
|
|
||||||
let mut p = if !packed {4} else {0}; // baseAddr
|
let mut p = if !packed {4} else {0}; // baseAddr
|
||||||
|
|
||||||
let (w, h) = (im.w(), im.h());
|
let (w, h) = (im.w(), im.h());
|
||||||
|
@ -122,7 +124,7 @@ fn read_bitmap_area(mut im: Image, b: &[u8], packed: bool, clip: bool) -> Result
|
||||||
// = b_u32b(&b[p+38..p+42]); pmTable
|
// = b_u32b(&b[p+38..p+42]); pmTable
|
||||||
// = b_u32b(&b[p+42..p+46]); pmReserved
|
// = b_u32b(&b[p+42..p+46]); pmReserved
|
||||||
|
|
||||||
p += 46;
|
p += SIZE_HEAD;
|
||||||
|
|
||||||
if pf & 0x8000 == 0 {return Err("PICT1 not supported")}
|
if pf & 0x8000 == 0 {return Err("PICT1 not supported")}
|
||||||
if xe - xb != w || ye - yb != h {return Err("image bounds are incorrect")}
|
if xe - xb != w || ye - yb != h {return Err("image bounds are incorrect")}
|
||||||
|
@ -248,13 +250,15 @@ fn read_quicktime_c(_im: Image, _b: &[u8]) -> Result<Image, &str>
|
||||||
/// Load a PICT image.
|
/// Load a PICT image.
|
||||||
pub fn load_pict(b: &[u8]) -> Result<Image, &str>
|
pub fn load_pict(b: &[u8]) -> Result<Image, &str>
|
||||||
{
|
{
|
||||||
|
const SIZE_HEAD: usize = 10;
|
||||||
|
|
||||||
// size = b_u16b(&b[0.. 2]);
|
// size = b_u16b(&b[0.. 2]);
|
||||||
// top = b_u16b(&b[2.. 4]);
|
// top = b_u16b(&b[2.. 4]);
|
||||||
// left = b_u16b(&b[4.. 6]);
|
// left = b_u16b(&b[4.. 6]);
|
||||||
let h = b_u16b(&b[6.. 8]) as usize;
|
let h = b_u16b(&b[6.. 8]) as usize;
|
||||||
let w = b_u16b(&b[8..10]) as usize;
|
let w = b_u16b(&b[8..10]) as usize;
|
||||||
let im = Image::new(w, h);
|
let im = Image::new(w, h);
|
||||||
let mut p = 10;
|
let mut p = SIZE_HEAD;
|
||||||
|
|
||||||
while p < b.len()
|
while p < b.len()
|
||||||
{
|
{
|
||||||
|
@ -322,3 +326,5 @@ pub fn load_pict(b: &[u8]) -> Result<Image, &str>
|
||||||
|
|
||||||
Err("no image in data")
|
Err("no image in data")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// EOF
|
||||||
|
|
|
@ -38,41 +38,6 @@ pub fn fuck_string(s: &[u8]) -> Vec<u8>
|
||||||
/// Converts input from Mac Roman to a Unicode string.
|
/// Converts input from Mac Roman to a Unicode string.
|
||||||
pub fn mac_roman_conv(s: &[u8]) -> String
|
pub fn mac_roman_conv(s: &[u8]) -> String
|
||||||
{
|
{
|
||||||
let tr = [
|
|
||||||
'\u{00c4}', '\u{00c5}', '\u{00c7}', '\u{00c9}',
|
|
||||||
'\u{00d1}', '\u{00d6}', '\u{00dc}', '\u{00e1}',
|
|
||||||
'\u{00e0}', '\u{00e2}', '\u{00e4}', '\u{00e3}',
|
|
||||||
'\u{00e5}', '\u{00e7}', '\u{00e9}', '\u{00e8}',
|
|
||||||
'\u{00ea}', '\u{00eb}', '\u{00ed}', '\u{00ec}',
|
|
||||||
'\u{00ee}', '\u{00ef}', '\u{00f1}', '\u{00f3}',
|
|
||||||
'\u{00f2}', '\u{00f4}', '\u{00f6}', '\u{00f5}',
|
|
||||||
'\u{00fa}', '\u{00f9}', '\u{00fb}', '\u{00fc}',
|
|
||||||
'\u{2020}', '\u{00b0}', '\u{00a2}', '\u{00a3}',
|
|
||||||
'\u{00a7}', '\u{2022}', '\u{00b6}', '\u{00df}',
|
|
||||||
'\u{00ae}', '\u{00a9}', '\u{2122}', '\u{00b4}',
|
|
||||||
'\u{00a8}', '\u{2260}', '\u{00c6}', '\u{00d8}',
|
|
||||||
'\u{221e}', '\u{00b1}', '\u{2264}', '\u{2265}',
|
|
||||||
'\u{00a5}', '\u{00b5}', '\u{2202}', '\u{2211}',
|
|
||||||
'\u{220f}', '\u{03c0}', '\u{222b}', '\u{00aa}',
|
|
||||||
'\u{00ba}', '\u{03a9}', '\u{00e6}', '\u{00f8}',
|
|
||||||
'\u{00bf}', '\u{00a1}', '\u{00ac}', '\u{221a}',
|
|
||||||
'\u{0192}', '\u{2248}', '\u{2206}', '\u{00ab}',
|
|
||||||
'\u{00bb}', '\u{2026}', '\u{00a0}', '\u{00c0}',
|
|
||||||
'\u{00c3}', '\u{00d5}', '\u{0152}', '\u{0153}',
|
|
||||||
'\u{2013}', '\u{2014}', '\u{201c}', '\u{201d}',
|
|
||||||
'\u{2018}', '\u{2019}', '\u{00f7}', '\u{25ca}',
|
|
||||||
'\u{00ff}', '\u{0178}', '\u{2044}', '\u{20ac}',
|
|
||||||
'\u{2039}', '\u{203a}', '\u{fb01}', '\u{fb02}',
|
|
||||||
'\u{2021}', '\u{00b7}', '\u{201a}', '\u{201e}',
|
|
||||||
'\u{2030}', '\u{00c2}', '\u{00ca}', '\u{00c1}',
|
|
||||||
'\u{00cb}', '\u{00c8}', '\u{00cd}', '\u{00ce}',
|
|
||||||
'\u{00cf}', '\u{00cc}', '\u{00d3}', '\u{00d4}',
|
|
||||||
'\u{f8ff}', '\u{00d2}', '\u{00da}', '\u{00db}',
|
|
||||||
'\u{00d9}', '\u{0131}', '\u{02c6}', '\u{02dc}',
|
|
||||||
'\u{00af}', '\u{02d8}', '\u{02d9}', '\u{02da}',
|
|
||||||
'\u{00b8}', '\u{02dd}', '\u{02db}', '\u{02c7}'
|
|
||||||
];
|
|
||||||
|
|
||||||
let l = s.len();
|
let l = s.len();
|
||||||
let mut v = String::with_capacity(l);
|
let mut v = String::with_capacity(l);
|
||||||
|
|
||||||
|
@ -80,7 +45,7 @@ pub fn mac_roman_conv(s: &[u8]) -> String
|
||||||
{
|
{
|
||||||
if s[i] == 0 {break}
|
if s[i] == 0 {break}
|
||||||
|
|
||||||
if s[i] & 0x80 != 0 {v.push(tr[s[i] as usize & 0x7f])}
|
if s[i] & 0x80 != 0 {v.push(TR[s[i] as usize & 0x7f])}
|
||||||
else if s[i] == b'\r' {v.push('\n')}
|
else if s[i] == b'\r' {v.push('\n')}
|
||||||
else {v.push(s[i] as char)}
|
else {v.push(s[i] as char)}
|
||||||
}
|
}
|
||||||
|
@ -88,4 +53,39 @@ pub fn mac_roman_conv(s: &[u8]) -> String
|
||||||
v
|
v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const TR: [char; 128] = [
|
||||||
|
'\u{00c4}', '\u{00c5}', '\u{00c7}', '\u{00c9}',
|
||||||
|
'\u{00d1}', '\u{00d6}', '\u{00dc}', '\u{00e1}',
|
||||||
|
'\u{00e0}', '\u{00e2}', '\u{00e4}', '\u{00e3}',
|
||||||
|
'\u{00e5}', '\u{00e7}', '\u{00e9}', '\u{00e8}',
|
||||||
|
'\u{00ea}', '\u{00eb}', '\u{00ed}', '\u{00ec}',
|
||||||
|
'\u{00ee}', '\u{00ef}', '\u{00f1}', '\u{00f3}',
|
||||||
|
'\u{00f2}', '\u{00f4}', '\u{00f6}', '\u{00f5}',
|
||||||
|
'\u{00fa}', '\u{00f9}', '\u{00fb}', '\u{00fc}',
|
||||||
|
'\u{2020}', '\u{00b0}', '\u{00a2}', '\u{00a3}',
|
||||||
|
'\u{00a7}', '\u{2022}', '\u{00b6}', '\u{00df}',
|
||||||
|
'\u{00ae}', '\u{00a9}', '\u{2122}', '\u{00b4}',
|
||||||
|
'\u{00a8}', '\u{2260}', '\u{00c6}', '\u{00d8}',
|
||||||
|
'\u{221e}', '\u{00b1}', '\u{2264}', '\u{2265}',
|
||||||
|
'\u{00a5}', '\u{00b5}', '\u{2202}', '\u{2211}',
|
||||||
|
'\u{220f}', '\u{03c0}', '\u{222b}', '\u{00aa}',
|
||||||
|
'\u{00ba}', '\u{03a9}', '\u{00e6}', '\u{00f8}',
|
||||||
|
'\u{00bf}', '\u{00a1}', '\u{00ac}', '\u{221a}',
|
||||||
|
'\u{0192}', '\u{2248}', '\u{2206}', '\u{00ab}',
|
||||||
|
'\u{00bb}', '\u{2026}', '\u{00a0}', '\u{00c0}',
|
||||||
|
'\u{00c3}', '\u{00d5}', '\u{0152}', '\u{0153}',
|
||||||
|
'\u{2013}', '\u{2014}', '\u{201c}', '\u{201d}',
|
||||||
|
'\u{2018}', '\u{2019}', '\u{00f7}', '\u{25ca}',
|
||||||
|
'\u{00ff}', '\u{0178}', '\u{2044}', '\u{20ac}',
|
||||||
|
'\u{2039}', '\u{203a}', '\u{fb01}', '\u{fb02}',
|
||||||
|
'\u{2021}', '\u{00b7}', '\u{201a}', '\u{201e}',
|
||||||
|
'\u{2030}', '\u{00c2}', '\u{00ca}', '\u{00c1}',
|
||||||
|
'\u{00cb}', '\u{00c8}', '\u{00cd}', '\u{00ce}',
|
||||||
|
'\u{00cf}', '\u{00cc}', '\u{00d3}', '\u{00d4}',
|
||||||
|
'\u{f8ff}', '\u{00d2}', '\u{00da}', '\u{00db}',
|
||||||
|
'\u{00d9}', '\u{0131}', '\u{02c6}', '\u{02dc}',
|
||||||
|
'\u{00af}', '\u{02d8}', '\u{02d9}', '\u{02da}',
|
||||||
|
'\u{00b8}', '\u{02dd}', '\u{02db}', '\u{02c7}'
|
||||||
|
];
|
||||||
|
|
||||||
// EOF
|
// EOF
|
||||||
|
|
|
@ -31,8 +31,8 @@ pub struct Wad<'a>
|
||||||
pub enum Ver
|
pub enum Ver
|
||||||
{
|
{
|
||||||
MI,
|
MI,
|
||||||
M2HasOvr,
|
M2,
|
||||||
M2HasDir,
|
M1Dir,
|
||||||
M1
|
M1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,7 +40,7 @@ impl<'a> fmt::Debug for Entry<'a>
|
||||||
{
|
{
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result
|
||||||
{
|
{
|
||||||
write!(f, "Entry {{ ")?;
|
write!(f, "Entry{{ ")?;
|
||||||
for (k, _) in &self.map {write!(f, "{} ", mac_roman_conv(&k[..]))?}
|
for (k, _) in &self.map {write!(f, "{} ", mac_roman_conv(&k[..]))?}
|
||||||
write!(f, "}}")
|
write!(f, "}}")
|
||||||
}
|
}
|
||||||
|
@ -50,6 +50,9 @@ impl<'a> Wad<'a>
|
||||||
{
|
{
|
||||||
pub fn new(b: &[u8]) -> Wad
|
pub fn new(b: &[u8]) -> Wad
|
||||||
{
|
{
|
||||||
|
const SIZE_ENTRY_NEW: usize = 10;
|
||||||
|
const SIZE_ENTRY_OLD: usize = 8;
|
||||||
|
|
||||||
let b = &b[try_mac_header(b)..];
|
let b = &b[try_mac_header(b)..];
|
||||||
let ver = b_u16b(&b[ .. 2]);
|
let ver = b_u16b(&b[ .. 2]);
|
||||||
let dvr = b_u16b(&b[ 2.. 4]);
|
let dvr = b_u16b(&b[ 2.. 4]);
|
||||||
|
@ -64,24 +67,24 @@ impl<'a> Wad<'a>
|
||||||
|
|
||||||
let ver = match ver {
|
let ver = match ver {
|
||||||
4 => Ver::MI,
|
4 => Ver::MI,
|
||||||
2 => Ver::M2HasOvr,
|
2 => Ver::M2,
|
||||||
1 => Ver::M2HasDir,
|
1 => Ver::M1Dir,
|
||||||
0 => Ver::M1,
|
0 => Ver::M1,
|
||||||
_ => panic!("invalid wad version"),
|
_ => panic!("invalid wad version {}", ver),
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut map = EntryMap::new();
|
let mut map = EntryMap::new();
|
||||||
let mut p = dir;
|
let mut p = dir;
|
||||||
let n = match ver {Ver::M1 | Ver::M2HasDir => true, _ => false};
|
let o = match ver {Ver::M1 | Ver::M1Dir => true, _ => false};
|
||||||
let h = if n {8} else {10};
|
let h = if o {SIZE_ENTRY_OLD} else {SIZE_ENTRY_NEW};
|
||||||
|
|
||||||
for i in 0..num
|
for i in 0..num
|
||||||
{
|
{
|
||||||
let ofs = b_u32b(&b[p ..p+ 4]) as usize;
|
let ofs = b_u32b(&b[p ..p+ 4]) as usize;
|
||||||
let len = b_u32b(&b[p+4..p+ 8]) as usize;
|
let len = b_u32b(&b[p+4..p+ 8]) as usize;
|
||||||
let ind = if n {i as u16}
|
let ind = if o {i as u16}
|
||||||
else {b_u16b(&b[p+8..p+10])};
|
else {b_u16b(&b[p+8..p+10])};
|
||||||
let ent = Entry{map: get_chunks(&b[ofs..ofs+len], n),
|
let ent = Entry{map: get_chunks(&b[ofs..ofs+len], o),
|
||||||
ext: &b[p+h..p+h+ext]};
|
ext: &b[p+h..p+h+ext]};
|
||||||
|
|
||||||
map.insert(ind, ent);
|
map.insert(ind, ent);
|
||||||
|
@ -95,11 +98,14 @@ impl<'a> Wad<'a>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_chunks(b: &[u8], n: bool) -> ChunkMap
|
fn get_chunks(b: &[u8], o: bool) -> ChunkMap
|
||||||
{
|
{
|
||||||
let mut p = 0;
|
const SIZE_CHUNK_NEW: usize = 16;
|
||||||
|
const SIZE_CHUNK_OLD: usize = 12;
|
||||||
|
|
||||||
let mut map = ChunkMap::new();
|
let mut map = ChunkMap::new();
|
||||||
let h = if n {12} else {16};
|
let mut p = 0;
|
||||||
|
let h = if o {SIZE_CHUNK_OLD} else {SIZE_CHUNK_NEW};
|
||||||
|
|
||||||
while p < b.len()
|
while p < b.len()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue