public void generateBlocks() { blocks.Clear(); int blockCount = (uncompressedSize + blocksize - 1) / blocksize; compressedSize = 0; for (int i = 0; i < blockCount; i++) { //if data was not found, skip if (uncompressedData == null) { continue; } int blockOffset = i * blocksize; int blockEnd = blockOffset + blocksize; if (blockEnd > uncompressedSize) { blockEnd = uncompressedSize; } var block = new ChunkBlock(); block.uncompressedDataSize = blockEnd - blockOffset; block.uncompressedData = new byte[block.uncompressedDataSize]; Array.ConstrainedCopy(uncompressedData, blockOffset, block.uncompressedData, 0, block.uncompressedData.Length); block.compressTextureFlags(flags); compressedSize += block.compressedSize; blocks.Add(block); } }
private void ReadMipMapFromReader(BinaryReader reader, MipMap map, GpkPackage package) { map.signature = reader.ReadInt32(); //0x9e2a83c1 Debug.Assert(map.signature == Constants.DEFAULT_SIGNATURE); map.blocksize = reader.ReadInt32(); map.compressedSize = reader.ReadInt32(); map.uncompressedSize_chunkheader = reader.ReadInt32(); map.uncompressedData = new byte[map.uncompressedSize]; map.blockCount = (map.uncompressedSize + map.blocksize - 1) / map.blocksize; int blockOffset = 0; for (int j = 0; j < map.blockCount; ++j) { var block = new ChunkBlock(); block.compressedSize = reader.ReadInt32(); block.uncompressedDataSize = reader.ReadInt32(); map.blocks.Add(block); } foreach (ChunkBlock block in map.blocks) { block.compressedData = reader.ReadBytes(block.compressedSize); block.decompressTextureFlags(map.flags); Array.ConstrainedCopy(block.uncompressedData, 0, map.uncompressedData, blockOffset, block.uncompressedDataSize); blockOffset += block.uncompressedDataSize; //save memory block.uncompressedData = null; } //we clear the compressed chunkblocks, so only uncompressed data is present //blocks need to be rebuild when saving if (package.LowMemMode) { map.blocks.Clear(); } }