コード例 #1
0
ファイル: ImgxKtx.cs プロジェクト: caleb-mabry/Kuriimu2
        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);
        }
コード例 #2
0
        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);
        }