From 1e70036d478350538ee588e5518bdee8540eed63 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Sat, 14 Jun 2025 13:11:29 +0800 Subject: [PATCH] Add support to detect BGI sysgrp image --- src/scripts/bgi/archive/v1.rs | 2 +- src/scripts/bgi/image/img.rs | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/scripts/bgi/archive/v1.rs b/src/scripts/bgi/archive/v1.rs index 4a475ff..900c7fd 100644 --- a/src/scripts/bgi/archive/v1.rs +++ b/src/scripts/bgi/archive/v1.rs @@ -97,7 +97,7 @@ impl ScriptBuilder for BgiArchiveBuilder { fn is_this_format(&self, _filename: &str, buf: &[u8], buf_len: usize) -> Option { if buf_len >= 12 && buf.starts_with(b"PackFile ") { - return Some(1); + return Some(10); } None } diff --git a/src/scripts/bgi/image/img.rs b/src/scripts/bgi/image/img.rs index fafaa0c..ed154ae 100644 --- a/src/scripts/bgi/image/img.rs +++ b/src/scripts/bgi/image/img.rs @@ -3,6 +3,32 @@ use crate::scripts::base::*; use crate::types::*; use anyhow::Result; +fn try_parse(buf: &[u8]) -> Result { + let mut reader = MemReaderRef::new(buf); + let width = reader.read_u16()?; + let height = reader.read_u16()?; + let bpp = reader.read_u16()?; + let _flag = reader.read_u16()?; + let padding = reader.read_u64()?; + if padding != 0 { + return Err(anyhow::anyhow!("Invalid padding: {}", padding)); + } + if width == 0 || height == 0 { + return Err(anyhow::anyhow!("Invalid dimensions: {}x{}", width, height)); + } + if width > 4096 || height > 4096 { + return Err(anyhow::anyhow!( + "Dimensions too large: {}x{}", + width, + height + )); + } + if bpp != 8 && bpp != 24 && bpp != 32 { + return Err(anyhow::anyhow!("Unsupported BPP: {}", bpp)); + } + Ok(1) +} + #[derive(Debug)] pub struct BgiImageBuilder {} @@ -39,6 +65,13 @@ impl ScriptBuilder for BgiImageBuilder { fn is_image(&self) -> bool { true } + + fn is_this_format(&self, _filename: &str, buf: &[u8], buf_len: usize) -> Option { + if buf_len >= 0x10 { + return try_parse(&buf[0..0x10]).ok(); + } + None + } } #[derive(Debug)]