Merge pull request #148 from kyororay/master

修正: Cyberworksにおけるtype d差分画像、及び非圧縮type b画像のデコードエラー
This commit is contained in:
Crsky
2025-09-27 23:02:36 +08:00
committed by GitHub
2 changed files with 13 additions and 7 deletions

View File

@@ -460,7 +460,7 @@ namespace GameRes.Formats.Cyberworks
};
if (!entry.CheckPlacement (file.MaxOffset))
return null;
entry.IsPacked = entry.UnpackedSize != entry.Size;
entry.IsPacked = entry.UnpackedSize != entry.Size && entry.UnpackedSize != 0;
dir.Add (entry);
}
}
@@ -637,7 +637,7 @@ namespace GameRes.Formats.Cyberworks
var entry = new PackedEntry { Name = id.ToString ("D6") };
entry.UnpackedSize = m_index.ReadUInt32();
entry.Size = m_index.ReadUInt32();
entry.IsPacked = entry.UnpackedSize != entry.Size;
entry.IsPacked = entry.UnpackedSize != entry.Size && entry.UnpackedSize != 0;
entry.Offset = m_index.ReadUInt32();
return entry;
}

View File

@@ -147,12 +147,18 @@ namespace GameRes.Formats.Cyberworks
var size_buf = new byte[4];
input.Read (size_buf, 0 , 4);
int png_size = BigEndian.ToInt32 (size_buf, 0);
BitmapSource frame;
// work-around for possible extra padding before PNG data
using (var membuf = new MemoryStream (png_size+4))
List<byte> mem_list;
using (var membuf = new MemoryStream())
{
input.CopyTo(membuf);
mem_list = membuf.ToArray().ToList();
mem_list.RemoveRange(0, mem_list.Count - png_size);
}
BitmapSource frame;
using (var membuf = new MemoryStream(mem_list.ToArray()))
{
input.CopyTo (membuf);
membuf.Seek (-png_size, SeekOrigin.End);
var decoder = new PngBitmapDecoder (membuf, BitmapCreateOptions.None,
BitmapCacheOption.OnLoad);
frame = decoder.Frames[0];