mirror of
https://github.com/crskycode/GARbro.git
synced 2025-01-12 04:49:32 +08:00
(PicFormat.Read): use LzssStream.
This commit is contained in:
parent
e193a4de91
commit
859c9dcbdf
@ -62,6 +62,8 @@ namespace GameRes.Formats.Gs
|
|||||||
info.PackedSize = input.ReadUInt32();
|
info.PackedSize = input.ReadUInt32();
|
||||||
info.UnpackedSize = input.ReadUInt32();
|
info.UnpackedSize = input.ReadUInt32();
|
||||||
info.HeaderSize = input.ReadUInt32();
|
info.HeaderSize = input.ReadUInt32();
|
||||||
|
if (info.HeaderSize >= stream.Length || info.PackedSize + info.HeaderSize > stream.Length)
|
||||||
|
return null;
|
||||||
input.ReadUInt32();
|
input.ReadUInt32();
|
||||||
info.Width = input.ReadUInt32();
|
info.Width = input.ReadUInt32();
|
||||||
info.Height = input.ReadUInt32();
|
info.Height = input.ReadUInt32();
|
||||||
@ -77,45 +79,37 @@ namespace GameRes.Formats.Gs
|
|||||||
throw new ArgumentException ("PicFormat.Read should be supplied with PicMetaData", "info");
|
throw new ArgumentException ("PicFormat.Read should be supplied with PicMetaData", "info");
|
||||||
|
|
||||||
stream.Position = meta.HeaderSize;
|
stream.Position = meta.HeaderSize;
|
||||||
using (var reader = new LzssReader (stream, (int)meta.PackedSize, (int)meta.UnpackedSize))
|
using (var input = new LzssStream (stream, LzssMode.Decompress, true))
|
||||||
{
|
{
|
||||||
reader.Unpack();
|
|
||||||
byte[] pixels = reader.Data;
|
|
||||||
int stride = (int)meta.Width*((info.BPP+7)/8);
|
|
||||||
BitmapPalette palette = null;
|
BitmapPalette palette = null;
|
||||||
PixelFormat format;
|
PixelFormat format;
|
||||||
if (8 == meta.BPP) // read palette
|
if (8 == meta.BPP) // read palette
|
||||||
{
|
{
|
||||||
format = PixelFormats.Indexed8;
|
format = PixelFormats.Indexed8;
|
||||||
var color_data = new Color[256];
|
palette = ReadPalette (input);
|
||||||
for (int i = 0; i < 256; ++i)
|
|
||||||
color_data[i] = Color.FromRgb (pixels[i*4+2], pixels[i*4+1], pixels[i*4]);
|
|
||||||
palette = new BitmapPalette (color_data);
|
|
||||||
var image = new byte[meta.Width*meta.Height];
|
|
||||||
Buffer.BlockCopy (pixels, 0x400, image, 0, image.Length);
|
|
||||||
pixels = image;
|
|
||||||
}
|
}
|
||||||
else if (24 == meta.BPP)
|
else if (24 == meta.BPP)
|
||||||
format = PixelFormats.Bgr24;
|
format = PixelFormats.Bgr24;
|
||||||
else if (16 == meta.BPP)
|
else if (16 == meta.BPP)
|
||||||
format = PixelFormats.Bgr565;
|
format = PixelFormats.Bgr565;
|
||||||
else
|
else
|
||||||
|
format = PixelFormats.Bgr32;
|
||||||
|
|
||||||
|
int stride = (int)meta.Width*((info.BPP+7)/8);
|
||||||
|
var pixels = new byte[stride*meta.Height];
|
||||||
|
input.Read (pixels, 0, pixels.Length);
|
||||||
|
if (32 == meta.BPP)
|
||||||
{
|
{
|
||||||
bool has_opaque = false;
|
|
||||||
for (int i = 3; i < pixels.Length; i += 4)
|
for (int i = 3; i < pixels.Length; i += 4)
|
||||||
{
|
{
|
||||||
if (0 != pixels[i])
|
if (0 != pixels[i])
|
||||||
{
|
{
|
||||||
has_opaque = true;
|
format = PixelFormats.Bgra32;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
format = has_opaque ? PixelFormats.Bgra32 : PixelFormats.Bgr32;
|
|
||||||
}
|
}
|
||||||
var bitmap = BitmapSource.Create ((int)meta.Width, (int)meta.Height, 96, 96,
|
return ImageData.Create (meta, format, palette, pixels);
|
||||||
format, palette, pixels, stride);
|
|
||||||
bitmap.Freeze();
|
|
||||||
return new ImageData (bitmap, meta);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,5 +117,17 @@ namespace GameRes.Formats.Gs
|
|||||||
{
|
{
|
||||||
throw new NotImplementedException ("PicFormat.Write not implemented");
|
throw new NotImplementedException ("PicFormat.Write not implemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static BitmapPalette ReadPalette (Stream input)
|
||||||
|
{
|
||||||
|
var colors = new byte[0x400];
|
||||||
|
if (colors.Length != input.Read (colors, 0, colors.Length))
|
||||||
|
throw new InvalidFormatException();
|
||||||
|
var color_data = new Color[0x100];
|
||||||
|
int n = 0;
|
||||||
|
for (int i = 0; i < 0x400; i += 4)
|
||||||
|
color_data[n++] = Color.FromRgb (colors[i+2], colors[i+1], colors[i]);
|
||||||
|
return new BitmapPalette (color_data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user