public static async Task <BA2Builder> Create(BA2StateObject state, long size) { var self = new BA2Builder { _state = state, _slab = await DiskSlabAllocator.Create(size) }; return(self); }
public static async Task <BSABuilder> Create(long size) { var self = new BSABuilder { _fileId = Encoding.ASCII.GetBytes("BSA\0"), _offset = 0x24, _slab = await DiskSlabAllocator.Create(size) }; return(self); }
public BA2Builder(BA2StateObject state, long size) { _state = state; _slab = new DiskSlabAllocator(size); }
public static async Task <BA2FileEntryBuilder> Create(BA2FileEntryState state, Stream src, DiskSlabAllocator slab) { var builder = new BA2FileEntryBuilder { _state = state, _rawSize = (int)src.Length, _dataSrc = src }; if (!state.Compressed) { return(builder); } await using (var ms = new MemoryStream()) { await using (var ds = new DeflaterOutputStream(ms)) { ds.IsStreamOwner = false; await builder._dataSrc.CopyToAsync(ds); } builder._dataSrc = slab.Allocate(ms.Length); ms.Position = 0; await ms.CopyToAsync(builder._dataSrc); builder._dataSrc.Position = 0; builder._size = (int)ms.Length; } return(builder); }
public static async Task <ChunkBuilder> Create(BA2DX10EntryState state, ChunkState chunk, Stream src, DiskSlabAllocator slab) { var builder = new ChunkBuilder { _chunk = chunk }; if (!chunk.Compressed) { builder._dataSlab = slab.Allocate(chunk.FullSz); await src.CopyToWithStatusAsync((int)chunk.FullSz, builder._dataSlab, $"Writing {state.Path} {chunk.StartMip}:{chunk.EndMip}"); } else { var deflater = new Deflater(Deflater.BEST_COMPRESSION); await using var ms = new MemoryStream(); await using (var ds = new DeflaterOutputStream(ms, deflater)) { ds.IsStreamOwner = false; await src.CopyToWithStatusAsync((int)chunk.FullSz, ds, $"Compressing {state.Path} {chunk.StartMip}:{chunk.EndMip}"); } builder._dataSlab = slab.Allocate(ms.Length); ms.Position = 0; await ms.CopyToWithStatusAsync(ms.Length, builder._dataSlab, $"Writing {state.Path} {chunk.StartMip}:{chunk.EndMip}"); builder._packSize = (uint)ms.Length; } builder._dataSlab.Position = 0; return(builder); }
public static async Task <BA2DX10FileEntryBuilder> Create(BA2DX10EntryState state, Stream src, DiskSlabAllocator slab) { var builder = new BA2DX10FileEntryBuilder { _state = state }; var headerSize = DDS.HeaderSizeForFormat((DXGI_FORMAT)state.PixelFormat) + 4; new BinaryReader(src).ReadBytes((int)headerSize); // This can't be parallel because it all runs off the same base IO stream. builder._chunks = new List <ChunkBuilder>(); foreach (var chunk in state.Chunks) { builder._chunks.Add(await ChunkBuilder.Create(state, chunk, src, slab)); } return(builder); }
public BSABuilder(long size) { _fileId = Encoding.ASCII.GetBytes("BSA\0"); _offset = 0x24; _slab = new DiskSlabAllocator(size); }
public static ChunkBuilder Create(BA2DX10EntryState state, ChunkState chunk, Stream src, DiskSlabAllocator slab) { var builder = new ChunkBuilder { _chunk = chunk }; if (!chunk.Compressed) { builder._dataSlab = slab.Allocate(chunk.FullSz); src.CopyToLimit(builder._dataSlab, (int)chunk.FullSz); } else { var deflater = new Deflater(Deflater.BEST_COMPRESSION); using var ms = new MemoryStream(); using (var ds = new DeflaterOutputStream(ms, deflater)) { ds.IsStreamOwner = false; src.CopyToLimit(ds, (int)chunk.FullSz); } builder._dataSlab = slab.Allocate(ms.Length); ms.Position = 0; ms.CopyTo(builder._dataSlab); builder._packSize = (uint)ms.Length; } builder._dataSlab.Position = 0; return(builder); }