1
0
Fork 0
mirror of https://codeberg.org/icewind/vbsp.git synced 2026-06-03 10:44:07 +02:00

lump decompression fixes

This commit is contained in:
Robin Appelman 2020-06-25 20:50:04 +02:00
commit cc93a2889e
2 changed files with 21 additions and 7 deletions

View file

@ -1,6 +1,7 @@
use crate::*;
use binread::io::Cursor;
use binread::BinReaderExt;
use lzma_rs::decompress::{Options, UnpackedSize};
use std::borrow::Cow;
pub struct BspFile<'a> {
@ -30,9 +31,6 @@ impl<'a> BspFile<'a> {
let directories = cursor.read_le()?;
let map_version: u32 = cursor.read_le()?;
dbg!(map_version);
Ok(BspFile {
data,
directories,
@ -55,6 +53,7 @@ impl<'a> BspFile<'a> {
fn get_lump(&self, lump: LumpType) -> BspResult<Cow<[u8]>> {
let lump = &self.directories[lump];
dbg!(lump);
let raw_data = self
.data
.get(lump.offset as usize..lump.offset as usize + lump.length as usize)
@ -65,8 +64,21 @@ impl<'a> BspFile<'a> {
_ => {
let mut data: Vec<u8> = Vec::with_capacity(lump.ident as usize);
let mut cursor = Cursor::new(raw_data);
lzma_rs::lzma_decompress(&mut cursor, &mut data)
.map_err(BspError::LumpDecompressError)?;
if b"LZMA" != &<[u8; 4]>::read(&mut cursor)? {
return Err(BspError::LumpDecompressError(
lzma_rs::error::Error::LZMAError("Invalid lzma header".into()),
));
}
let actual_size: u32 = cursor.read_le()?;
let _lzma_size: u32 = cursor.read_le()?;
lzma_rs::lzma_decompress_with_options(
&mut cursor,
&mut data,
&Options {
unpacked_size: UnpackedSize::UseProvided(Some(actual_size as u64)),
},
)
.map_err(BspError::LumpDecompressError)?;
if data.len() != lump.ident as usize {
return Err(BspError::UnexpectedUncompressedLumpSize {
got: data.len() as u32,

View file

@ -1,3 +1,6 @@
#![allow(dead_code)]
#![allow(unreachable_code)]
mod bspfile;
mod reader;
@ -93,7 +96,7 @@ impl TryFrom<u32> for FaceType {
}
#[derive(Clone)]
struct Directories {
pub struct Directories {
entries: [LumpEntry; 64],
}
@ -661,7 +664,6 @@ pub struct Bsp {
impl Bsp {
pub fn read(data: &[u8]) -> BspResult<Self> {
let bsp_file = BspFile::new(data)?;
let dir_entries = bsp_file.directories();
let entities = bsp_file.lump_reader(LumpType::Entities)?.read_entities()?;
let textures = bsp_file