/// <inheritdoc /> public override void Decode <TPixel>(TiffPoint offset, TiffSize readSize, TiffPoint destinationOffset, ITiffPixelBufferWriter <TPixel> writer) { if (writer is null) { throw new ArgumentNullException(nameof(writer)); } readSize = new TiffSize(Math.Max(0, Math.Min(writer.Width - destinationOffset.X, readSize.Width)), Math.Max(0, Math.Min(writer.Height - destinationOffset.Y, readSize.Height))); readSize = new TiffSize(Math.Max(0, Math.Min(Width - offset.X, readSize.Width)), Math.Max(0, Math.Min(Height - offset.Y, readSize.Height))); if (readSize.IsAreaEmpty) { return; } if (_parameters.ContentSource is null) { throw new InvalidOperationException("Failed to acquire ContentSource."); } using TiffFileContentReader reader = TiffSyncFileContentSource.WrapReader(_parameters.ContentSource.OpenReader()); var context = new TiffDefaultImageDecoderContext <TPixel>() { MemoryPool = _parameters.MemoryPool ?? MemoryPool <byte> .Shared, CancellationToken = CancellationToken.None, OperationContext = _parameters.OperationContext, ContentReader = reader, SourceImageSize = _parameters.ImageSize, SourceReadOffset = offset, ReadSize = readSize, PixelConverterFactory = _parameters.PixelConverterFactory ?? TiffDefaultPixelConverterFactory.Instance, DestinationWriter = new TiffPixelBufferWriter <TPixel>(TiffNoopDisposablePixelBufferWriter.Wrap(writer)).Crop(destinationOffset, readSize) }; _pipeline.RunAsync(context).AsTask().GetAwaiter().GetResult(); }
/// <inheritdoc /> public override async Task DecodeAsync <TPixel>(TiffPoint offset, TiffSize readSize, TiffPoint destinationOffset, ITiffPixelBufferWriter <TPixel> writer, CancellationToken cancellationToken = default) { if (writer is null) { throw new ArgumentNullException(nameof(writer)); } readSize = new TiffSize(Math.Max(0, Math.Min(writer.Width - destinationOffset.X, readSize.Width)), Math.Max(0, Math.Min(writer.Height - destinationOffset.Y, readSize.Height))); readSize = new TiffSize(Math.Max(0, Math.Min(Width - offset.X, readSize.Width)), Math.Max(0, Math.Min(Height - offset.Y, readSize.Height))); if (readSize.IsAreaEmpty) { return; } if (_parameters.ContentSource is null) { throw new InvalidOperationException("Failed to acquire ContentSource."); } TiffFileContentReader reader = await _parameters.ContentSource.OpenReaderAsync(cancellationToken).ConfigureAwait(false); try { var context = new TiffDefaultImageDecoderContext <TPixel>() { MemoryPool = _parameters.MemoryPool ?? MemoryPool <byte> .Shared, CancellationToken = cancellationToken, OperationContext = _parameters.OperationContext, ContentReader = reader, SourceImageSize = _parameters.ImageSize, SourceReadOffset = offset, ReadSize = readSize, PixelConverterFactory = _parameters.PixelConverterFactory ?? TiffDefaultPixelConverterFactory.Instance, DestinationWriter = new TiffPixelBufferWriter <TPixel>(TiffNoopDisposablePixelBufferWriter.Wrap(writer)).Crop(destinationOffset, readSize) }; await _pipeline.RunAsync(context).ConfigureAwait(false); } finally { await reader.DisposeAsync().ConfigureAwait(false); } }