protected async Task<int> ProcessUncompressedBulkData(ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) { DomainCompressedChunkBulkData compressedChunk = new DomainCompressedChunkBulkData(); CompressedChunks.Add(compressedChunk); int builderSize = await compressedChunk.BuildCompressedChunk(reader, compressionFlags); return builderSize; }
public async Task <ByteArrayReader> DecompressChunk(uint flags) { const BulkDataCompressionTypes nothingTodo = BulkDataCompressionTypes.Unused | BulkDataCompressionTypes.StoreInSeparatefile; if (((BulkDataCompressionTypes)BulkDataFlags & nothingTodo) > 0) { return(null); } byte[] chunkData = new byte[Header.Blocks.Sum(block => block.UncompressedSize)]; int uncompressedOffset = 0; foreach (DomainCompressedChunkBlock block in Header.Blocks) { if (((BulkDataCompressionTypes)BulkDataFlags & BulkDataCompressionTypes.LZO_ENC) > 0) { await block.CompressedData.Decrypt(); } byte[] decompressed; const BulkDataCompressionTypes validCompression = BulkDataCompressionTypes.LZO | BulkDataCompressionTypes.LZO_ENC; if (((BulkDataCompressionTypes)BulkDataFlags & validCompression) > 0) { decompressed = await block.CompressedData.Decompress(block.UncompressedSize); } else { if (BulkDataFlags == 0) { decompressed = block.CompressedData.GetBytes(); } else { throw new Exception($"Unsupported bulk data compression type 0x{BulkDataFlags:X8}"); } } int offset = uncompressedOffset; await Task.Run(() => Array.ConstrainedCopy(decompressed, 0, chunkData, offset, block.UncompressedSize)); uncompressedOffset += block.UncompressedSize; } return(ByteArrayReader.CreateNew(chunkData, 0)); }
public override int GetBuilderSize() { BuilderSize = PropertyHeader.GetBuilderSize() + base.GetBuilderSize() + sizeof(int); foreach (byte[] Sound in Sounds) { BulkDataCompressionTypes flags = Sound == null || Sound.Length == 0 ? BulkDataCompressionTypes.Unused | BulkDataCompressionTypes.StoreInSeparatefile : BulkDataCompressionTypes.LZO_ENC; BuilderSize += Task.Run(() => ProcessUncompressedBulkData(ByteArrayReader.CreateNew(Sound, 0), flags)).Result + sizeof(int) * 2; } return(BuilderSize); }
public override int GetBuilderSize() { BuilderSize = PropertyHeader.GetBuilderSize() + base.GetBuilderSize() + sizeof(int); foreach (DomainMipMap mipMap in MipMaps) { BulkDataCompressionTypes flags = mipMap.ImageData == null || mipMap.ImageData.Length == 0 ? BulkDataCompressionTypes.Unused | BulkDataCompressionTypes.StoreInSeparatefile : BulkDataCompressionTypes.LZO_ENC; BuilderSize += Task.Run(() => ProcessUncompressedBulkData(ByteArrayReader.CreateNew(mipMap.ImageData, 0), flags)).Result + sizeof(int) * 2; } BuilderSize += Guid.Length; return(BuilderSize); }
public async Task<int> BuildCompressedChunk(ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) { BulkDataFlags = (uint)compressionFlags; int builderSize = sizeof(uint) + sizeof(int) * 3; if ((compressionFlags & NothingToDo) > 0) return builderSize; reader.Seek(0); UncompressedSize = reader.Remaining; Header = new DomainCompressedChunkHeader(); builderSize += await Header.BuildCompressedChunkHeader(reader, BulkDataFlags); CompressedSize = builderSize - 16; return builderSize; }
public async Task <int> BuildExistingCompressedChunk(ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) { BulkDataFlags = (uint)compressionFlags; int builderSize = sizeof(uint) + sizeof(int) * 3; if ((compressionFlags & NothingToDo) > 0) { return(builderSize); } reader.Seek(0); UncompressedSize = reader.Remaining; builderSize += await Header.BuildExistingCompressedChunkHeader(reader, BulkDataFlags); CompressedSize = builderSize - 16; return(builderSize); }
protected async Task <int> ProcessExistingBulkData(int index, ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) { int builderSize = await CompressedChunks[index].BuildExistingCompressedChunk(reader, compressionFlags); return(builderSize); }
protected async Task <int> ProcessUncompressedBulkData(ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) { DomainCompressedChunkBulkData compressedChunk = new DomainCompressedChunkBulkData(); CompressedChunks.Add(compressedChunk); int builderSize = await compressedChunk.BuildCompressedChunk(reader, compressionFlags); return(builderSize); }
protected async Task<int> ProcessExistingBulkData(int index, ByteArrayReader reader, BulkDataCompressionTypes compressionFlags) { int builderSize = await CompressedChunks[index].BuildExistingCompressedChunk(reader, compressionFlags); return builderSize; }