internal PreviewCreator(VolumeMetadata metadata, ushort minification, IProgress <VolumeSliceDefinition> progress = null, CancellationToken ct = default(CancellationToken)) { _Metadata = metadata ?? throw new ArgumentNullException(nameof(metadata)); _Minification = minification; _Progress = progress; _Ct = ct; _PreviewSizeX = ( ushort )((metadata.SizeX - 1) / minification + 1); _PreviewSizeY = ( ushort )((metadata.SizeY - 1) / minification + 1); _PreviewSizeZ = ( ushort )((metadata.SizeZ - 1) / minification + 1); if (_PreviewSizeX < 2 || _PreviewSizeY < 2 || _PreviewSizeZ < 2) { throw new ArgumentOutOfRangeException(nameof(minification)); } _PreviewData = new byte[_PreviewSizeZ][]; long sliceSize = _PreviewSizeX * _PreviewSizeY; for (var z = 0; z < _PreviewSizeZ; z++) { _PreviewData[z] = new byte[sliceSize]; } Interop = new InteropSliceWriter { WriteSlice = WriteSlice }; }
internal VolumeSliceRangeCollector(VolumeMetadata metaData, Direction direction, IReadOnlyCollection <VolumeSliceRangeDefinition> ranges, IProgress <VolumeSliceDefinition> progressNotifier = null, CancellationToken ct = default(CancellationToken)) { if (direction != Direction.Z && ranges.Any(r => r.Direction != direction)) { throw new ArgumentException("Collecting slices ranges for different directions than input is only allowed for z-directed input"); } _Direction = direction; _ProgressNotifier = progressNotifier; _Ct = ct; _X = metaData.SizeX; _Y = metaData.SizeY; _Z = metaData.SizeZ; foreach (var range in ranges) { var set = GetSlices(range.Direction); for (var i = range.First; i <= range.Last; i++) { metaData.GetSliceSize(range.Direction, out var x, out var y); set[i] = new byte[x * y]; } } Interop = new InteropSliceWriter { WriteSlice = WriteSlice }; }
internal FullVolumeWriter(VolumeMetadata metadata, Direction direction, IProgress <ushort> progressNotifier = null, CancellationToken ct = default(CancellationToken)) { if (metadata == null) { throw new ArgumentNullException(nameof(metadata)); } _ProgressNotifier = progressNotifier; _Ct = ct; metadata.GetSliceSize(direction, out _SizeX, out _SizeY); _SizeZ = metadata.GetSize(direction); _Data = new byte[_SizeZ][]; for (var z = 0; z < _SizeZ; z++) { _Data[z] = new byte[_SizeX * _SizeY]; } Interop = new InteropSliceWriter { WriteSlice = WriteSlice }; }
internal static extern int DecompressSlices(InteropStream inputStream, InteropSliceWriter outputStream, ushort index, ushort count);
internal static extern int DecompressVolume(InteropStream inputStream, InteropSliceWriter outputStream);