コード例 #1
0
        public static async Task <BA2Builder> Create(BA2StateObject state, long size)
        {
            var self = new BA2Builder {
                _state = state, _slab = await DiskSlabAllocator.Create(size)
            };

            return(self);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: BA2Builder.cs プロジェクト: tr4wzified/wabbajack
 public BA2Builder(BA2StateObject state, long size)
 {
     _state = state;
     _slab  = new DiskSlabAllocator(size);
 }
コード例 #4
0
ファイル: BA2Builder.cs プロジェクト: tr4wzified/wabbajack
        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);
        }
コード例 #5
0
ファイル: BA2Builder.cs プロジェクト: tr4wzified/wabbajack
        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);
        }
コード例 #6
0
ファイル: BA2Builder.cs プロジェクト: tr4wzified/wabbajack
        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);
        }
コード例 #7
0
ファイル: BSABuilder.cs プロジェクト: tr4wzified/wabbajack
 public BSABuilder(long size)
 {
     _fileId = Encoding.ASCII.GetBytes("BSA\0");
     _offset = 0x24;
     _slab   = new DiskSlabAllocator(size);
 }
コード例 #8
0
        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);
        }