public IList <ImageInfo> Load(Stream input, G1tPlatform platform) { _platform = platform; using var br = new BinaryReaderX(input); // Set endianess var magic = br.ReadString(4); br.ByteOrder = magic == "GT1G" ? ByteOrder.LittleEndian : ByteOrder.BigEndian; // Read header input.Position = 0; _header = br.ReadType <G1tHeader>(); // Read unknown region _unkRegion = br.ReadMultiple <int>(_header.texCount); // Read offsets input.Position = _header.dataOffset; var offsets = br.ReadMultiple <int>(_header.texCount); // Read images var result = new List <ImageInfo>(); foreach (var offset in offsets) { // Read entry input.Position = _header.dataOffset + offset; var entry = br.ReadType <G1tEntry>(); // Read image data var dataSize = entry.Width * entry.Height * G1tSupport.GetBitDepth(entry.format, platform) / 8; var imageData = br.ReadBytes(dataSize); // Read mips var mips = new List <byte[]>(); for (var i = 1; i < entry.MipCount; i++) { dataSize = (entry.Width >> i) * (entry.Height >> i) * G1tSupport.GetBitDepth(entry.format, platform) / 8; mips.Add(br.ReadBytes(dataSize)); } // Create image info var imageInfo = new G1tImageInfo(imageData, entry.format, new Size(entry.Width, entry.Height), entry) { MipMapData = mips }; imageInfo.RemapPixels.With(context => G1tSupport.GetSwizzle(context, entry.format, platform)); imageInfo.PadSize.ToPowerOfTwo(); result.Add(imageInfo); } return(result); }
public async Task Load(IFileSystem fileSystem, UPath filePath, LoadContext loadContext) { var fileStream = await fileSystem.OpenFileAsync(filePath); var platform = G1tSupport.DeterminePlatform(fileStream, loadContext.DialogManager); EncodingDefinition = G1tSupport.GetEncodingDefinition(platform); fileStream.Position = 0; Images = _img.Load(fileStream, platform).Select(x => new KanvasImage(EncodingDefinition, x)).ToArray(); }