public ImageMetaData ReadMetaData(TexEntry entry) { var info = new PsbTexMetaData { BPP = 32 }; info.DataOffset = (int)entry.Offset; info.FullWidth = entry.Width; info.FullHeight = entry.Height; info.Width = (uint)entry.TruncatedWidth; info.Height = (uint)entry.TruncatedHeight; info.TexType = entry.TexType; return(info); }
void ReadRgba8(Stream input, PsbTexMetaData meta, byte[] output) { int dst_stride = (int)meta.Width * 4; long next_row = meta.DataOffset; int src_stride = meta.FullWidth * 4; int dst = 0; for (uint i = 0; i < meta.Height; ++i) { input.Position = next_row; input.Read(output, dst, dst_stride); dst += dst_stride; next_row += src_stride; } }
public ImageMetaData ReadMetaData(Stream stream) { stream.Position = 4; using (var reader = new BinaryReader(stream, Encoding.UTF8, true)) { var info = new PsbTexMetaData { BPP = 32 }; info.DataOffset = reader.ReadInt32(); info.FullWidth = reader.ReadInt32(); info.FullHeight = reader.ReadInt32(); info.Width = reader.ReadUInt32(); info.Height = reader.ReadUInt32(); info.TexType = reader.ReadString(); return(info); } }
void ReadRgba4444(Stream input, PsbTexMetaData meta, byte[] output) { int dst_stride = (int)meta.Width * 4; int src_stride = meta.FullWidth * 2; int dst = 0; var row = new byte[src_stride]; input.Position = meta.DataOffset; for (uint i = 0; i < meta.Height; ++i) { input.Read(row, 0, src_stride); int src = 0; for (int x = 0; x < dst_stride; x += 4) { uint p = LittleEndian.ToUInt16(row, src); src += 2; output[dst++] = (byte)((p & 0x000Fu) * 0xFFu / 0x000Fu); output[dst++] = (byte)((p & 0x00F0u) * 0xFFu / 0x00F0u); output[dst++] = (byte)((p & 0x0F00u) * 0xFFu / 0x0F00u); output[dst++] = (byte)((p & 0xF000u) * 0xFFu / 0xF000u); } } }