(EPA): support 16bpp images.

This commit is contained in:
morkt 2019-02-25 12:56:04 +04:00
parent 006004f170
commit f79be94cde

View File

@ -58,20 +58,22 @@ namespace GameRes.Formats.Pajamas
public override ImageMetaData ReadMetaData (IBinaryStream file) public override ImageMetaData ReadMetaData (IBinaryStream file)
{ {
var info = new EpaMetaData(); var header = file.ReadHeader (16);
info.Mode = file.ReadInt32() >> 24; var info = new EpaMetaData {
info.ColorType = file.ReadInt32() & 0xff; Width = header.ToUInt32 (8),
Height = header.ToUInt32 (12),
Mode = header[3],
ColorType = header[4],
};
switch (info.ColorType) switch (info.ColorType)
{ {
case 0: info.BPP = 8; break; case 0: info.BPP = 8; break;
case 1: info.BPP = 24; break; case 1: info.BPP = 24; break;
case 2: info.BPP = 32; break; case 2: info.BPP = 32; break;
case 3: info.BPP = 15; break; case 3: info.BPP = 16; break;
case 4: info.BPP = 8; break; case 4: info.BPP = 8; break;
default: return null; default: return null;
} }
info.Width = file.ReadUInt32();
info.Height = file.ReadUInt32();
if (2 == info.Mode) if (2 == info.Mode)
{ {
info.OffsetX = file.ReadInt32(); info.OffsetX = file.ReadInt32();
@ -109,7 +111,7 @@ namespace GameRes.Formats.Pajamas
case 0: m_pixel_size = 1; Format = PixelFormats.Indexed8; break; case 0: m_pixel_size = 1; Format = PixelFormats.Indexed8; break;
case 1: m_pixel_size = 3; Format = PixelFormats.Bgr24; break; case 1: m_pixel_size = 3; Format = PixelFormats.Bgr24; break;
case 2: m_pixel_size = 4; Format = PixelFormats.Bgra32; break; case 2: m_pixel_size = 4; Format = PixelFormats.Bgra32; break;
case 3: m_pixel_size = 2; Format = PixelFormats.Bgr555; break; case 3: m_pixel_size = 2; Format = PixelFormats.Bgr565; break;
case 4: m_pixel_size = 1; Format = PixelFormats.Bgra32; m_has_alpha = true; break; case 4: m_pixel_size = 1; Format = PixelFormats.Bgra32; m_has_alpha = true; break;
default: throw new NotSupportedException ("Not supported EPA color depth"); default: throw new NotSupportedException ("Not supported EPA color depth");
} }
@ -163,20 +165,39 @@ namespace GameRes.Formats.Pajamas
if (m_pixel_size > 1) if (m_pixel_size > 1)
{ {
var bitmap = new byte[m_output.Length]; var bitmap = new byte[m_output.Length];
int src = 0;
if (m_pixel_size > 2)
{
int stride = m_width * m_pixel_size; int stride = m_width * m_pixel_size;
int i = 0;
for (int p = 0; p < m_pixel_size; ++p) for (int p = 0; p < m_pixel_size; ++p)
{ {
for (int y = 0; y < m_height; ++y) for (int y = 0; y < m_height; ++y)
{ {
int pixel = y * stride + p; int dst = y * stride + p;
for (int x = 0; x < m_width; ++x) for (int x = 0; x < m_width; ++x)
{ {
bitmap[pixel] = m_output[i++]; bitmap[dst] = m_output[src++];
pixel += m_pixel_size; dst += m_pixel_size;
} }
} }
} }
}
else
{
int dst = 0;
int channel_size = m_width * m_height;
for (int y = 0; y < m_height; ++y)
{
for (int x = 0; x < m_width; ++x)
{
byte c1 = m_output[src + x];
byte c2 = m_output[src + x + channel_size];
bitmap[dst++] = (byte)(c2 & 3 | (c1 & 7 | (c2 & 0xFC) << 1) << 2);
bitmap[dst++] = (byte)(c1 & 0xC0 | (c2 & 0xE3 | (c1 >> 1) & 0x1C) >> 2);
}
src += m_width;
}
}
m_output = bitmap; m_output = bitmap;
} }
} }