protected override void OnOpen(EndianBinaryReader reader) { reader.Endianness = Endian.BigEndian; MagicNumber = Encoding.ASCII.GetString(reader.ReadBytes(4)); Version = Encoding.ASCII.GetString(reader.ReadBytes(4)); FileSize = reader.ReadUInt32(); HeaderSize = reader.ReadUInt32(); NumImages = reader.ReadUInt32(); Unknown0x14 = reader.ReadUInt32(); Unknown0x18 = reader.ReadUInt32(); UnknownValues0x1C = new uint[NumImages]; for (int i = 0; i < UnknownValues0x1C.Length; i++) { UnknownValues0x1C[i] = reader.ReadUInt32(); } ImageOffsets = new uint[NumImages]; for (int i = 0; i < ImageOffsets.Length; i++) { ImageOffsets[i] = reader.ReadUInt32(); } imageDataShims = new G1TGImageDataShim[NumImages]; for (int i = 0; i < NumImages; i++) { reader.BaseStream.Seek(HeaderSize + ImageOffsets[i], SeekOrigin.Begin); G1TGImageHeader imageHeader = new G1TGImageHeader(reader); reader.BaseStream.Seek((HeaderSize + ImageOffsets[i]) + imageHeader.HeaderSize, SeekOrigin.Begin); imageDataShims[i] = new G1TGImageDataShim(imageHeader, reader); } }
public G1TGImageDataShim(G1TGImageHeader header, EndianBinaryReader reader) { /* Determine Scarlet pixel format */ byte pixelFormat = header.PixelFormat; switch (pixelFormat) { case 0x01: Format = PixelDataFormat.FormatRgba8888; break; case 0x06: Format = PixelDataFormat.FormatDXT1Rgba; break; case 0x08: Format = PixelDataFormat.FormatDXT5; break; default: throw new Exception($"Unhandled G1TG image format 0x{pixelFormat:X}"); } /* Extract packed dimensions */ byte packedDimensions = header.PackedDimensions; Width = (1 << ((packedDimensions >> 4) & 0x0F)); Height = (1 << (packedDimensions & 0x0F)); /* Read image data */ Data = reader.ReadBytes((int)((Width * Height) * (Constants.RealBitsPerPixel[Format & PixelDataFormat.MaskBpp] / 8.0))); }