(CG): tweak image stride.

This commit is contained in:
morkt 2020-03-30 17:35:55 +04:00
parent e907f78321
commit af970a274c

View File

@ -36,8 +36,8 @@ namespace GameRes.Formats.Parsley
[Export(typeof(ArchiveFormat))] [Export(typeof(ArchiveFormat))]
public class CgOpener : ArchiveFormat public class CgOpener : ArchiveFormat
{ {
public override string Tag { get { return "CG/PARSLEY/2"; } } public override string Tag { get { return "DAT/yanepack"; } }
public override string Description { get { return "Software House Parsley CG archive"; } } public override string Description { get { return "YaneSDK resouce archive"; } }
public override uint Signature { get { return 0; } } public override uint Signature { get { return 0; } }
public override bool IsHierarchic { get { return false; } } public override bool IsHierarchic { get { return false; } }
public override bool CanWrite { get { return false; } } public override bool CanWrite { get { return false; } }
@ -50,6 +50,11 @@ namespace GameRes.Formats.Parsley
public override ArcFile TryOpen (ArcView file) public override ArcFile TryOpen (ArcView file)
{ {
if (file.View.AsciiEqual (0, "yane"))
{
if (!file.View.AsciiEqual (4, "pack"))
return null;
}
int count = file.View.ReadInt32 (8); int count = file.View.ReadInt32 (8);
if (!IsSaneCount (count)) if (!IsSaneCount (count))
return null; return null;
@ -64,7 +69,7 @@ namespace GameRes.Formats.Parsley
var name = file.View.ReadString (index_offset, 0x20); var name = file.View.ReadString (index_offset, 0x20);
if (string.IsNullOrWhiteSpace (name)) if (string.IsNullOrWhiteSpace (name))
return null; return null;
var entry = FormatCatalog.Instance.Create<Entry> (name); var entry = Create<Entry> (name);
entry.Offset = file.View.ReadUInt32 (index_offset+0x20); entry.Offset = file.View.ReadUInt32 (index_offset+0x20);
entry.Size = file.View.ReadUInt32 (index_offset+0x24); entry.Size = file.View.ReadUInt32 (index_offset+0x24);
if (!entry.CheckPlacement (file.MaxOffset)) if (!entry.CheckPlacement (file.MaxOffset))
@ -108,7 +113,7 @@ namespace GameRes.Formats.Parsley
var name = index.ReadCString(); var name = index.ReadCString();
if (string.IsNullOrWhiteSpace (name) || name.Length > 0x100) if (string.IsNullOrWhiteSpace (name) || name.Length > 0x100)
return null; return null;
var entry = FormatCatalog.Instance.Create<PackedEntry> (name); var entry = Create<PackedEntry> (name);
entry.Offset = index.ReadUInt32(); entry.Offset = index.ReadUInt32();
if (entry.Offset >= file.MaxOffset) if (entry.Offset >= file.MaxOffset)
return null; return null;
@ -221,10 +226,19 @@ namespace GameRes.Formats.Parsley
m_input.Position = 0x10; m_input.Position = 0x10;
using (var lz = new LzssStream (m_input.AsStream, LzssMode.Decompress, true)) using (var lz = new LzssStream (m_input.AsStream, LzssMode.Decompress, true))
{ {
/*
int stride = (int)Info.Width * 2; int stride = (int)Info.Width * 2;
var pixels = new byte[stride * (int)Info.Height]; var pixels = new byte[stride * (int)Info.Height];
if (pixels.Length != lz.Read (pixels, 0, pixels.Length)) if (pixels.Length != lz.Read (pixels, 0, pixels.Length))
throw new InvalidFormatException(); throw new InvalidFormatException();
*/
int w2x = (int)Info.Width * 2;
int stride = (w2x + 3) & ~3;
var pixels = new byte[stride * (int)Info.Height];
for (int dst = 0; dst < pixels.Length; dst += stride)
{
lz.Read (pixels, dst, w2x);
}
return ImageData.Create (Info, PixelFormats.Bgr565, null, pixels, stride); return ImageData.Create (Info, PixelFormats.Bgr565, null, pixels, stride);
} }
} }