/// <inheritdoc /> public ValueTask InvokeAsync(TiffImageDecoderContext context, ITiffImageDecoderPipelineNode next) { if (context is null) { throw new ArgumentNullException(nameof(context)); } if (next is null) { throw new ArgumentNullException(nameof(next)); } int bytesPerScanline = 8 * context.SourceImageSize.Width; Memory <byte> source = context.UncompressedData.Slice(context.SourceReadOffset.Y * bytesPerScanline); ReadOnlySpan <TiffCmyk64> cmykSourceSpan = MemoryMarshal.Cast <byte, TiffCmyk64>(source.Span); using TiffPixelBufferWriter <TiffCmyk64> writer = context.GetWriter <TiffCmyk64>(); int rows = context.ReadSize.Height; if (context.IsLittleEndian == BitConverter.IsLittleEndian) { for (int row = 0; row < rows; row++) { using TiffPixelSpanHandle <TiffCmyk64> pixelSpanHandle = writer.GetRowSpan(row); cmykSourceSpan.Slice(context.SourceReadOffset.X, context.ReadSize.Width).CopyTo(pixelSpanHandle.GetSpan()); cmykSourceSpan = cmykSourceSpan.Slice(context.SourceImageSize.Width); } } else { int cols = context.ReadSize.Width; for (int row = 0; row < rows; row++) { using TiffPixelSpanHandle <TiffCmyk64> pixelSpanHandle = writer.GetRowSpan(row); Span <TiffCmyk64> rowDestinationSpan = pixelSpanHandle.GetSpan(); for (int col = 0; col < cols; col++) { TiffCmyk64 cmyk = cmykSourceSpan[col]; cmyk.C = BinaryPrimitives.ReverseEndianness(cmyk.C); cmyk.M = BinaryPrimitives.ReverseEndianness(cmyk.M); cmyk.Y = BinaryPrimitives.ReverseEndianness(cmyk.Y); cmyk.K = BinaryPrimitives.ReverseEndianness(cmyk.K); rowDestinationSpan[col] = cmyk; } cmykSourceSpan = cmykSourceSpan.Slice(context.SourceImageSize.Width); } } return(next.RunAsync(context)); }
public void TestCmyk64() { Assert.Equal(8, Unsafe.SizeOf <TiffCmyk64>()); var defaultPixel = default(TiffCmyk64); Assert.Equal(0, defaultPixel.C); Assert.Equal(0, defaultPixel.M); Assert.Equal(0, defaultPixel.Y); Assert.Equal(0, defaultPixel.K); var pixel1 = new TiffCmyk64(0x1221, 0x3443, 0x5665, 0x7887); Assert.Equal(0x1221, pixel1.C); Assert.Equal(0x3443, pixel1.M); Assert.Equal(0x5665, pixel1.Y); Assert.Equal(0x7887, pixel1.K); Assert.False(pixel1.Equals(defaultPixel)); Assert.False(defaultPixel.Equals(pixel1)); Assert.False(pixel1 == defaultPixel); Assert.False(defaultPixel == pixel1); Assert.True(pixel1 != defaultPixel); Assert.True(defaultPixel != pixel1); Assert.False(pixel1.GetHashCode() == defaultPixel.GetHashCode()); var pixel2 = new TiffCmyk64(0x1221, 0x3443, 0x5665, 0x7887); Assert.True(pixel1.Equals(pixel2)); Assert.True(pixel2.Equals(pixel1)); Assert.True(pixel1 == pixel2); Assert.True(pixel2 == pixel1); Assert.False(pixel1 != pixel2); Assert.False(pixel2 != pixel1); Assert.True(pixel1.GetHashCode() == pixel2.GetHashCode()); }