public ImageInfo Load(Stream input, IFileManager pluginManager) { using var br = new BinaryReaderX(input); // Read header _header = br.ReadType <ImgxHeader>(); // Load KTX _imageState = LoadKtx(input, "file.ktx", pluginManager).Result; return(_imageState.Images[0].ImageInfo); }
public ImageInfo Load(Stream input) { using var br = new BinaryReaderX(input); // Header _header = br.ReadType <ImgxHeader>(); // Get tile table var tileTableComp = new SubStream(input, _header.tableDataOffset, _header.tileTableSize); var tileTable = new MemoryStream(); Level5Compressor.Decompress(tileTableComp, tileTable); tileTableComp.Position = 0; _tileTableMethod = (Level5CompressionMethod)(tileTableComp.ReadByte() & 0x7); // Get image data var imageDataComp = new SubStream(input, _header.tableDataOffset + _header.tileTableSizePadded, _header.imgDataSize); var imageData = new MemoryStream(); Level5Compressor.Decompress(imageDataComp, imageData); imageDataComp.Position = 0; _imgDataMethod = (Level5CompressionMethod)(imageDataComp.ReadByte() & 0x7); // Combine tiles to full image data tileTable.Position = imageData.Position = 0; var combinedImageStream = CombineTiles(tileTable, imageData, _header.bitDepth); // Split image data and mip map data var images = new byte[_header.imageCount][]; var(width, height) = ((_header.width + 7) & ~7, (_header.height + 7) & ~7); for (var i = 0; i < _header.imageCount; i++) { images[i] = new byte[width * height * _header.bitDepth / 8]; combinedImageStream.Read(images[i], 0, images[i].Length); (width, height) = (width >> 1, height >> 1); } var imageInfo = new ImageInfo(images.FirstOrDefault(), images.Skip(1).ToArray(), _header.imageFormat, new Size(_header.width, _header.height)); imageInfo.RemapPixels.With(context => new ImgxSwizzle(context, _header.magic)); return(imageInfo); }