1
0
Fork 0
mirror of https://codeberg.org/icewind/vbsp.git synced 2026-06-03 18:54:05 +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 crate::*;
use binread::io::Cursor; use binread::io::Cursor;
use binread::BinReaderExt; use binread::BinReaderExt;
use lzma_rs::decompress::{Options, UnpackedSize};
use std::borrow::Cow; use std::borrow::Cow;
pub struct BspFile<'a> { pub struct BspFile<'a> {
@ -30,9 +31,6 @@ impl<'a> BspFile<'a> {
let directories = cursor.read_le()?; let directories = cursor.read_le()?;
let map_version: u32 = cursor.read_le()?;
dbg!(map_version);
Ok(BspFile { Ok(BspFile {
data, data,
directories, directories,
@ -55,6 +53,7 @@ impl<'a> BspFile<'a> {
fn get_lump(&self, lump: LumpType) -> BspResult<Cow<[u8]>> { fn get_lump(&self, lump: LumpType) -> BspResult<Cow<[u8]>> {
let lump = &self.directories[lump]; let lump = &self.directories[lump];
dbg!(lump);
let raw_data = self let raw_data = self
.data .data
.get(lump.offset as usize..lump.offset as usize + lump.length as usize) .get(lump.offset as usize..lump.offset as usize + lump.length as usize)
@ -65,7 +64,20 @@ impl<'a> BspFile<'a> {
_ => { _ => {
let mut data: Vec<u8> = Vec::with_capacity(lump.ident as usize); let mut data: Vec<u8> = Vec::with_capacity(lump.ident as usize);
let mut cursor = Cursor::new(raw_data); let mut cursor = Cursor::new(raw_data);
lzma_rs::lzma_decompress(&mut cursor, &mut data) 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)?; .map_err(BspError::LumpDecompressError)?;
if data.len() != lump.ident as usize { if data.len() != lump.ident as usize {
return Err(BspError::UnexpectedUncompressedLumpSize { return Err(BspError::UnexpectedUncompressedLumpSize {

View file

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