mirror of
https://github.com/crskycode/GARbro.git
synced 2024-11-30 17:05:37 +08:00
(VafsOpener): detect PicFormat images.
This commit is contained in:
parent
db78e57c41
commit
c364325dad
@ -44,6 +44,8 @@ namespace GameRes.Formats.Softpal
|
|||||||
Extensions = new string[] { "052", "055" };
|
Extensions = new string[] { "052", "055" };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static readonly Lazy<ImageFormat> s_PicFormat = new Lazy<ImageFormat> (() => ImageFormat.FindByTag ("PIC/SOFTPAL"));
|
||||||
|
|
||||||
public override ArcFile TryOpen (ArcView file)
|
public override ArcFile TryOpen (ArcView file)
|
||||||
{
|
{
|
||||||
if ('H' != file.View.ReadByte (4))
|
if ('H' != file.View.ReadByte (4))
|
||||||
@ -61,22 +63,34 @@ namespace GameRes.Formats.Softpal
|
|||||||
bool is_audio = "BGM" == base_name;
|
bool is_audio = "BGM" == base_name;
|
||||||
bool is_pic = "PIC" == base_name;
|
bool is_pic = "PIC" == base_name;
|
||||||
var dir = new List<Entry> (count);
|
var dir = new List<Entry> (count);
|
||||||
for (int i = 0; next_offset != 0 && next_offset != file.MaxOffset && i < count; ++i)
|
for (int i = 0; next_offset != file.MaxOffset && i < count; ++i)
|
||||||
{
|
{
|
||||||
index_offset += 4;
|
index_offset += 4;
|
||||||
var name = string.Format("{0}#{1:D5}", base_name, i);
|
var name = string.Format("{0}#{1:D5}", base_name, i);
|
||||||
var offset = next_offset;
|
var offset = next_offset;
|
||||||
next_offset = index_offset == data_offset ? 0 : file.View.ReadUInt32 (index_offset);
|
next_offset = index_offset == data_offset ? 0 : file.View.ReadUInt32 (index_offset);
|
||||||
uint size = (uint)((0 != next_offset ? (long)next_offset : file.MaxOffset) - offset);
|
if (uint.MaxValue == next_offset)
|
||||||
|
break;
|
||||||
|
else if (0 == next_offset)
|
||||||
|
next_offset = (uint)file.MaxOffset;
|
||||||
|
else if (next_offset < offset)
|
||||||
|
break;
|
||||||
|
uint size = next_offset - offset;
|
||||||
|
if (size < 4)
|
||||||
|
continue;
|
||||||
Entry entry;
|
Entry entry;
|
||||||
if (size <= 4)
|
if (is_pic)
|
||||||
entry = new Entry { Name = name, Offset = offset };
|
|
||||||
else if (is_pic)
|
|
||||||
entry = new Entry { Name = name, Type = "image", Offset = offset };
|
entry = new Entry { Name = name, Type = "image", Offset = offset };
|
||||||
else if (is_audio)
|
else if (is_audio)
|
||||||
entry = new Entry { Name = name + ".wav", Type = "audio", Offset = offset };
|
entry = new Entry { Name = name + ".wav", Type = "audio", Offset = offset };
|
||||||
else
|
else
|
||||||
entry = AutoEntry.Create (file, offset, name);
|
entry = new AutoEntry (name, () => {
|
||||||
|
uint signature = file.View.ReadUInt32 (offset);
|
||||||
|
uint s16 = signature & 0xFFFF;
|
||||||
|
if (1 == s16 || 3 == s16 || 4 == s16)
|
||||||
|
return s_PicFormat.Value;
|
||||||
|
return AutoEntry.DetectFileType (signature);
|
||||||
|
}) { Offset = offset };
|
||||||
|
|
||||||
entry.Size = size;
|
entry.Size = size;
|
||||||
if (!entry.CheckPlacement (file.MaxOffset))
|
if (!entry.CheckPlacement (file.MaxOffset))
|
||||||
|
Loading…
Reference in New Issue
Block a user