Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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)));
        }