diff --git a/src/ImageSharp/Formats/Tiff/Compression/DeflateTiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/DeflateTiffCompression.cs index 4ea98d95af..074b04c6b5 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/DeflateTiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/DeflateTiffCompression.cs @@ -5,9 +5,11 @@ using System; using System.IO; using System.IO.Compression; +using SixLabors.ImageSharp.Compression.Zlib; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils; using SixLabors.ImageSharp.Formats.Tiff.Compression; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression @@ -33,34 +35,20 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression } /// - public override void Decompress(Stream stream, int byteCount, Span buffer) + protected override void Decompress(BufferedReadStream stream, int byteCount, Span buffer) { - // Read the 'zlib' header information - int cmf = stream.ReadByte(); - int flag = stream.ReadByte(); - - if ((cmf & 0x0f) != 8) - { - TiffThrowHelper.ThrowBadZlibHeader(cmf); - } - - // If the 'fdict' flag is set then we should skip the next four bytes - bool fdict = (flag & 32) != 0; - - if (fdict) - { - stream.ReadByte(); - stream.ReadByte(); - stream.ReadByte(); - stream.ReadByte(); - } - - // The subsequent data is the Deflate compressed data (except for the last four bytes of checksum) - int headerLength = fdict ? 10 : 6; - var subStream = new SubStream(stream, byteCount - headerLength); - using (var deflateStream = new DeflateStream(subStream, CompressionMode.Decompress, true)) + long pos = stream.Position; + using (var deframeStream = new ZlibInflateStream( + stream, + () => + { + int left = (int)(byteCount - (stream.Position - pos)); + return left > 0 ? left : 0; + })) { - deflateStream.Read(buffer, 0, buffer.Length); + deframeStream.AllocateNewBytes(byteCount, true); + DeflateStream dataStream = deframeStream.CompressedStream; + dataStream.Read(buffer, 0, buffer.Length); } if (this.Predictor == TiffPredictor.Horizontal) diff --git a/src/ImageSharp/Formats/Tiff/Compression/LzwTiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/LzwTiffCompression.cs index b01f141914..92468a00c2 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/LzwTiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/LzwTiffCompression.cs @@ -3,9 +3,11 @@ using System; using System.IO; + using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils; using SixLabors.ImageSharp.Formats.Tiff.Compression; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression @@ -28,10 +30,9 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression } /// - public override void Decompress(Stream stream, int byteCount, Span buffer) + protected override void Decompress(BufferedReadStream stream, int byteCount, Span buffer) { - var subStream = new SubStream(stream, byteCount); - var decoder = new TiffLzwDecoder(subStream, this.Allocator); + var decoder = new TiffLzwDecoder(stream, this.Allocator); decoder.DecodePixels(buffer.Length, 8, buffer); if (this.Predictor == TiffPredictor.Horizontal) diff --git a/src/ImageSharp/Formats/Tiff/Compression/ModifiedHuffmanTiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/ModifiedHuffmanTiffCompression.cs index 6176d75652..1d7c2eef57 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/ModifiedHuffmanTiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/ModifiedHuffmanTiffCompression.cs @@ -5,6 +5,7 @@ using System; using System.IO; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression @@ -26,7 +27,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression } /// - public override void Decompress(Stream stream, int byteCount, Span buffer) + protected override void Decompress(BufferedReadStream stream, int byteCount, Span buffer) { bool isWhiteZero = this.PhotometricInterpretation == TiffPhotometricInterpretation.WhiteIsZero; byte whiteValue = (byte)(isWhiteZero ? 0 : 1); diff --git a/src/ImageSharp/Formats/Tiff/Compression/NoneTiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/NoneTiffCompression.cs index a07b42112a..9140a52e04 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/NoneTiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/NoneTiffCompression.cs @@ -5,6 +5,7 @@ using System; using System.IO; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression @@ -24,9 +25,9 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression } /// - public override void Decompress(Stream stream, int byteCount, Span buffer) + protected override void Decompress(BufferedReadStream stream, int byteCount, Span buffer) { - stream.Read(buffer, 0, byteCount); + _ = stream.Read(buffer, 0, byteCount); } } } diff --git a/src/ImageSharp/Formats/Tiff/Compression/PackBitsTiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/PackBitsTiffCompression.cs index d77ee78e44..a7c8b93481 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/PackBitsTiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/PackBitsTiffCompression.cs @@ -6,6 +6,7 @@ using System.Buffers; using System.IO; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression @@ -25,7 +26,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression } /// - public override void Decompress(Stream stream, int byteCount, Span buffer) + protected override void Decompress(BufferedReadStream stream, int byteCount, Span buffer) { using IMemoryOwner compressedDataMemory = this.Allocator.Allocate(byteCount); diff --git a/src/ImageSharp/Formats/Tiff/Compression/T4TiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/T4TiffCompression.cs index b8649d2101..f0c3a29bdd 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/T4TiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/T4TiffCompression.cs @@ -5,6 +5,7 @@ using System; using System.IO; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression @@ -26,7 +27,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression } /// - public override void Decompress(Stream stream, int byteCount, Span buffer) + protected override void Decompress(BufferedReadStream stream, int byteCount, Span buffer) { bool isWhiteZero = this.PhotometricInterpretation == TiffPhotometricInterpretation.WhiteIsZero; byte whiteValue = (byte)(isWhiteZero ? 0 : 1); diff --git a/src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs index d4f287adc8..1937d20eca 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/TiffBaseCompression.cs @@ -6,6 +6,7 @@ using System.IO; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants; using SixLabors.ImageSharp.Formats.Tiff.Compression; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression @@ -55,9 +56,32 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression /// /// Decompresses image data into the supplied buffer. /// - /// The to read image data from. + /// The to read image data from. + /// The strip offset of stream. + /// The number of bytes to read from the input stream. + /// The output buffer for uncompressed data. + public void Decompress(BufferedReadStream stream, uint stripOffset, uint stripByteCount, Span buffer) + { + if (stripByteCount > int.MaxValue) + { + TiffThrowHelper.ThrowImageFormatException("The StripByteCount value is too big."); + } + + stream.Seek(stripOffset, SeekOrigin.Begin); + this.Decompress(stream, (int)stripByteCount, buffer); + + if (stripOffset + stripByteCount < stream.Position) + { + TiffThrowHelper.ThrowImageFormatException("Out of range when reading a strip."); + } + } + + /// + /// Decompresses image data into the supplied buffer. + /// + /// The to read image data from. /// The number of bytes to read from the input stream. /// The output buffer for uncompressed data. - public abstract void Decompress(Stream stream, int byteCount, Span buffer); + protected abstract void Decompress(BufferedReadStream stream, int byteCount, Span buffer); } } diff --git a/src/ImageSharp/Formats/Tiff/Compression/TiffCompressionFactory.cs b/src/ImageSharp/Formats/Tiff/Compression/TiffCompressionFactory.cs index c261e91d34..2e2fa51458 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/TiffCompressionFactory.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/TiffCompressionFactory.cs @@ -13,17 +13,27 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression switch (compressionType) { case TiffDecoderCompressionType.None: + DebugGuard.IsTrue(predictor == TiffPredictor.None, "predictor"); return new NoneTiffCompression(allocator); + case TiffDecoderCompressionType.PackBits: + DebugGuard.IsTrue(predictor == TiffPredictor.None, "predictor"); return new PackBitsTiffCompression(allocator); + case TiffDecoderCompressionType.Deflate: return new DeflateTiffCompression(allocator, width, bitsPerPixel, predictor); + case TiffDecoderCompressionType.Lzw: return new LzwTiffCompression(allocator, width, bitsPerPixel, predictor); + case TiffDecoderCompressionType.T4: + DebugGuard.IsTrue(predictor == TiffPredictor.None, "predictor"); return new T4TiffCompression(allocator, photometricInterpretation, width); + case TiffDecoderCompressionType.HuffmanRle: + DebugGuard.IsTrue(predictor == TiffPredictor.None, "predictor"); return new ModifiedHuffmanTiffCompression(allocator, photometricInterpretation, width); + default: throw TiffThrowHelper.NotSupportedCompression(nameof(compressionType)); } diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero1TiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero1TiffColor.cs index 14c31dbd0a..ecfae2c9be 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero1TiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero1TiffColor.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; + using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; @@ -25,6 +26,8 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff int offset = 0; + Color black = Color.Black; + Color white = Color.White; for (int y = top; y < top + height; y++) { for (int x = left; x < left + width; x += 8) @@ -35,9 +38,9 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff for (int shift = 0; shift < maxShift; shift++) { int bit = (b >> (7 - shift)) & 1; - byte intensity = (bit == 1) ? (byte)255 : (byte)0; - color.FromRgba32(new Rgba32(intensity, intensity, intensity, 255)); + color.FromRgba32(bit == 0 ? black : white); + pixels[x + shift, y] = color; } } diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero4TiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero4TiffColor.cs index 39216dff77..096e473e5a 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero4TiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero4TiffColor.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; + using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; @@ -25,19 +26,24 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff int offset = 0; bool isOddWidth = (width & 1) == 1; + var l8 = default(L8); for (int y = top; y < top + height; y++) { - for (int x = left; x < left + width - 1; x += 2) + for (int x = left; x < left + width - 1;) { byte byteData = data[offset++]; byte intensity1 = (byte)(((byteData & 0xF0) >> 4) * 17); - color.FromRgba32(new Rgba32(intensity1, intensity1, intensity1, 255)); - pixels[x, y] = color; + l8.PackedValue = intensity1; + color.FromL8(l8); + + pixels[x++, y] = color; byte intensity2 = (byte)((byteData & 0x0F) * 17); - color.FromRgba32(new Rgba32(intensity2, intensity2, intensity2, 255)); - pixels[x + 1, y] = color; + l8.PackedValue = intensity2; + color.FromL8(l8); + + pixels[x++, y] = color; } if (isOddWidth) @@ -45,7 +51,9 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff byte byteData = data[offset++]; byte intensity1 = (byte)(((byteData & 0xF0) >> 4) * 17); - color.FromRgba32(new Rgba32(intensity1, intensity1, intensity1, 255)); + l8.PackedValue = intensity1; + color.FromL8(l8); + pixels[left + width - 1, y] = color; } } diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero8TiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero8TiffColor.cs index 8f281fd04c..3ed7718c4e 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero8TiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZero8TiffColor.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; + using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; @@ -24,13 +25,16 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff int offset = 0; + var l8 = default(L8); for (int y = top; y < top + height; y++) { for (int x = left; x < left + width; x++) { byte intensity = data[offset++]; - color.FromRgba32(new Rgba32(intensity, intensity, intensity, 255)); + l8.PackedValue = intensity; + color.FromL8(l8); + pixels[x, y] = color; } } diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZeroTiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZeroTiffColor.cs index 7fef9ddf62..ddbae32423 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZeroTiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/BlackIsZeroTiffColor.cs @@ -22,7 +22,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff public BlackIsZeroTiffColor(ushort[] bitsPerSample) { this.bitsPerSample0 = bitsPerSample[0]; - this.factor = (float)(1 << this.bitsPerSample0) - 1.0f; + this.factor = (1 << this.bitsPerSample0) - 1.0f; } /// @@ -37,7 +37,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff for (int x = left; x < left + width; x++) { int value = bitReader.ReadBits(this.bitsPerSample0); - float intensity = ((float)value) / this.factor; + float intensity = value / this.factor; color.FromVector4(new Vector4(intensity, intensity, intensity, 1.0f)); pixels[x, y] = color; diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/PaletteTiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/PaletteTiffColor.cs index 719610a9f3..b54fb90bf4 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/PaletteTiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/PaletteTiffColor.cs @@ -49,7 +49,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff { var palette = new TPixel[colorCount]; - int rOffset = 0; + const int rOffset = 0; int gOffset = colorCount; int bOffset = colorCount * 2; diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/Rgb888TiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/Rgb888TiffColor.cs index cc3236b89b..6bb34eb197 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/Rgb888TiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/Rgb888TiffColor.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; + using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; @@ -24,6 +25,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff int offset = 0; + var rgba = default(Rgba32); for (int y = top; y < top + height; y++) { Span pixelRow = pixels.GetRowSpan(y); @@ -34,7 +36,9 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff byte g = data[offset++]; byte b = data[offset++]; - color.FromRgba32(new Rgba32(r, g, b, 255)); + rgba.PackedValue = (uint)(r | (g << 8) | (b << 16) | (0xff << 24)); + color.FromRgba32(rgba); + pixelRow[x] = color; } } diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero1TiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero1TiffColor.cs index 51f84d3c85..2a7010f5f2 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero1TiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero1TiffColor.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; + using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; @@ -24,6 +25,8 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff int offset = 0; + Color black = Color.Black; + Color white = Color.White; for (int y = top; y < top + height; y++) { for (int x = left; x < left + width; x += 8) @@ -34,9 +37,9 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff for (int shift = 0; shift < maxShift; shift++) { int bit = (b >> (7 - shift)) & 1; - byte intensity = (bit == 1) ? (byte)0 : (byte)255; - color.FromRgba32(new Rgba32(intensity, intensity, intensity, 255)); + color.FromRgba32(bit == 0 ? white : black); + pixels[x + shift, y] = color; } } diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero4TiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero4TiffColor.cs index bbee41dcdc..bb2a921c72 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero4TiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero4TiffColor.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; + using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; @@ -25,19 +26,24 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff int offset = 0; bool isOddWidth = (width & 1) == 1; + var l8 = default(L8); for (int y = top; y < top + height; y++) { - for (int x = left; x < left + width - 1; x += 2) + for (int x = left; x < left + width - 1;) { byte byteData = data[offset++]; byte intensity1 = (byte)((15 - ((byteData & 0xF0) >> 4)) * 17); - color.FromRgba32(new Rgba32(intensity1, intensity1, intensity1, 255)); - pixels[x, y] = color; + l8.PackedValue = intensity1; + color.FromL8(l8); + + pixels[x++, y] = color; byte intensity2 = (byte)((15 - (byteData & 0x0F)) * 17); - color.FromRgba32(new Rgba32(intensity2, intensity2, intensity2, 255)); - pixels[x + 1, y] = color; + l8.PackedValue = intensity2; + color.FromL8(l8); + + pixels[x++, y] = color; } if (isOddWidth) @@ -45,7 +51,9 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff byte byteData = data[offset++]; byte intensity1 = (byte)((15 - ((byteData & 0xF0) >> 4)) * 17); - color.FromRgba32(new Rgba32(intensity1, intensity1, intensity1, 255)); + l8.PackedValue = intensity1; + color.FromL8(l8); + pixels[left + width - 1, y] = color; } } diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero8TiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero8TiffColor.cs index 7e192f1afc..b9cc285436 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero8TiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZero8TiffColor.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; + using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; @@ -24,13 +25,16 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff int offset = 0; + var l8 = default(L8); for (int y = top; y < top + height; y++) { for (int x = left; x < left + width; x++) { byte intensity = (byte)(255 - data[offset++]); - color.FromRgba32(new Rgba32(intensity, intensity, intensity, 255)); + l8.PackedValue = intensity; + color.FromL8(l8); + pixels[x, y] = color; } } diff --git a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZeroTiffColor.cs b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZeroTiffColor.cs index a34927c8dc..0ce1df8d8f 100644 --- a/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZeroTiffColor.cs +++ b/src/ImageSharp/Formats/Tiff/PhotometricInterpretation/WhiteIsZeroTiffColor.cs @@ -37,7 +37,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff for (int x = left; x < left + width; x++) { int value = bitReader.ReadBits(this.bitsPerSample0); - float intensity = 1.0f - (((float)value) / this.factor); + float intensity = 1.0f - (value / this.factor); color.FromVector4(new Vector4(intensity, intensity, intensity, 1.0f)); pixels[x, y] = color; diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs index e6595653ce..a62c5946f7 100644 --- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs +++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs @@ -347,8 +347,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff { int stripIndex = (i * stripsPerPixel) + planeIndex; - this.inputStream.Seek(stripOffsets[stripIndex], SeekOrigin.Begin); - decompressor.Decompress(this.inputStream, (int)stripByteCounts[stripIndex], stripBuffers[planeIndex].GetSpan()); + decompressor.Decompress(this.inputStream, stripOffsets[stripIndex], stripByteCounts[stripIndex], stripBuffers[planeIndex].GetSpan()); } colorDecoder.Decode(stripBuffers, pixels, 0, rowsPerStrip * i, frame.Width, stripHeight); @@ -385,8 +384,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff { int stripHeight = stripIndex < stripOffsets.Length - 1 || frame.Height % rowsPerStrip == 0 ? rowsPerStrip : frame.Height % rowsPerStrip; - this.inputStream.Seek(stripOffsets[stripIndex], SeekOrigin.Begin); - decompressor.Decompress(this.inputStream, (int)stripByteCounts[stripIndex], stripBuffer.GetSpan()); + decompressor.Decompress(this.inputStream, stripOffsets[stripIndex], stripByteCounts[stripIndex], stripBuffer.GetSpan()); colorDecoder.Decode(stripBuffer.GetSpan(), pixels, 0, rowsPerStrip * stripIndex, frame.Width, stripHeight); } diff --git a/src/ImageSharp/Formats/Tiff/TiffThrowHelper.cs b/src/ImageSharp/Formats/Tiff/TiffThrowHelper.cs index ff44e0d6e4..3709bca04b 100644 --- a/src/ImageSharp/Formats/Tiff/TiffThrowHelper.cs +++ b/src/ImageSharp/Formats/Tiff/TiffThrowHelper.cs @@ -18,9 +18,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff /// The error message for the exception. [MethodImpl(MethodImplOptions.NoInlining)] public static void ThrowImageFormatException(string errorMessage) - { - throw new ImageFormatException(errorMessage); - } + => throw new ImageFormatException(errorMessage); [MethodImpl(InliningOptions.ColdPath)] public static Exception TagNotFound(string tagName) diff --git a/src/ImageSharp/Formats/Tiff/Utils/SubStream.cs b/src/ImageSharp/Formats/Tiff/Utils/SubStream.cs deleted file mode 100644 index 22cdaf5e8e..0000000000 --- a/src/ImageSharp/Formats/Tiff/Utils/SubStream.cs +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.IO; - -namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils -{ - /// - /// Utility class to encapsulate a sub-portion of another . - /// - /// - /// Note that disposing of the does not dispose the underlying - /// . - /// - internal class SubStream : Stream - { - private Stream innerStream; - private long offset; - private long endOffset; - private long length; - - /// - /// Initializes a new instance of the class. - /// - /// The underlying to wrap. - /// The length of the sub-stream. - /// - /// Note that calling the sub-stream with start from the current offset of the - /// underlying - /// - public SubStream(Stream innerStream, long length) - { - this.innerStream = innerStream; - this.offset = this.innerStream.Position; - this.endOffset = this.offset + length; - this.length = length; - } - - /// - /// Initializes a new instance of the class. - /// - /// The underlying to wrap. - /// The offset of the sub-stream within the underlying . - /// The length of the sub-stream. - /// - /// Note that calling the constructor will immediately move the underlying - /// to the specified offset. - /// - public SubStream(Stream innerStream, long offset, long length) - { - this.innerStream = innerStream; - this.offset = offset; - this.endOffset = offset + length; - this.length = length; - - innerStream.Seek(offset, SeekOrigin.Begin); - } - - /// - public override bool CanRead - { - get - { - return true; - } - } - - /// - public override bool CanWrite - { - get - { - return false; - } - } - - /// - public override bool CanSeek - { - get - { - return this.innerStream.CanSeek; - } - } - - /// - public override long Length - { - get - { - return this.length; - } - } - - /// - public override long Position - { - get - { - return this.innerStream.Position - this.offset; - } - - set - { - this.Seek(value, SeekOrigin.Begin); - } - } - - /// - public override void Flush() - { - throw new NotSupportedException(); - } - - /// - public override int Read(byte[] buffer, int offset, int count) - { - long bytesRemaining = this.endOffset - this.innerStream.Position; - - if (bytesRemaining < count) - { - count = (int)bytesRemaining; - } - - return this.innerStream.Read(buffer, offset, count); - } - - /// - public override int ReadByte() - { - if (this.innerStream.Position < this.endOffset) - { - return this.innerStream.ReadByte(); - } - else - { - return -1; - } - } - - /// - public override void Write(byte[] array, int offset, int count) - { - throw new NotSupportedException(); - } - - /// - public override void WriteByte(byte value) - { - throw new NotSupportedException(); - } - - /// - public override long Seek(long offset, SeekOrigin origin) - { - switch (origin) - { - case SeekOrigin.Current: - return this.innerStream.Seek(offset, SeekOrigin.Current) - this.offset; - case SeekOrigin.Begin: - return this.innerStream.Seek(this.offset + offset, SeekOrigin.Begin) - this.offset; - case SeekOrigin.End: - return this.innerStream.Seek(this.endOffset - offset, SeekOrigin.Begin) - this.offset; - default: - throw new ArgumentException("Invalid seek origin."); - } - } - - /// - public override void SetLength(long value) - { - throw new NotSupportedException(); - } - } -} diff --git a/src/ImageSharp/Formats/Tiff/Utils/TiffWriter.cs b/src/ImageSharp/Formats/Tiff/Utils/TiffWriter.cs index 09db488903..3605869256 100644 --- a/src/ImageSharp/Formats/Tiff/Utils/TiffWriter.cs +++ b/src/ImageSharp/Formats/Tiff/Utils/TiffWriter.cs @@ -186,7 +186,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils { int bytesWritten = 0; using var memoryStream = new MemoryStream(); - using var deflateStream = new ZlibDeflateStream(this.memoryAllocator, memoryStream, compressionLevel); // TODO: move zlib compression from png to a common place? + using var deflateStream = new ZlibDeflateStream(this.memoryAllocator, memoryStream, compressionLevel); for (int y = 0; y < image.Height; y++) { @@ -534,7 +534,7 @@ namespace SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils { int bytesWritten = 0; using var memoryStream = new MemoryStream(); - using var deflateStream = new ZlibDeflateStream(this.memoryAllocator, memoryStream, compressionLevel); // TODO: move zlib compression from png to a common place? + using var deflateStream = new ZlibDeflateStream(this.memoryAllocator, memoryStream, compressionLevel); for (int y = 0; y < image.Height; y++) { diff --git a/src/ImageSharp/Formats/Tiff/__obsolete/TiffIfdEntryCreator.cs b/src/ImageSharp/Formats/Tiff/__obsolete/TiffIfdEntryCreator.cs deleted file mode 100644 index e98a73b844..0000000000 --- a/src/ImageSharp/Formats/Tiff/__obsolete/TiffIfdEntryCreator.cs +++ /dev/null @@ -1,352 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Collections.Generic; -using System.Text; - -namespace SixLabors.ImageSharp.Formats.Tiff -{ - /// - /// Utility class for generating TIFF IFD entries. - /// - internal static class TiffIfdEntryCreator - { - /// - /// Adds a new of type 'Byte' from a unsigned integer. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddUnsignedByte(this List entries, ushort tag, uint value) - { - TiffIfdEntryCreator.AddUnsignedByte(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'Byte' from an array of unsigned integers. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddUnsignedByte(this List entries, ushort tag, uint[] value) - { - byte[] bytes = new byte[value.Length]; - - for (int i = 0; i < value.Length; i++) - { - bytes[i] = (byte)value[i]; - } - - entries.Add(new TiffIfdEntry(tag, TiffType.Byte, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'Short' from a unsigned integer. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddUnsignedShort(this List entries, ushort tag, uint value) - { - TiffIfdEntryCreator.AddUnsignedShort(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'Short' from an array of unsigned integers. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddUnsignedShort(this List entries, ushort tag, uint[] value) - { - byte[] bytes = new byte[value.Length * TiffConstants.SizeOfShort]; - - for (int i = 0; i < value.Length; i++) - { - ToBytes((ushort)value[i], bytes, i * TiffConstants.SizeOfShort); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.Short, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'Long' from a unsigned integer. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddUnsignedLong(this List entries, ushort tag, uint value) - { - TiffIfdEntryCreator.AddUnsignedLong(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'Long' from an array of unsigned integers. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddUnsignedLong(this List entries, ushort tag, uint[] value) - { - byte[] bytes = new byte[value.Length * TiffConstants.SizeOfLong]; - - for (int i = 0; i < value.Length; i++) - { - ToBytes(value[i], bytes, i * TiffConstants.SizeOfLong); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.Long, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'SByte' from a signed integer. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddSignedByte(this List entries, ushort tag, int value) - { - TiffIfdEntryCreator.AddSignedByte(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'SByte' from an array of signed integers. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddSignedByte(this List entries, ushort tag, int[] value) - { - byte[] bytes = new byte[value.Length]; - - for (int i = 0; i < value.Length; i++) - { - bytes[i] = (byte)((sbyte)value[i]); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.SByte, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'SShort' from a signed integer. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddSignedShort(this List entries, ushort tag, int value) - { - TiffIfdEntryCreator.AddSignedShort(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'SShort' from an array of signed integers. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddSignedShort(this List entries, ushort tag, int[] value) - { - byte[] bytes = new byte[value.Length * TiffConstants.SizeOfShort]; - - for (int i = 0; i < value.Length; i++) - { - ToBytes((short)value[i], bytes, i * TiffConstants.SizeOfShort); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.SShort, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'SLong' from a signed integer. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddSignedLong(this List entries, ushort tag, int value) - { - TiffIfdEntryCreator.AddSignedLong(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'SLong' from an array of signed integers. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddSignedLong(this List entries, ushort tag, int[] value) - { - byte[] bytes = new byte[value.Length * TiffConstants.SizeOfLong]; - - for (int i = 0; i < value.Length; i++) - { - ToBytes(value[i], bytes, i * TiffConstants.SizeOfLong); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.SLong, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'Ascii' from a string. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddAscii(this List entries, ushort tag, string value) - { - byte[] bytes = Encoding.UTF8.GetBytes(value + "\0"); - - entries.Add(new TiffIfdEntry(tag, TiffType.Ascii, (uint)bytes.Length, bytes)); - } - - /// - /// Adds a new of type 'Rational' from a . - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddUnsignedRational(this List entries, ushort tag, Rational value) - { - TiffIfdEntryCreator.AddUnsignedRational(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'Rational' from an array of values. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddUnsignedRational(this List entries, ushort tag, Rational[] value) - { - byte[] bytes = new byte[value.Length * TiffConstants.SizeOfRational]; - - for (int i = 0; i < value.Length; i++) - { - int offset = i * TiffConstants.SizeOfRational; - ToBytes(value[i].Numerator, bytes, offset); - ToBytes(value[i].Denominator, bytes, offset + TiffConstants.SizeOfLong); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.Rational, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'SRational' from a . - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddSignedRational(this List entries, ushort tag, SignedRational value) - { - TiffIfdEntryCreator.AddSignedRational(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'SRational' from an array of values. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddSignedRational(this List entries, ushort tag, SignedRational[] value) - { - byte[] bytes = new byte[value.Length * TiffConstants.SizeOfRational]; - - for (int i = 0; i < value.Length; i++) - { - int offset = i * TiffConstants.SizeOfRational; - ToBytes(value[i].Numerator, bytes, offset); - ToBytes(value[i].Denominator, bytes, offset + TiffConstants.SizeOfLong); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.SRational, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'Float' from a floating-point value. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddFloat(this List entries, ushort tag, float value) - { - TiffIfdEntryCreator.AddFloat(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'Float' from an array of floating-point values. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddFloat(this List entries, ushort tag, float[] value) - { - byte[] bytes = new byte[value.Length * TiffConstants.SizeOfFloat]; - - for (int i = 0; i < value.Length; i++) - { - byte[] itemBytes = BitConverter.GetBytes(value[i]); - Array.Copy(itemBytes, 0, bytes, i * TiffConstants.SizeOfFloat, TiffConstants.SizeOfFloat); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.Float, (uint)value.Length, bytes)); - } - - /// - /// Adds a new of type 'Double' from a floating-point value. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddDouble(this List entries, ushort tag, double value) - { - TiffIfdEntryCreator.AddDouble(entries, tag, new[] { value }); - } - - /// - /// Adds a new of type 'Double' from an array of floating-point values. - /// - /// The list of to add the new entry to. - /// The tag for the resulting entry. - /// The value for the resulting entry. - public static void AddDouble(this List entries, ushort tag, double[] value) - { - byte[] bytes = new byte[value.Length * TiffConstants.SizeOfDouble]; - - for (int i = 0; i < value.Length; i++) - { - byte[] itemBytes = BitConverter.GetBytes(value[i]); - Array.Copy(itemBytes, 0, bytes, i * TiffConstants.SizeOfDouble, TiffConstants.SizeOfDouble); - } - - entries.Add(new TiffIfdEntry(tag, TiffType.Double, (uint)value.Length, bytes)); - } - - private static void ToBytes(ushort value, byte[] bytes, int offset) - { - bytes[offset + 0] = (byte)value; - bytes[offset + 1] = (byte)(value >> 8); - } - - private static void ToBytes(uint value, byte[] bytes, int offset) - { - bytes[offset + 0] = (byte)value; - bytes[offset + 1] = (byte)(value >> 8); - bytes[offset + 2] = (byte)(value >> 16); - bytes[offset + 3] = (byte)(value >> 24); - } - - private static void ToBytes(short value, byte[] bytes, int offset) - { - bytes[offset + 0] = (byte)value; - bytes[offset + 1] = (byte)(value >> 8); - } - - private static void ToBytes(int value, byte[] bytes, int offset) - { - bytes[offset + 0] = (byte)value; - bytes[offset + 1] = (byte)(value >> 8); - bytes[offset + 2] = (byte)(value >> 16); - bytes[offset + 3] = (byte)(value >> 24); - } - } -} diff --git a/src/ImageSharp/Formats/Tiff/__obsolete/TiffMetadataNames.cs b/src/ImageSharp/Formats/Tiff/__obsolete/TiffMetadataNames.cs deleted file mode 100644 index a610df8149..0000000000 --- a/src/ImageSharp/Formats/Tiff/__obsolete/TiffMetadataNames.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Formats.Tiff -{ - /// - /// Defines constants for each of the supported TIFF metadata types. - /// - public static class TiffMetadataNames - { - /// - /// Person who created the image. - /// - public const string Artist = "Artist"; - - /// - /// Copyright notice. - /// - public const string Copyright = "Copyright"; - - /// - /// Date and time of image creation. - /// - public const string DateTime = "DateTime"; - - /// - /// The computer and/or operating system in use at the time of image creation. - /// - public const string HostComputer = "HostComputer"; - - /// - /// A string that describes the subject of the image. - /// - public const string ImageDescription = "ImageDescription"; - - /// - /// The scanner/camera manufacturer. - /// - public const string Make = "Make"; - - /// - /// The scanner/camera model name or number. - /// - public const string Model = "Model"; - - /// - /// Name and version number of the software package(s) used to create the image. - /// - public const string Software = "Software"; - } -} diff --git a/src/ImageSharp/Formats/Tiff/__obsolete/TiffTagId.cs b/src/ImageSharp/Formats/Tiff/__obsolete/TiffTagId.cs deleted file mode 100644 index fe9b49ef7f..0000000000 --- a/src/ImageSharp/Formats/Tiff/__obsolete/TiffTagId.cs +++ /dev/null @@ -1,716 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Formats.Tiff -{ - /// - /// Constants representing tag IDs in the Tiff file-format. - /// - internal class TiffTags - { - /// - /// Artist (see Section 8: Baseline Fields). - /// - public const int Artist = 315; - - /// - /// BitsPerSample (see Section 8: Baseline Fields). - /// - public const int BitsPerSample = 258; - - /// - /// CellLength (see Section 8: Baseline Fields). - /// - public const int CellLength = 265; - - /// - /// CellWidth (see Section 8: Baseline Fields). - /// - public const int CellWidth = 264; - - /// - /// ColorMap (see Section 8: Baseline Fields). - /// - public const int ColorMap = 320; - - /// - /// Compression (see Section 8: Baseline Fields). - /// - public const int Compression = 259; - - /// - /// Copyright (see Section 8: Baseline Fields). - /// - public const int Copyright = 33432; - - /// - /// DateTime (see Section 8: Baseline Fields). - /// - public const int DateTime = 306; - - /// - /// ExtraSamples (see Section 8: Baseline Fields). - /// - public const int ExtraSamples = 338; - - /// - /// FillOrder (see Section 8: Baseline Fields). - /// - public const int FillOrder = 266; - - /// - /// FreeByteCounts (see Section 8: Baseline Fields). - /// - public const int FreeByteCounts = 289; - - /// - /// FreeOffsets (see Section 8: Baseline Fields). - /// - public const int FreeOffsets = 288; - - /// - /// GrayResponseCurve (see Section 8: Baseline Fields). - /// - public const int GrayResponseCurve = 291; - - /// - /// GrayResponseUnit (see Section 8: Baseline Fields). - /// - public const int GrayResponseUnit = 290; - - /// - /// HostComputer (see Section 8: Baseline Fields). - /// - public const int HostComputer = 316; - - /// - /// ImageDescription (see Section 8: Baseline Fields). - /// - public const int ImageDescription = 270; - - /// - /// ImageLength (see Section 8: Baseline Fields). - /// - public const int ImageLength = 257; - - /// - /// ImageWidth (see Section 8: Baseline Fields). - /// - public const int ImageWidth = 256; - - /// - /// Make (see Section 8: Baseline Fields). - /// - public const int Make = 271; - - /// - /// MaxSampleValue (see Section 8: Baseline Fields). - /// - public const int MaxSampleValue = 281; - - /// - /// MinSampleValue (see Section 8: Baseline Fields). - /// - public const int MinSampleValue = 280; - - /// - /// Model (see Section 8: Baseline Fields). - /// - public const int Model = 272; - - /// - /// NewSubfileType (see Section 8: Baseline Fields). - /// - public const int NewSubfileType = 254; - - /// - /// Orientation (see Section 8: Baseline Fields). - /// - public const int Orientation = 274; - - /// - /// PhotometricInterpretation (see Section 8: Baseline Fields). - /// - public const int PhotometricInterpretation = 262; - - /// - /// PlanarConfiguration (see Section 8: Baseline Fields). - /// - public const int PlanarConfiguration = 284; - - /// - /// ResolutionUnit (see Section 8: Baseline Fields). - /// - public const int ResolutionUnit = 296; - - /// - /// RowsPerStrip (see Section 8: Baseline Fields). - /// - public const int RowsPerStrip = 278; - - /// - /// SamplesPerPixel (see Section 8: Baseline Fields). - /// - public const int SamplesPerPixel = 277; - - /// - /// Software (see Section 8: Baseline Fields). - /// - public const int Software = 305; - - /// - /// StripByteCounts (see Section 8: Baseline Fields). - /// - public const int StripByteCounts = 279; - - /// - /// StripOffsets (see Section 8: Baseline Fields). - /// - public const int StripOffsets = 273; - - /// - /// SubfileType (see Section 8: Baseline Fields). - /// - public const int SubfileType = 255; - - /// - /// Threshholding (see Section 8: Baseline Fields). - /// - public const int Threshholding = 263; - - /// - /// XResolution (see Section 8: Baseline Fields). - /// - public const int XResolution = 282; - - /// - /// YResolution (see Section 8: Baseline Fields). - /// - public const int YResolution = 283; - - /// - /// T4Options (see Section 11: CCITT Bilevel Encodings). - /// - public const int T4Options = 292; - - /// - /// T6Options (see Section 11: CCITT Bilevel Encodings). - /// - public const int T6Options = 293; - - /// - /// DocumentName (see Section 12: Document Storage and Retrieval). - /// - public const int DocumentName = 269; - - /// - /// PageName (see Section 12: Document Storage and Retrieval). - /// - public const int PageName = 285; - - /// - /// PageNumber (see Section 12: Document Storage and Retrieval). - /// - public const int PageNumber = 297; - - /// - /// XPosition (see Section 12: Document Storage and Retrieval). - /// - public const int XPosition = 286; - - /// - /// YPosition (see Section 12: Document Storage and Retrieval). - /// - public const int YPosition = 287; - - /// - /// Predictor (see Section 14: Differencing Predictor). - /// - public const int Predictor = 317; - - /// - /// TileWidth (see Section 15: Tiled Images). - /// - public const int TileWidth = 322; - - /// - /// TileLength (see Section 15: Tiled Images). - /// - public const int TileLength = 323; - - /// - /// TileOffsets (see Section 15: Tiled Images). - /// - public const int TileOffsets = 324; - - /// - /// TileByteCounts (see Section 15: Tiled Images). - /// - public const int TileByteCounts = 325; - - /// - /// InkSet (see Section 16: CMYK Images). - /// - public const int InkSet = 332; - - /// - /// NumberOfInks (see Section 16: CMYK Images). - /// - public const int NumberOfInks = 334; - - /// - /// InkNames (see Section 16: CMYK Images). - /// - public const int InkNames = 333; - - /// - /// DotRange (see Section 16: CMYK Images). - /// - public const int DotRange = 336; - - /// - /// TargetPrinter (see Section 16: CMYK Images). - /// - public const int TargetPrinter = 337; - - /// - /// HalftoneHints (see Section 17: Halftone Hints). - /// - public const int HalftoneHints = 321; - - /// - /// SampleFormat (see Section 19: Data Sample Format). - /// - public const int SampleFormat = 339; - - /// - /// SMinSampleValue (see Section 19: Data Sample Format). - /// - public const int SMinSampleValue = 340; - - /// - /// SMaxSampleValue (see Section 19: Data Sample Format). - /// - public const int SMaxSampleValue = 341; - - /// - /// WhitePoint (see Section 20: RGB Image Colorimetry). - /// - public const int WhitePoint = 318; - - /// - /// PrimaryChromaticities (see Section 20: RGB Image Colorimetry). - /// - public const int PrimaryChromaticities = 319; - - /// - /// TransferFunction (see Section 20: RGB Image Colorimetry). - /// - public const int TransferFunction = 301; - - /// - /// TransferRange (see Section 20: RGB Image Colorimetry). - /// - public const int TransferRange = 342; - - /// - /// ReferenceBlackWhite (see Section 20: RGB Image Colorimetry). - /// - public const int ReferenceBlackWhite = 532; - - /// - /// YCbCrCoefficients (see Section 21: YCbCr Images). - /// - public const int YCbCrCoefficients = 529; - - /// - /// YCbCrSubSampling (see Section 21: YCbCr Images). - /// - public const int YCbCrSubSampling = 530; - - /// - /// YCbCrPositioning (see Section 21: YCbCr Images). - /// - public const int YCbCrPositioning = 531; - - /// - /// JpegProc (see Section 22: JPEG Compression). - /// - public const int JpegProc = 512; - - /// - /// JpegInterchangeFormat (see Section 22: JPEG Compression). - /// - public const int JpegInterchangeFormat = 513; - - /// - /// JpegInterchangeFormatLength (see Section 22: JPEG Compression). - /// - public const int JpegInterchangeFormatLength = 514; - - /// - /// JpegRestartInterval (see Section 22: JPEG Compression). - /// - public const int JpegRestartInterval = 515; - - /// - /// JpegLosslessPredictors (see Section 22: JPEG Compression). - /// - public const int JpegLosslessPredictors = 517; - - /// - /// JpegPointTransforms (see Section 22: JPEG Compression). - /// - public const int JpegPointTransforms = 518; - - /// - /// JpegQTables (see Section 22: JPEG Compression). - /// - public const int JpegQTables = 519; - - /// - /// JpegDCTables (see Section 22: JPEG Compression). - /// - public const int JpegDCTables = 520; - - /// - /// JpegACTables (see Section 22: JPEG Compression). - /// - public const int JpegACTables = 521; - - /// - /// SubIFDs (see TIFF Supplement 1: Adobe Pagemaker 6.0). - /// - public const int SubIFDs = 330; - - /// - /// ClipPath (see TIFF Supplement 1: Adobe Pagemaker 6.0). - /// - public const int ClipPath = 343; - - /// - /// XClipPathUnits (see TIFF Supplement 1: Adobe Pagemaker 6.0). - /// - public const int XClipPathUnits = 344; - - /// - /// YClipPathUnits (see TIFF Supplement 1: Adobe Pagemaker 6.0). - /// - public const int YClipPathUnits = 345; - - /// - /// Indexed (see TIFF Supplement 1: Adobe Pagemaker 6.0). - /// - public const int Indexed = 346; - - /// - /// ImageID (see TIFF Supplement 1: Adobe Pagemaker 6.0). - /// - public const int ImageID = 32781; - - /// - /// OpiProxy (see TIFF Supplement 1: Adobe Pagemaker 6.0). - /// - public const int OpiProxy = 351; - - /// - /// ImageSourceData (see TIFF Supplement 2: Adobe Photoshop). - /// - public const int ImageSourceData = 37724; - - /// - /// JPEGTables (see TIFF/EP Specification: Additional Tags). - /// - public const int JPEGTables = 0x015B; - - /// - /// CFARepeatPatternDim (see TIFF/EP Specification: Additional Tags). - /// - public const int CFARepeatPatternDim = 0x828D; - - /// - /// BatteryLevel (see TIFF/EP Specification: Additional Tags). - /// - public const int BatteryLevel = 0x828F; - - /// - /// Interlace (see TIFF/EP Specification: Additional Tags). - /// - public const int Interlace = 0x8829; - - /// - /// TimeZoneOffset (see TIFF/EP Specification: Additional Tags). - /// - public const int TimeZoneOffset = 0x882A; - - /// - /// SelfTimerMode (see TIFF/EP Specification: Additional Tags). - /// - public const int SelfTimerMode = 0x882B; - - /// - /// Noise (see TIFF/EP Specification: Additional Tags). - /// - public const int Noise = 0x920D; - - /// - /// ImageNumber (see TIFF/EP Specification: Additional Tags). - /// - public const int ImageNumber = 0x9211; - - /// - /// SecurityClassification (see TIFF/EP Specification: Additional Tags). - /// - public const int SecurityClassification = 0x9212; - - /// - /// ImageHistory (see TIFF/EP Specification: Additional Tags). - /// - public const int ImageHistory = 0x9213; - - /// - /// TiffEPStandardID (see TIFF/EP Specification: Additional Tags). - /// - public const int TiffEPStandardID = 0x9216; - - /// - /// BadFaxLines (see RFC2301: TIFF-F/FX Specification). - /// - public const int BadFaxLines = 326; - - /// - /// CleanFaxData (see RFC2301: TIFF-F/FX Specification). - /// - public const int CleanFaxData = 327; - - /// - /// ConsecutiveBadFaxLines (see RFC2301: TIFF-F/FX Specification). - /// - public const int ConsecutiveBadFaxLines = 328; - - /// - /// GlobalParametersIFD (see RFC2301: TIFF-F/FX Specification). - /// - public const int GlobalParametersIFD = 400; - - /// - /// ProfileType (see RFC2301: TIFF-F/FX Specification). - /// - public const int ProfileType = 401; - - /// - /// FaxProfile (see RFC2301: TIFF-F/FX Specification). - /// - public const int FaxProfile = 402; - - /// - /// CodingMethod (see RFC2301: TIFF-F/FX Specification). - /// - public const int CodingMethod = 403; - - /// - /// VersionYear (see RFC2301: TIFF-F/FX Specification). - /// - public const int VersionYear = 404; - - /// - /// ModeNumber (see RFC2301: TIFF-F/FX Specification). - /// - public const int ModeNumber = 405; - - /// - /// Decode (see RFC2301: TIFF-F/FX Specification). - /// - public const int Decode = 433; - - /// - /// DefaultImageColor (see RFC2301: TIFF-F/FX Specification). - /// - public const int DefaultImageColor = 434; - - /// - /// StripRowCounts (see RFC2301: TIFF-F/FX Specification). - /// - public const int StripRowCounts = 559; - - /// - /// ImageLayer (see RFC2301: TIFF-F/FX Specification). - /// - public const int ImageLayer = 34732; - - /// - /// Xmp (Embedded Metadata). - /// - public const int Xmp = 700; - - /// - /// Iptc (Embedded Metadata). - /// - public const int Iptc = 33723; - - /// - /// Photoshop (Embedded Metadata). - /// - public const int Photoshop = 34377; - - /// - /// ExifIFD (Embedded Metadata). - /// - public const int ExifIFD = 34665; - - /// - /// GpsIFD (Embedded Metadata). - /// - public const int GpsIFD = 34853; - - /// - /// InteroperabilityIFD (Embedded Metadata). - /// - public const int InteroperabilityIFD = 40965; - - /// - /// WangAnnotation (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int WangAnnotation = 32932; - - /// - /// MDFileTag (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int MDFileTag = 33445; - - /// - /// MDScalePixel (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int MDScalePixel = 33446; - - /// - /// MDColorTable (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int MDColorTable = 33447; - - /// - /// MDLabName (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int MDLabName = 33448; - - /// - /// MDSampleInfo (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int MDSampleInfo = 33449; - - /// - /// MDPrepDate (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int MDPrepDate = 33450; - - /// - /// MDPrepTime (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int MDPrepTime = 33451; - - /// - /// MDFileUnits (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int MDFileUnits = 33452; - - /// - /// ModelPixelScaleTag (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int ModelPixelScaleTag = 33550; - - /// - /// IngrPacketDataTag (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int IngrPacketDataTag = 33918; - - /// - /// IngrFlagRegisters (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int IngrFlagRegisters = 33919; - - /// - /// IrasBTransformationMatrix (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int IrasBTransformationMatrix = 33920; - - /// - /// ModelTiePointTag (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int ModelTiePointTag = 33922; - - /// - /// ModelTransformationTag (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int ModelTransformationTag = 34264; - - /// - /// IccProfile (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int IccProfile = 34675; - - /// - /// GeoKeyDirectoryTag (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int GeoKeyDirectoryTag = 34735; - - /// - /// GeoDoubleParamsTag (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int GeoDoubleParamsTag = 34736; - - /// - /// GeoAsciiParamsTag (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int GeoAsciiParamsTag = 34737; - - /// - /// HylaFAXFaxRecvParams (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int HylaFAXFaxRecvParams = 34908; - - /// - /// HylaFAXFaxSubAddress (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int HylaFAXFaxSubAddress = 34909; - - /// - /// HylaFAXFaxRecvTime (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int HylaFAXFaxRecvTime = 34910; - - /// - /// GdalMetadata (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int GdalMetadata = 42112; - - /// - /// GdalNodata (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int GdalNodata = 42113; - - /// - /// OceScanjobDescription (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int OceScanjobDescription = 50215; - - /// - /// OceApplicationSelector (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int OceApplicationSelector = 50216; - - /// - /// OceIdentificationNumber (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int OceIdentificationNumber = 50217; - - /// - /// OceImageLogicCharacteristics (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int OceImageLogicCharacteristics = 50218; - - /// - /// AliasLayerMetadata (Other Private TIFF tags : see http://www.awaresystems.be/imaging/tiff/tifftags/private.html). - /// - public const int AliasLayerMetadata = 50784; - } -} \ No newline at end of file diff --git a/src/ImageSharp/Formats/Tiff/__obsolete/TiffTagType.cs b/src/ImageSharp/Formats/Tiff/__obsolete/TiffTagType.cs deleted file mode 100644 index f1d0adfc23..0000000000 --- a/src/ImageSharp/Formats/Tiff/__obsolete/TiffTagType.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Formats.Tiff -{ - /// - /// Enumeration representing the data types understood by the Tiff file-format. - /// - internal enum TiffType - { - /// - /// Unsigned 8-bit integer. - /// - Byte = 1, - - /// - /// ASCII formatted text. - /// - Ascii = 2, - - /// - /// Unsigned 16-bit integer. - /// - Short = 3, - - /// - /// Unsigned 32-bit integer. - /// - Long = 4, - - /// - /// Unsigned rational number. - /// - Rational = 5, - - /// - /// Signed 8-bit integer. - /// - SByte = 6, - - /// - /// Undefined data type. - /// - Undefined = 7, - - /// - /// Signed 16-bit integer. - /// - SShort = 8, - - /// - /// Signed 32-bit integer. - /// - SLong = 9, - - /// - /// Signed rational number. - /// - SRational = 10, - - /// - /// Single precision (4-byte) IEEE format. - /// - Float = 11, - - /// - /// Double precision (8-byte) IEEE format. - /// - Double = 12, - - /// - /// Reference to an IFD. - /// - Ifd = 13 - } -} \ No newline at end of file diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index 65f59331da..1d7fb2958b 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -15,12 +15,6 @@ netcoreapp3.1;netcoreapp2.1;netstandard2.1;netstandard2.0;netstandard1.3;net472 - - - - - - diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeTiffBig.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeTiffBig.cs index 4210d05716..9f8f53a370 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodeTiffBig.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeTiffBig.cs @@ -7,8 +7,10 @@ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Environments; using BenchmarkDotNet.Jobs; using BenchmarkDotNet.Reports; + using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; + using SDImage = System.Drawing.Image; using SDSize = System.Drawing.Size; @@ -37,11 +39,18 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs private byte[] data; - private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, this.TestImage); - - [Params(TestImages.Tiff.Benchmark_GrayscaleUncompressed, TestImages.Tiff.Benchmark_PaletteUncompressed, TestImages.Tiff.Benchmark_RgbDeflate, TestImages.Tiff.Benchmark_RgbLzw, TestImages.Tiff.Benchmark_RgbPackbits, TestImages.Tiff.Benchmark_RgbUncompressed)] + private string TestImageFullPath => Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, Path.Combine(TestImages.Tiff.Benchmark_Path, this.TestImage)); - // [Params(TestImages.Tiff.GrayscaleUncompressed, TestImages.Tiff.PaletteUncompressed, TestImages.Tiff.RgbDeflate, TestImages.Tiff.RgbLzw, TestImages.Tiff.RgbPackbits, TestImages.Tiff.RgbUncompressed)] + [Params( + TestImages.Tiff.Benchmark_BwFax3, + //// TestImages.Tiff.Benchmark_RgbFax4, + TestImages.Tiff.Benchmark_BwRle, + TestImages.Tiff.Benchmark_GrayscaleUncompressed, + TestImages.Tiff.Benchmark_PaletteUncompressed, + TestImages.Tiff.Benchmark_RgbDeflate, + TestImages.Tiff.Benchmark_RgbLzw, + TestImages.Tiff.Benchmark_RgbPackbits, + TestImages.Tiff.Benchmark_RgbUncompressed)] public string TestImage { get; set; } [IterationSetup] @@ -67,8 +76,15 @@ namespace SixLabors.ImageSharp.Benchmarks.Codecs [Benchmark(Description = "ImageSharp Tiff")] public Size TiffCore() { + Configuration config = Configuration.Default.Clone(); + config.StreamProcessingBufferSize = 1024 * 64; + + config.ImageFormatsManager.AddImageFormat(Formats.Experimental.Tiff.TiffFormat.Instance); + config.ImageFormatsManager.AddImageFormatDetector(new Formats.Experimental.Tiff.TiffImageFormatDetector()); + config.ImageFormatsManager.SetDecoder(Formats.Experimental.Tiff.TiffFormat.Instance, new Formats.Experimental.Tiff.TiffDecoder()); + using (var ms = new MemoryStream(this.data)) - using (var image = Image.Load(ms)) + using (var image = Image.Load(config, ms)) { return image.Size(); } diff --git a/tests/ImageSharp.Tests/Formats/Tiff/Compression/DeflateTiffCompressionTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/Compression/DeflateTiffCompressionTests.cs index fbac89e9ac..18025eecbd 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/Compression/DeflateTiffCompressionTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/Compression/DeflateTiffCompressionTests.cs @@ -5,6 +5,8 @@ using System.IO; using SixLabors.ImageSharp.Compression.Zlib; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants; +using SixLabors.ImageSharp.IO; + using Xunit; namespace SixLabors.ImageSharp.Tests.Formats.Tiff.Compression @@ -20,17 +22,17 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff.Compression [InlineData(new byte[] { 1, 2, 42, 53, 42, 53, 42, 53, 42, 53, 42, 53, 3, 4 })] // Repeated sequence public void Compress_Decompress_Roundtrip_Works(byte[] data) { - using (Stream stream = CreateCompressedStream(data)) + using (BufferedReadStream stream = CreateCompressedStream(data)) { var buffer = new byte[data.Length]; - new DeflateTiffCompression(Configuration.Default.MemoryAllocator, 10, 8, TiffPredictor.None).Decompress(stream, (int)stream.Length, buffer); + new DeflateTiffCompression(Configuration.Default.MemoryAllocator, 10, 8, TiffPredictor.None).Decompress(stream, 0, (uint)stream.Length, buffer); Assert.Equal(data, buffer); } } - private static Stream CreateCompressedStream(byte[] data) + private static BufferedReadStream CreateCompressedStream(byte[] data) { Stream compressedStream = new MemoryStream(); @@ -41,7 +43,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff.Compression } compressedStream.Seek(0, SeekOrigin.Begin); - return compressedStream; + return new BufferedReadStream(Configuration.Default, compressedStream); } } } diff --git a/tests/ImageSharp.Tests/Formats/Tiff/Compression/LzwTiffCompressionTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/Compression/LzwTiffCompressionTests.cs index 79cc1b1a88..6ba1b32261 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/Compression/LzwTiffCompressionTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/Compression/LzwTiffCompressionTests.cs @@ -7,6 +7,7 @@ using System.IO; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Constants; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; using Xunit; @@ -36,15 +37,15 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff.Compression public void Compress_Decompress_Roundtrip_Works(byte[] data) { - using Stream stream = CreateCompressedStream(data); + using BufferedReadStream stream = CreateCompressedStream(data); var buffer = new byte[data.Length]; - new LzwTiffCompression(Configuration.Default.MemoryAllocator, 10, 8, TiffPredictor.None).Decompress(stream, (int)stream.Length, buffer); + new LzwTiffCompression(Configuration.Default.MemoryAllocator, 10, 8, TiffPredictor.None).Decompress(stream, 0, (uint)stream.Length, buffer); Assert.Equal(data, buffer); } - private static Stream CreateCompressedStream(byte[] inputData) + private static BufferedReadStream CreateCompressedStream(byte[] inputData) { Stream compressedStream = new MemoryStream(); using System.Buffers.IMemoryOwner data = Configuration.Default.MemoryAllocator.Allocate(inputData.Length); @@ -57,7 +58,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff.Compression compressedStream.Seek(0, SeekOrigin.Begin); - return compressedStream; + return new BufferedReadStream(Configuration.Default, compressedStream); } } } diff --git a/tests/ImageSharp.Tests/Formats/Tiff/Compression/NoneTiffCompressionTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/Compression/NoneTiffCompressionTests.cs index 50a0b29f3d..dcdd327c27 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/Compression/NoneTiffCompressionTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/Compression/NoneTiffCompressionTests.cs @@ -3,6 +3,8 @@ using System.IO; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression; +using SixLabors.ImageSharp.IO; + using Xunit; namespace SixLabors.ImageSharp.Tests.Formats.Tiff.Compression @@ -13,12 +15,12 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff.Compression [Theory] [InlineData(new byte[] { 10, 15, 20, 25, 30, 35, 40, 45 }, 8, new byte[] { 10, 15, 20, 25, 30, 35, 40, 45 })] [InlineData(new byte[] { 10, 15, 20, 25, 30, 35, 40, 45 }, 5, new byte[] { 10, 15, 20, 25, 30 })] - public void Decompress_ReadsData(byte[] inputData, int byteCount, byte[] expectedResult) + public void Decompress_ReadsData(byte[] inputData, uint byteCount, byte[] expectedResult) { - Stream stream = new MemoryStream(inputData); + var stream = new BufferedReadStream(Configuration.Default, new MemoryStream(inputData)); var buffer = new byte[expectedResult.Length]; - new NoneTiffCompression(null).Decompress(stream, byteCount, buffer); + new NoneTiffCompression(null).Decompress(stream, 0, byteCount, buffer); Assert.Equal(expectedResult, buffer); } diff --git a/tests/ImageSharp.Tests/Formats/Tiff/Compression/PackBitsTiffCompressionTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/Compression/PackBitsTiffCompressionTests.cs index e95e6abbb3..f272c7cb9d 100644 --- a/tests/ImageSharp.Tests/Formats/Tiff/Compression/PackBitsTiffCompressionTests.cs +++ b/tests/ImageSharp.Tests/Formats/Tiff/Compression/PackBitsTiffCompressionTests.cs @@ -5,6 +5,7 @@ using System; using System.IO; using SixLabors.ImageSharp.Formats.Experimental.Tiff.Compression; +using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; using Xunit; @@ -25,10 +26,10 @@ namespace SixLabors.ImageSharp.Tests.Formats.Tiff.Compression [InlineData(new byte[] { 0xFE, 0xAA, 0x02, 0x80, 0x00, 0x2A, 0xFD, 0xAA, 0x03, 0x80, 0x00, 0x2A, 0x22, 0xF7, 0xAA }, new byte[] { 0xAA, 0xAA, 0xAA, 0x80, 0x00, 0x2A, 0xAA, 0xAA, 0xAA, 0xAA, 0x80, 0x00, 0x2A, 0x22, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA })] // Apple PackBits sample public void Decompress_ReadsData(byte[] inputData, byte[] expectedResult) { - Stream stream = new MemoryStream(inputData); + var stream = new BufferedReadStream(Configuration.Default, new MemoryStream(inputData)); var buffer = new byte[expectedResult.Length]; - new PackBitsTiffCompression(new ArrayPoolMemoryAllocator()).Decompress(stream, inputData.Length, buffer); + new PackBitsTiffCompression(new ArrayPoolMemoryAllocator()).Decompress(stream, 0, (uint)inputData.Length, buffer); Assert.Equal(expectedResult, buffer); } diff --git a/tests/ImageSharp.Tests/Formats/Tiff/Utils/SubStreamTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/Utils/SubStreamTests.cs deleted file mode 100644 index 0aefa76cf7..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/Utils/SubStreamTests.cs +++ /dev/null @@ -1,328 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.IO; - -using SixLabors.ImageSharp.Formats.Experimental.Tiff.Utils; - -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Format", "Tiff")] - public class SubStreamTests - { - [Fact] - public void Constructor_PositionsStreamCorrectly_WithSpecifiedOffset() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - innerStream.Position = 2; - - SubStream stream = new SubStream(innerStream, 4, 6); - - Assert.Equal(0, stream.Position); - Assert.Equal(6, stream.Length); - Assert.Equal(4, innerStream.Position); - } - - [Fact] - public void Constructor_PositionsStreamCorrectly_WithCurrentOffset() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - innerStream.Position = 2; - - SubStream stream = new SubStream(innerStream, 6); - - Assert.Equal(0, stream.Position); - Assert.Equal(6, stream.Length); - Assert.Equal(2, innerStream.Position); - } - - [Fact] - public void CanRead_ReturnsTrue() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.True(stream.CanRead); - } - - [Fact] - public void CanWrite_ReturnsFalse() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.False(stream.CanWrite); - } - - [Fact] - public void CanSeek_ReturnsTrue() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.True(stream.CanSeek); - } - - [Fact] - public void Length_ReturnsTheConstrainedLength() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.Equal(6, stream.Length); - } - - [Fact] - public void Position_ReturnsZeroBeforeReading() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.Equal(0, stream.Position); - Assert.Equal(2, innerStream.Position); - } - - [Fact] - public void Position_ReturnsPositionAfterReading() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Read(new byte[2], 0, 2); - - Assert.Equal(2, stream.Position); - Assert.Equal(4, innerStream.Position); - } - - [Fact] - public void Position_ReturnsPositionAfterReadingTwice() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Read(new byte[2], 0, 2); - stream.Read(new byte[2], 0, 2); - - Assert.Equal(4, stream.Position); - Assert.Equal(6, innerStream.Position); - } - - [Fact] - public void Position_SettingPropertySeeksToNewPosition() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 3; - - Assert.Equal(3, stream.Position); - Assert.Equal(5, innerStream.Position); - } - - [Fact] - public void Flush_ThrowsNotSupportedException() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.Throws(() => stream.Flush()); - } - - [Fact] - public void Read_Reads_FromStartOfSubStream() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - byte[] buffer = new byte[3]; - var result = stream.Read(buffer, 0, 3); - - Assert.Equal(new byte[] { 3, 4, 5 }, buffer); - Assert.Equal(3, result); - } - - [Theory] - [InlineData(2, SeekOrigin.Begin)] - [InlineData(1, SeekOrigin.Current)] - [InlineData(4, SeekOrigin.End)] - public void Read_Reads_FromMiddleOfSubStream(long offset, SeekOrigin origin) - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 1; - stream.Seek(offset, origin); - byte[] buffer = new byte[3]; - var result = stream.Read(buffer, 0, 3); - - Assert.Equal(new byte[] { 5, 6, 7 }, buffer); - Assert.Equal(3, result); - } - - [Theory] - [InlineData(3, SeekOrigin.Begin)] - [InlineData(2, SeekOrigin.Current)] - [InlineData(3, SeekOrigin.End)] - public void Read_Reads_FromEndOfSubStream(long offset, SeekOrigin origin) - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 1; - stream.Seek(offset, origin); - byte[] buffer = new byte[3]; - var result = stream.Read(buffer, 0, 3); - - Assert.Equal(new byte[] { 6, 7, 8 }, buffer); - Assert.Equal(3, result); - } - - [Theory] - [InlineData(4, SeekOrigin.Begin)] - [InlineData(3, SeekOrigin.Current)] - [InlineData(2, SeekOrigin.End)] - public void Read_Reads_FromBeyondEndOfSubStream(long offset, SeekOrigin origin) - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 1; - stream.Seek(offset, origin); - byte[] buffer = new byte[3]; - var result = stream.Read(buffer, 0, 3); - - Assert.Equal(new byte[] { 7, 8, 0 }, buffer); - Assert.Equal(2, result); - } - - [Fact] - public void ReadByte_Reads_FromStartOfSubStream() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - var result = stream.ReadByte(); - - Assert.Equal(3, result); - } - - [Fact] - public void ReadByte_Reads_FromMiddleOfSubStream() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 3; - var result = stream.ReadByte(); - - Assert.Equal(6, result); - } - - [Fact] - public void ReadByte_Reads_FromEndOfSubStream() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 5; - var result = stream.ReadByte(); - - Assert.Equal(8, result); - } - - [Fact] - public void ReadByte_Reads_FromBeyondEndOfSubStream() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 5; - stream.ReadByte(); - var result = stream.ReadByte(); - - Assert.Equal(-1, result); - } - - [Fact] - public void Write_ThrowsNotSupportedException() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.Throws(() => stream.Write(new byte[] { 1, 2 }, 0, 2)); - } - - [Fact] - public void WriteByte_ThrowsNotSupportedException() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.Throws(() => stream.WriteByte(42)); - } - - [Fact] - public void Seek_MovesToNewPosition_FromBegin() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 1; - long result = stream.Seek(2, SeekOrigin.Begin); - - Assert.Equal(2, result); - Assert.Equal(2, stream.Position); - Assert.Equal(4, innerStream.Position); - } - - [Fact] - public void Seek_MovesToNewPosition_FromCurrent() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 1; - long result = stream.Seek(2, SeekOrigin.Current); - - Assert.Equal(3, result); - Assert.Equal(3, stream.Position); - Assert.Equal(5, innerStream.Position); - } - - [Fact] - public void Seek_MovesToNewPosition_FromEnd() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - stream.Position = 1; - long result = stream.Seek(2, SeekOrigin.End); - - Assert.Equal(4, result); - Assert.Equal(4, stream.Position); - Assert.Equal(6, innerStream.Position); - } - - [Fact] - public void Seek_ThrowsException_WithInvalidOrigin() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - var e = Assert.Throws(() => stream.Seek(2, (SeekOrigin)99)); - Assert.Equal("Invalid seek origin.", e.Message); - } - - [Fact] - public void SetLength_ThrowsNotSupportedException() - { - Stream innerStream = new MemoryStream(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }); - SubStream stream = new SubStream(innerStream, 2, 6); - - Assert.Throws(() => stream.SetLength(5)); - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/ITiffGenDataSource.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/ITiffGenDataSource.cs deleted file mode 100644 index 4e66879b90..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/ITiffGenDataSource.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - using System.Collections.Generic; - - /// - /// An interface for any class within the Tiff generator that produces data to be included in the file. - /// - internal interface ITiffGenDataSource - { - IEnumerable GetData(bool isLittleEndian); - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenDataBlock.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenDataBlock.cs deleted file mode 100644 index 1dd70b57b1..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenDataBlock.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - using System.Collections.Generic; - - /// - /// A utility data structure to represent an independent block of data in a Tiff file. - /// These may be located in any order within a Tiff file. - /// - internal class TiffGenDataBlock - { - public TiffGenDataBlock(byte[] bytes) - { - this.Bytes = bytes; - this.References = new List(); - } - - public byte[] Bytes { get; } - public IList References { get; } - - public void AddReference(byte[] bytes, int offset) - { - References.Add(new TiffGenDataReference(bytes, offset)); - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenDataReference.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenDataReference.cs deleted file mode 100644 index 4c044ac523..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenDataReference.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - /// - /// A utility data structure to represent a reference from one block of data to another in a Tiff file. - /// - internal class TiffGenDataReference - { - public TiffGenDataReference(byte[] bytes, int offset) - { - this.Bytes = bytes; - this.Offset = offset; - } - - public byte[] Bytes { get; } - public int Offset { get; } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenEntry.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenEntry.cs deleted file mode 100644 index a652ba01bd..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenEntry.cs +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; - using ImageSharp.Formats.Tiff; - - /// - /// A utility data structure to represent Tiff IFD entries in unit tests. - /// - internal abstract class TiffGenEntry : ITiffGenDataSource - { - private TiffGenEntry(ushort tag, TiffType type, uint count) - { - this.Tag = tag; - this.Type = type; - this.Count = count; - } - - public uint Count { get; } - public ushort Tag { get; } - public TiffType Type { get; } - - public abstract IEnumerable GetData(bool isLittleEndian); - - public static TiffGenEntry Ascii(ushort tag, string value) - { - return new TiffGenEntryAscii(tag, value); - } - - public static TiffGenEntry Bytes(ushort tag, TiffType type, uint count, byte[] value) - { - return new TiffGenEntryBytes(tag, type, count, value); - } - - public static TiffGenEntry Integer(ushort tag, TiffType type, int value) - { - return TiffGenEntry.Integer(tag, type, new int[] { value }); - } - - public static TiffGenEntry Integer(ushort tag, TiffType type, int[] value) - { - if (type != TiffType.Byte && type != TiffType.Short && type != TiffType.Long && - type != TiffType.SByte && type != TiffType.SShort && type != TiffType.SLong) - throw new ArgumentException(nameof(type), "The specified type is not an integer type."); - - return new TiffGenEntryInteger(tag, type, value); - } - - public static TiffGenEntry Integer(ushort tag, TiffType type, uint value) - { - return TiffGenEntry.Integer(tag, type, new uint[] { value }); - } - - public static TiffGenEntry Integer(ushort tag, TiffType type, uint[] value) - { - if (type != TiffType.Byte && type != TiffType.Short && type != TiffType.Long && - type != TiffType.SByte && type != TiffType.SShort && type != TiffType.SLong) - throw new ArgumentException(nameof(type), "The specified type is not an integer type."); - - return new TiffGenEntryUnsignedInteger(tag, type, value); - } - - public static TiffGenEntry Rational(ushort tag, uint numerator, uint denominator) - { - return new TiffGenEntryRational(tag, numerator, denominator); - } - - private class TiffGenEntryAscii : TiffGenEntry - { - public TiffGenEntryAscii(ushort tag, string value) : base(tag, TiffType.Ascii, (uint)GetBytes(value).Length) - { - this.Value = value; - } - - public string Value { get; } - - public override IEnumerable GetData(bool isLittleEndian) - { - byte[] bytes = GetBytes(Value); - return new[] { new TiffGenDataBlock(bytes) }; - } - - private static byte[] GetBytes(string value) - { - return Encoding.ASCII.GetBytes($"{value}\0"); - } - } - - private class TiffGenEntryBytes : TiffGenEntry - { - public TiffGenEntryBytes(ushort tag, TiffType type, uint count, byte[] value) : base(tag, type, count) - { - this.Value = value; - } - - public byte[] Value { get; } - - public override IEnumerable GetData(bool isLittleEndian) - { - return new[] { new TiffGenDataBlock(Value) }; - } - } - - private class TiffGenEntryInteger : TiffGenEntry - { - public TiffGenEntryInteger(ushort tag, TiffType type, int[] value) : base(tag, type, (uint)value.Length) - { - this.Value = value; - } - - public int[] Value { get; } - - public override IEnumerable GetData(bool isLittleEndian) - { - byte[] bytes = GetBytes().SelectMany(b => b.WithByteOrder(isLittleEndian)).ToArray(); - return new[] { new TiffGenDataBlock(bytes) }; - } - - private IEnumerable GetBytes() - { - switch (Type) - { - case TiffType.Byte: - return Value.Select(i => new byte[] { (byte)i }); - case TiffType.Short: - return Value.Select(i => BitConverter.GetBytes((ushort)i)); - case TiffType.Long: - return Value.Select(i => BitConverter.GetBytes((uint)i)); - case TiffType.SByte: - return Value.Select(i => BitConverter.GetBytes((sbyte)i)); - case TiffType.SShort: - return Value.Select(i => BitConverter.GetBytes((short)i)); - case TiffType.SLong: - return Value.Select(i => BitConverter.GetBytes((int)i)); - default: - throw new InvalidOperationException(); - } - } - } - - private class TiffGenEntryUnsignedInteger : TiffGenEntry - { - public TiffGenEntryUnsignedInteger(ushort tag, TiffType type, uint[] value) : base(tag, type, (uint)value.Length) - { - this.Value = value; - } - - public uint[] Value { get; } - - public override IEnumerable GetData(bool isLittleEndian) - { - byte[] bytes = GetBytes().SelectMany(b => b.WithByteOrder(isLittleEndian)).ToArray(); - return new[] { new TiffGenDataBlock(bytes) }; - } - - private IEnumerable GetBytes() - { - switch (Type) - { - case TiffType.Byte: - return Value.Select(i => new byte[] { (byte)i }); - case TiffType.Short: - return Value.Select(i => BitConverter.GetBytes((ushort)i)); - case TiffType.Long: - return Value.Select(i => BitConverter.GetBytes((uint)i)); - case TiffType.SByte: - return Value.Select(i => BitConverter.GetBytes((sbyte)i)); - case TiffType.SShort: - return Value.Select(i => BitConverter.GetBytes((short)i)); - case TiffType.SLong: - return Value.Select(i => BitConverter.GetBytes((int)i)); - default: - throw new InvalidOperationException(); - } - } - } - - private class TiffGenEntryRational : TiffGenEntry - { - public TiffGenEntryRational(ushort tag, uint numerator, uint denominator) : base(tag, TiffType.Rational, 1u) - { - this.Numerator = numerator; - this.Denominator = denominator; - } - - public uint Numerator { get; } - - public uint Denominator { get; } - - public override IEnumerable GetData(bool isLittleEndian) - { - byte[] numeratorBytes = BitConverter.GetBytes(Numerator).WithByteOrder(isLittleEndian); - byte[] denominatorBytes = BitConverter.GetBytes(Denominator).WithByteOrder(isLittleEndian); - byte[] bytes = Enumerable.Concat(numeratorBytes, denominatorBytes).ToArray(); - return new[] { new TiffGenDataBlock(bytes) }; - } - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenExtensions.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenExtensions.cs deleted file mode 100644 index edef6c0641..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenExtensions.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - using System; - using System.IO; - using System.Linq; - - /// - /// A utility class for generating in-memory Tiff files for use in unit tests. - /// - internal static class TiffGenExtensions - { - public static byte[] ToBytes(this ITiffGenDataSource dataSource, bool isLittleEndian) - { - var dataBlocks = dataSource.GetData(isLittleEndian); - - int offset = 0; - - foreach (var dataBlock in dataBlocks) - { - byte[] offsetBytes = BitConverter.GetBytes(offset).WithByteOrder(isLittleEndian); - - foreach (var reference in dataBlock.References) - { - reference.Bytes[reference.Offset + 0] = offsetBytes[0]; - reference.Bytes[reference.Offset + 1] = offsetBytes[1]; - reference.Bytes[reference.Offset + 2] = offsetBytes[2]; - reference.Bytes[reference.Offset + 3] = offsetBytes[3]; - } - - offset += dataBlock.Bytes.Length; - } - - return dataBlocks.SelectMany(b => b.Bytes).ToArray(); - } - - public static Stream ToStream(this ITiffGenDataSource dataSource, bool isLittleEndian) - { - var bytes = dataSource.ToBytes(isLittleEndian); - return new MemoryStream(bytes); - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenHeader.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenHeader.cs deleted file mode 100644 index be2784fca2..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenHeader.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - using System.Collections.Generic; - using System.Linq; - - /// - /// A utility data structure to represent a Tiff file-header. - /// - internal class TiffGenHeader : ITiffGenDataSource - { - public TiffGenHeader() - { - this.MagicNumber = 42; - } - - public ushort? ByteOrderMarker { get; set; } - public ushort MagicNumber { get; set; } - public TiffGenIfd FirstIfd { get; set; } - - public IEnumerable GetData(bool isLittleEndian) - { - ByteBuffer bytes = new ByteBuffer(isLittleEndian); - - bytes.AddUInt16(ByteOrderMarker ?? (isLittleEndian ? (ushort)0x4949 : (ushort)0x4D4D)); - bytes.AddUInt16(MagicNumber); - bytes.AddUInt32(0); - - var headerData = new TiffGenDataBlock(bytes.ToArray()); - - if (FirstIfd != null) - { - var firstIfdData = FirstIfd.GetData(isLittleEndian); - firstIfdData.First().AddReference(headerData.Bytes, 4); - return new[] { headerData }.Concat(firstIfdData); - } - else - { - return new[] { headerData }; - } - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenIfd.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenIfd.cs deleted file mode 100644 index 99ef0d1339..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenIfd.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - using System; - using System.Collections.Generic; - using System.Linq; - - /// - /// A utility data structure to represent Tiff IFDs in unit tests. - /// - internal class TiffGenIfd : ITiffGenDataSource - { - public TiffGenIfd() - { - this.Entries = new List(); - } - - public List Entries { get; } - public TiffGenIfd NextIfd { get; set; } - - public IEnumerable GetData(bool isLittleEndian) - { - ByteBuffer bytes = new ByteBuffer(isLittleEndian); - List dataBlocks = new List(); - List> entryReferences = new List>(); - - // Add the entry count - - bytes.AddUInt16((ushort)Entries.Count); - - // Add all IFD entries - - int entryOffset = 2; - - foreach (var entry in Entries) - { - var entryData = entry.GetData(isLittleEndian); - var entryBytes = entryData.First().Bytes; - - bytes.AddUInt16(entry.Tag); - bytes.AddUInt16((ushort)entry.Type); - bytes.AddUInt32(entry.Count); - - if (entryBytes.Length <=4) - { - bytes.AddByte(entryBytes.Length > 0 ? entryBytes[0] : (byte)0); - bytes.AddByte(entryBytes.Length > 1 ? entryBytes[1] : (byte)0); - bytes.AddByte(entryBytes.Length > 2 ? entryBytes[2] : (byte)0); - bytes.AddByte(entryBytes.Length > 3 ? entryBytes[3] : (byte)0); - - dataBlocks.AddRange(entryData.Skip(1)); - } - else - { - bytes.AddUInt32(0); - dataBlocks.AddRange(entryData); - entryReferences.Add(Tuple.Create(entryData.First(), entryOffset + 8)); - } - - entryOffset += 12; - } - - // Add reference to next IFD - - bytes.AddUInt32(0); - - // Build the data - - var ifdData = new TiffGenDataBlock(bytes.ToArray()); - - foreach (var entryReference in entryReferences) - { - entryReference.Item1.AddReference(ifdData.Bytes, entryReference.Item2); - } - - IEnumerable nextIfdData = new TiffGenDataBlock[0]; - if (NextIfd != null) - { - nextIfdData = NextIfd.GetData(isLittleEndian); - nextIfdData.First().AddReference(ifdData.Bytes, ifdData.Bytes.Length - 4); - } - - return new [] { ifdData }.Concat(dataBlocks).Concat(nextIfdData); - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenIfdExtensions.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenIfdExtensions.cs deleted file mode 100644 index bfa74c3d0f..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffGenIfdExtensions.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - using System.Linq; - - /// - /// A utility class for manipulating in-memory Tiff files for use in unit tests. - /// - internal static class TiffGenIfdExtensions - { - public static TiffGenIfd WithoutEntry(this TiffGenIfd ifd, ushort tag) - { - TiffGenEntry entry = ifd.Entries.FirstOrDefault(e => e.Tag == tag); - if (entry != null) - { - ifd.Entries.Remove(entry); - } - return ifd; - } - - public static TiffGenIfd WithEntry(this TiffGenIfd ifd, TiffGenEntry entry) - { - ifd.WithoutEntry(entry.Tag); - ifd.Entries.Add(entry); - - return ifd; - } - } -} \ No newline at end of file diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffIfdParser.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffIfdParser.cs deleted file mode 100644 index 51890204f0..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TestUtilities/Tiff/TiffIfdParser.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.ImageSharp.Tests -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Text; - using ImageSharp.Formats.Tiff; - - using SixLabors.ImageSharp.Metadata.Profiles.Exif; - using Xunit; - - /// - /// A utility data structure to decode Tiff IFD entries in unit tests. - /// - internal static class TiffIfdParser - { - public static int? GetInteger(this List entries, ushort tag) - { - TiffIfdEntry entry = entries.FirstOrDefault(e => e.Tag == tag); - - if (entry.Tag == 0) - return null; - - Assert.Equal(1u, entry.Count); - - switch (entry.Type) - { - case TiffType.Byte: - return entry.Value[0]; - case TiffType.SByte: - return (sbyte)entry.Value[0]; - case TiffType.Short: - return BitConverter.ToUInt16(entry.Value, 0); - case TiffType.SShort: - return BitConverter.ToInt16(entry.Value, 0); - case TiffType.Long: - return (int)BitConverter.ToUInt32(entry.Value, 0); - case TiffType.SLong: - return BitConverter.ToInt32(entry.Value, 0); - default: - Assert.True(1 == 1, "TIFF IFD entry is not convertable to an integer."); - return null; - } - } - - public static Rational? GetUnsignedRational(this List entries, ushort tag) - { - TiffIfdEntry entry = entries.FirstOrDefault(e => e.Tag == tag); - - if (entry.Tag == 0) - return null; - - Assert.Equal(TiffType.Rational, entry.Type); - Assert.Equal(1u, entry.Count); - - uint numerator = BitConverter.ToUInt32(entry.Value, 0); - uint denominator = BitConverter.ToUInt32(entry.Value, 4); - - return new Rational(numerator, denominator); - } - - public static string GetAscii(this List entries, ushort tag) - { - TiffIfdEntry entry = entries.FirstOrDefault(e => e.Tag == tag); - - if (entry.Tag == 0) - return null; - - Assert.Equal(TiffType.Ascii, entry.Type); - - return Encoding.UTF8.GetString(entry.Value, 0, (int)entry.Count); - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderHeaderTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderHeaderTests.cs deleted file mode 100644 index 275da7da1e..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderHeaderTests.cs +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System.IO; -using SixLabors.ImageSharp.Formats.Tiff; -using SixLabors.ImageSharp.PixelFormats; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffDecoderHeaderTests - { - public static object[][] IsLittleEndianValues = new[] { new object[] { false }, - new object[] { true } }; - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadHeader_ReadsEndianness(bool isLittleEndian) - { - Stream stream = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd() - } - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, false, null, null); - - decoder.ReadHeader(); - - Assert.Equal(isLittleEndian, decoder.IsLittleEndian); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadHeader_ReadsFirstIfdOffset(bool isLittleEndian) - { - Stream stream = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd() - } - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, false, null, null); - - uint firstIfdOffset = decoder.ReadHeader(); - - Assert.Equal(8u, firstIfdOffset); - } - - [Theory] - [InlineData(0x1234)] - [InlineData(0x4912)] - [InlineData(0x1249)] - [InlineData(0x4D12)] - [InlineData(0x124D)] - [InlineData(0x494D)] - [InlineData(0x4D49)] - public void Decode_ThrowsException_WithInvalidByteOrderMarkers(ushort byteOrderMarker) - { - Stream stream = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd(), - ByteOrderMarker = byteOrderMarker - } - .ToStream(true); - - TiffDecoder decoder = new TiffDecoder(); - - ImageFormatException e = Assert.Throws(() => { decoder.Decode(Configuration.Default, stream); }); - - Assert.Equal("Invalid TIFF file header.", e.Message); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void Decode_ThrowsException_WithIncorrectMagicNumber(bool isLittleEndian) - { - Stream stream = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd(), - MagicNumber = 32 - } - .ToStream(isLittleEndian); - - TiffDecoder decoder = new TiffDecoder(); - - ImageFormatException e = Assert.Throws(() => { decoder.Decode(Configuration.Default, stream); }); - - Assert.Equal("Invalid TIFF file header.", e.Message); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void Decode_ThrowsException_WithNoIfdZero(bool isLittleEndian) - { - Stream stream = new TiffGenHeader() - { - FirstIfd = null - } - .ToStream(isLittleEndian); - - TiffDecoder decoder = new TiffDecoder(); - - ImageFormatException e = Assert.Throws(() => { decoder.Decode(Configuration.Default, stream); }); - - Assert.Equal("Invalid TIFF file header.", e.Message); - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderIfdEntryTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderIfdEntryTests.cs deleted file mode 100644 index f8d41cb864..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderIfdEntryTests.cs +++ /dev/null @@ -1,842 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.IO; -using System.Linq; -using SixLabors.ImageSharp.Formats.Tiff; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffDecoderIfdEntryTests - { - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte, 1u, 1u)] - [InlineDataAttribute((ushort)TiffType.Ascii, 1u, 1u)] - [InlineDataAttribute((ushort)TiffType.Short, 1u, 2u)] - [InlineDataAttribute((ushort)TiffType.Long, 1u, 4u)] - [InlineDataAttribute((ushort)TiffType.Rational, 1u, 8u)] - [InlineDataAttribute((ushort)TiffType.SByte, 1u, 1u)] - [InlineDataAttribute((ushort)TiffType.Undefined, 1u, 1u)] - [InlineDataAttribute((ushort)TiffType.SShort, 1u, 2u)] - [InlineDataAttribute((ushort)TiffType.SLong, 1u, 4u)] - [InlineDataAttribute((ushort)TiffType.SRational, 1u, 8u)] - [InlineDataAttribute((ushort)TiffType.Float, 1u, 4u)] - [InlineDataAttribute((ushort)TiffType.Double, 1u, 8u)] - [InlineDataAttribute((ushort)TiffType.Ifd, 1u, 4u)] - [InlineDataAttribute((ushort)999, 1u, 0u)] - public void GetSizeOfData_SingleItem_ReturnsCorrectSize(ushort type, uint count, uint expectedSize) - { - TiffIfdEntry entry = new TiffIfdEntry(TiffTags.ImageWidth, (TiffType)type, count, new byte[4]); - uint size = TiffDecoderCore.GetSizeOfData(entry); - Assert.Equal(expectedSize, size); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte, 15u, 15u)] - [InlineDataAttribute((ushort)TiffType.Ascii, 20u, 20u)] - [InlineDataAttribute((ushort)TiffType.Short, 18u, 36u)] - [InlineDataAttribute((ushort)TiffType.Long, 4u, 16u)] - [InlineDataAttribute((ushort)TiffType.Rational, 9u, 72u)] - [InlineDataAttribute((ushort)TiffType.SByte, 5u, 5u)] - [InlineDataAttribute((ushort)TiffType.Undefined, 136u, 136u)] - [InlineDataAttribute((ushort)TiffType.SShort, 12u, 24u)] - [InlineDataAttribute((ushort)TiffType.SLong, 15u, 60u)] - [InlineDataAttribute((ushort)TiffType.SRational, 10u, 80u)] - [InlineDataAttribute((ushort)TiffType.Float, 2u, 8u)] - [InlineDataAttribute((ushort)TiffType.Double, 2u, 16u)] - [InlineDataAttribute((ushort)TiffType.Ifd, 10u, 40u)] - [InlineDataAttribute((ushort)999, 1050u, 0u)] - public void GetSizeOfData_Array_ReturnsCorrectSize(ushort type, uint count, uint expectedSize) - { - TiffIfdEntry entry = new TiffIfdEntry(TiffTags.ImageWidth, (TiffType)type, count, new byte[4]); - uint size = TiffDecoderCore.GetSizeOfData(entry); - Assert.Equal(expectedSize, size); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte, 1u, new byte[] { 17 }, false)] - [InlineDataAttribute((ushort)TiffType.Byte, 1u, new byte[] { 17 }, true)] - [InlineDataAttribute((ushort)TiffType.Byte, 2u, new byte[] { 17, 28 }, false)] - [InlineDataAttribute((ushort)TiffType.Byte, 2u, new byte[] { 17, 28 }, true)] - [InlineDataAttribute((ushort)TiffType.Byte, 4u, new byte[] { 17, 28, 2, 9 }, false)] - [InlineDataAttribute((ushort)TiffType.Byte, 4u, new byte[] { 17, 28, 2, 9 }, true)] - [InlineDataAttribute((ushort)TiffType.Byte, 5u, new byte[] { 17, 28, 2, 9, 13 }, false)] - [InlineDataAttribute((ushort)TiffType.Byte, 5u, new byte[] { 17, 28, 2, 9, 13 }, true)] - [InlineDataAttribute((ushort)TiffType.Byte, 10u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2, 127, 86 }, false)] - [InlineDataAttribute((ushort)TiffType.Byte, 10u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2, 127, 86 }, true)] - [InlineDataAttribute((ushort)TiffType.Short, 1u, new byte[] { 17, 28 }, false)] - [InlineDataAttribute((ushort)TiffType.Short, 1u, new byte[] { 17, 28 }, true)] - [InlineDataAttribute((ushort)TiffType.Short, 2u, new byte[] { 17, 28, 2, 9 }, false)] - [InlineDataAttribute((ushort)TiffType.Short, 2u, new byte[] { 17, 28, 2, 9 }, true)] - [InlineDataAttribute((ushort)TiffType.Short, 3u, new byte[] { 17, 28, 2, 9, 13, 37 }, false)] - [InlineDataAttribute((ushort)TiffType.Short, 3u, new byte[] { 17, 28, 2, 9, 13, 37 }, true)] - [InlineDataAttribute((ushort)TiffType.Long, 1u, new byte[] { 17, 28, 2, 9 }, false)] - [InlineDataAttribute((ushort)TiffType.Long, 1u, new byte[] { 17, 28, 2, 9 }, true)] - [InlineDataAttribute((ushort)TiffType.Long, 2u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, false)] - [InlineDataAttribute((ushort)TiffType.Long, 2u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, true)] - [InlineDataAttribute((ushort)TiffType.Rational, 1u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, false)] - [InlineDataAttribute((ushort)TiffType.Rational, 1u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, true)] - public void ReadBytes_ReturnsExpectedData(ushort type, uint count, byte[] bytes, bool isLittleEndian) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, count, bytes), isLittleEndian); - - byte[] result = decoder.ReadBytes(ref entry); - - if (bytes.Length < 4) - result = result.Take(bytes.Length).ToArray(); - - Assert.Equal(bytes, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte, 5u, new byte[] { 17, 28, 2, 9, 13 }, false)] - [InlineDataAttribute((ushort)TiffType.Byte, 5u, new byte[] { 17, 28, 2, 9, 13 }, true)] - [InlineDataAttribute((ushort)TiffType.Byte, 10u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2, 127, 86 }, false)] - [InlineDataAttribute((ushort)TiffType.Byte, 10u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2, 127, 86 }, true)] - [InlineDataAttribute((ushort)TiffType.Short, 3u, new byte[] { 17, 28, 2, 9, 13, 37 }, false)] - [InlineDataAttribute((ushort)TiffType.Short, 3u, new byte[] { 17, 28, 2, 9, 13, 37 }, true)] - [InlineDataAttribute((ushort)TiffType.Long, 2u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, false)] - [InlineDataAttribute((ushort)TiffType.Long, 2u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, true)] - [InlineDataAttribute((ushort)TiffType.Rational, 1u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, false)] - [InlineDataAttribute((ushort)TiffType.Rational, 1u, new byte[] { 17, 28, 2, 9, 13, 37, 18, 2 }, true)] - public void ReadBytes_CachesDataLongerThanFourBytes(ushort type, uint count, byte[] bytes, bool isLittleEndian) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, count, bytes), isLittleEndian); - - Assert.Equal(4, entry.Value.Length); - - byte[] result = decoder.ReadBytes(ref entry); - - Assert.Equal(bytes.Length, entry.Value.Length); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte, true, new byte[] { 0, 1, 2, 3 }, 0)] - [InlineDataAttribute((ushort)TiffType.Byte, true, new byte[] { 1, 2, 3, 4 }, 1)] - [InlineDataAttribute((ushort)TiffType.Byte, true, new byte[] { 255, 2, 3, 4 }, 255)] - [InlineDataAttribute((ushort)TiffType.Byte, false, new byte[] { 0, 1, 2, 3 }, 0)] - [InlineDataAttribute((ushort)TiffType.Byte, false, new byte[] { 1, 2, 3, 4 }, 1)] - [InlineDataAttribute((ushort)TiffType.Byte, false, new byte[] { 255, 2, 3, 4 }, 255)] - [InlineDataAttribute((ushort)TiffType.Short, true, new byte[] { 0, 0, 2, 3 }, 0)] - [InlineDataAttribute((ushort)TiffType.Short, true, new byte[] { 1, 0, 2, 3 }, 1)] - [InlineDataAttribute((ushort)TiffType.Short, true, new byte[] { 0, 1, 2, 3 }, 256)] - [InlineDataAttribute((ushort)TiffType.Short, true, new byte[] { 2, 1, 2, 3 }, 258)] - [InlineDataAttribute((ushort)TiffType.Short, true, new byte[] { 255, 255, 2, 3 }, UInt16.MaxValue)] - [InlineDataAttribute((ushort)TiffType.Short, false, new byte[] { 0, 0, 2, 3 }, 0)] - [InlineDataAttribute((ushort)TiffType.Short, false, new byte[] { 0, 1, 2, 3 }, 1)] - [InlineDataAttribute((ushort)TiffType.Short, false, new byte[] { 1, 0, 2, 3 }, 256)] - [InlineDataAttribute((ushort)TiffType.Short, false, new byte[] { 1, 2, 2, 3 }, 258)] - [InlineDataAttribute((ushort)TiffType.Short, false, new byte[] { 255, 255, 2, 3 }, UInt16.MaxValue)] - [InlineDataAttribute((ushort)TiffType.Long, true, new byte[] { 0, 0, 0, 0 }, 0)] - [InlineDataAttribute((ushort)TiffType.Long, true, new byte[] { 1, 0, 0, 0 }, 1)] - [InlineDataAttribute((ushort)TiffType.Long, true, new byte[] { 0, 1, 0, 0 }, 256)] - [InlineDataAttribute((ushort)TiffType.Long, true, new byte[] { 0, 0, 1, 0 }, 256 * 256)] - [InlineDataAttribute((ushort)TiffType.Long, true, new byte[] { 0, 0, 0, 1 }, 256 * 256 * 256)] - [InlineDataAttribute((ushort)TiffType.Long, true, new byte[] { 1, 2, 3, 4 }, 67305985)] - [InlineDataAttribute((ushort)TiffType.Long, true, new byte[] { 255, 255, 255, 255 }, UInt32.MaxValue)] - [InlineDataAttribute((ushort)TiffType.Long, false, new byte[] { 0, 0, 0, 0 }, 0)] - [InlineDataAttribute((ushort)TiffType.Long, false, new byte[] { 0, 0, 0, 1 }, 1)] - [InlineDataAttribute((ushort)TiffType.Long, false, new byte[] { 0, 0, 1, 0 }, 256)] - [InlineDataAttribute((ushort)TiffType.Long, false, new byte[] { 0, 1, 0, 0 }, 256 * 256)] - [InlineDataAttribute((ushort)TiffType.Long, false, new byte[] { 1, 0, 0, 0 }, 256 * 256 * 256)] - [InlineDataAttribute((ushort)TiffType.Long, false, new byte[] { 4, 3, 2, 1 }, 67305985)] - [InlineDataAttribute((ushort)TiffType.Long, false, new byte[] { 255, 255, 255, 255 }, UInt32.MaxValue)] - public void ReadUnsignedInteger_ReturnsValue(ushort type, bool isLittleEndian, byte[] bytes, uint expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, bytes), isLittleEndian); - - uint result = decoder.ReadUnsignedInteger(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadUnsignedInteger_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadUnsignedInteger(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to an unsigned integer.", e.Message); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte, true)] - [InlineDataAttribute((ushort)TiffType.Short, true)] - [InlineDataAttribute((ushort)TiffType.Long, true)] - [InlineDataAttribute((ushort)TiffType.Byte, false)] - [InlineDataAttribute((ushort)TiffType.Short, false)] - [InlineDataAttribute((ushort)TiffType.Long, false)] - public void ReadUnsignedInteger_ThrowsExceptionIfCountIsNotOne(ushort type, bool isLittleEndian) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 2, new byte[4]), isLittleEndian); - - var e = Assert.Throws(() => decoder.ReadUnsignedInteger(ref entry)); - - Assert.Equal($"Cannot read a single value from an array of multiple items.", e.Message); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.SByte, true, new byte[] { 0, 1, 2, 3 }, 0)] - [InlineDataAttribute((ushort)TiffType.SByte, true, new byte[] { 1, 2, 3, 4 }, 1)] - [InlineDataAttribute((ushort)TiffType.SByte, true, new byte[] { 255, 2, 3, 4 }, -1)] - [InlineDataAttribute((ushort)TiffType.SByte, false, new byte[] { 0, 1, 2, 3 }, 0)] - [InlineDataAttribute((ushort)TiffType.SByte, false, new byte[] { 1, 2, 3, 4 }, 1)] - [InlineDataAttribute((ushort)TiffType.SByte, false, new byte[] { 255, 2, 3, 4 }, -1)] - [InlineDataAttribute((ushort)TiffType.SShort, true, new byte[] { 0, 0, 2, 3 }, 0)] - [InlineDataAttribute((ushort)TiffType.SShort, true, new byte[] { 1, 0, 2, 3 }, 1)] - [InlineDataAttribute((ushort)TiffType.SShort, true, new byte[] { 0, 1, 2, 3 }, 256)] - [InlineDataAttribute((ushort)TiffType.SShort, true, new byte[] { 2, 1, 2, 3 }, 258)] - [InlineDataAttribute((ushort)TiffType.SShort, true, new byte[] { 255, 255, 2, 3 }, -1)] - [InlineDataAttribute((ushort)TiffType.SShort, false, new byte[] { 0, 0, 2, 3 }, 0)] - [InlineDataAttribute((ushort)TiffType.SShort, false, new byte[] { 0, 1, 2, 3 }, 1)] - [InlineDataAttribute((ushort)TiffType.SShort, false, new byte[] { 1, 0, 2, 3 }, 256)] - [InlineDataAttribute((ushort)TiffType.SShort, false, new byte[] { 1, 2, 2, 3 }, 258)] - [InlineDataAttribute((ushort)TiffType.SShort, false, new byte[] { 255, 255, 2, 3 }, -1)] - [InlineDataAttribute((ushort)TiffType.SLong, true, new byte[] { 0, 0, 0, 0 }, 0)] - [InlineDataAttribute((ushort)TiffType.SLong, true, new byte[] { 1, 0, 0, 0 }, 1)] - [InlineDataAttribute((ushort)TiffType.SLong, true, new byte[] { 0, 1, 0, 0 }, 256)] - [InlineDataAttribute((ushort)TiffType.SLong, true, new byte[] { 0, 0, 1, 0 }, 256 * 256)] - [InlineDataAttribute((ushort)TiffType.SLong, true, new byte[] { 0, 0, 0, 1 }, 256 * 256 * 256)] - [InlineDataAttribute((ushort)TiffType.SLong, true, new byte[] { 1, 2, 3, 4 }, 67305985)] - [InlineDataAttribute((ushort)TiffType.SLong, true, new byte[] { 255, 255, 255, 255 }, -1)] - [InlineDataAttribute((ushort)TiffType.SLong, false, new byte[] { 0, 0, 0, 0 }, 0)] - [InlineDataAttribute((ushort)TiffType.SLong, false, new byte[] { 0, 0, 0, 1 }, 1)] - [InlineDataAttribute((ushort)TiffType.SLong, false, new byte[] { 0, 0, 1, 0 }, 256)] - [InlineDataAttribute((ushort)TiffType.SLong, false, new byte[] { 0, 1, 0, 0 }, 256 * 256)] - [InlineDataAttribute((ushort)TiffType.SLong, false, new byte[] { 1, 0, 0, 0 }, 256 * 256 * 256)] - [InlineDataAttribute((ushort)TiffType.SLong, false, new byte[] { 4, 3, 2, 1 }, 67305985)] - [InlineDataAttribute((ushort)TiffType.SLong, false, new byte[] { 255, 255, 255, 255 }, -1)] - public void ReadSignedInteger_ReturnsValue(ushort type, bool isLittleEndian, byte[] bytes, int expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, bytes), isLittleEndian); - - int result = decoder.ReadSignedInteger(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadSignedInteger_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadSignedInteger(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a signed integer.", e.Message); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.SByte, true)] - [InlineDataAttribute((ushort)TiffType.SShort, true)] - [InlineDataAttribute((ushort)TiffType.SLong, true)] - [InlineDataAttribute((ushort)TiffType.SByte, false)] - [InlineDataAttribute((ushort)TiffType.SShort, false)] - [InlineDataAttribute((ushort)TiffType.SLong, false)] - public void ReadSignedInteger_ThrowsExceptionIfCountIsNotOne(ushort type, bool isLittleEndian) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 2, new byte[4]), isLittleEndian); - - var e = Assert.Throws(() => decoder.ReadSignedInteger(ref entry)); - - Assert.Equal($"Cannot read a single value from an array of multiple items.", e.Message); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte, 1, true, new byte[] { 0, 1, 2, 3 }, new uint[] { 0 })] - [InlineDataAttribute((ushort)TiffType.Byte, 3, true, new byte[] { 0, 1, 2, 3 }, new uint[] { 0, 1, 2 })] - [InlineDataAttribute((ushort)TiffType.Byte, 7, true, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, new uint[] { 0, 1, 2, 3, 4, 5, 6 })] - [InlineDataAttribute((ushort)TiffType.Byte, 1, false, new byte[] { 0, 1, 2, 3 }, new uint[] { 0 })] - [InlineDataAttribute((ushort)TiffType.Byte, 3, false, new byte[] { 0, 1, 2, 3 }, new uint[] { 0, 1, 2 })] - [InlineDataAttribute((ushort)TiffType.Byte, 7, false, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, new uint[] { 0, 1, 2, 3, 4, 5, 6 })] - [InlineDataAttribute((ushort)TiffType.Short, 1, true, new byte[] { 1, 0, 3, 2 }, new uint[] { 1 })] - [InlineDataAttribute((ushort)TiffType.Short, 2, true, new byte[] { 1, 0, 3, 2 }, new uint[] { 1, 515 })] - [InlineDataAttribute((ushort)TiffType.Short, 3, true, new byte[] { 1, 0, 3, 2, 5, 4, 6, 7, 8 }, new uint[] { 1, 515, 1029 })] - [InlineDataAttribute((ushort)TiffType.Short, 1, false, new byte[] { 0, 1, 2, 3 }, new uint[] { 1 })] - [InlineDataAttribute((ushort)TiffType.Short, 2, false, new byte[] { 0, 1, 2, 3 }, new uint[] { 1, 515 })] - [InlineDataAttribute((ushort)TiffType.Short, 3, false, new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8 }, new uint[] { 1, 515, 1029 })] - [InlineDataAttribute((ushort)TiffType.Long, 1, true, new byte[] { 4, 3, 2, 1 }, new uint[] { 0x01020304 })] - [InlineDataAttribute((ushort)TiffType.Long, 2, true, new byte[] { 4, 3, 2, 1, 6, 5, 4, 3, 99, 99 }, new uint[] { 0x01020304, 0x03040506 })] - [InlineDataAttribute((ushort)TiffType.Long, 1, false, new byte[] { 1, 2, 3, 4 }, new uint[] { 0x01020304 })] - [InlineDataAttribute((ushort)TiffType.Long, 2, false, new byte[] { 1, 2, 3, 4, 3, 4, 5, 6, 99, 99 }, new uint[] { 0x01020304, 0x03040506 })] - public void ReadUnsignedIntegerArray_ReturnsValue(ushort type, int count, bool isLittleEndian, byte[] bytes, uint[] expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, (uint)expectedValue.Length, bytes), isLittleEndian); - - uint[] result = decoder.ReadUnsignedIntegerArray(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadUnsignedIntegerArray_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadUnsignedIntegerArray(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to an unsigned integer.", e.Message); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.SByte, 1, true, new byte[] { 0, 1, 2, 3 }, new int[] { 0 })] - [InlineDataAttribute((ushort)TiffType.SByte, 3, true, new byte[] { 0, 255, 2, 3 }, new int[] { 0, -1, 2 })] - [InlineDataAttribute((ushort)TiffType.SByte, 7, true, new byte[] { 0, 255, 2, 3, 4, 5, 6, 7, 8 }, new int[] { 0, -1, 2, 3, 4, 5, 6 })] - [InlineDataAttribute((ushort)TiffType.SByte, 1, false, new byte[] { 0, 1, 2, 3 }, new int[] { 0 })] - [InlineDataAttribute((ushort)TiffType.SByte, 3, false, new byte[] { 0, 255, 2, 3 }, new int[] { 0, -1, 2 })] - [InlineDataAttribute((ushort)TiffType.SByte, 7, false, new byte[] { 0, 255, 2, 3, 4, 5, 6, 7, 8 }, new int[] { 0, -1, 2, 3, 4, 5, 6 })] - [InlineDataAttribute((ushort)TiffType.SShort, 1, true, new byte[] { 1, 0, 3, 2 }, new int[] { 1 })] - [InlineDataAttribute((ushort)TiffType.SShort, 2, true, new byte[] { 1, 0, 255, 255 }, new int[] { 1, -1 })] - [InlineDataAttribute((ushort)TiffType.SShort, 3, true, new byte[] { 1, 0, 255, 255, 5, 4, 6, 7, 8 }, new int[] { 1, -1, 1029 })] - [InlineDataAttribute((ushort)TiffType.SShort, 1, false, new byte[] { 0, 1, 2, 3 }, new int[] { 1 })] - [InlineDataAttribute((ushort)TiffType.SShort, 2, false, new byte[] { 0, 1, 255, 255 }, new int[] { 1, -1 })] - [InlineDataAttribute((ushort)TiffType.SShort, 3, false, new byte[] { 0, 1, 255, 255, 4, 5, 6, 7, 8 }, new int[] { 1, -1, 1029 })] - [InlineDataAttribute((ushort)TiffType.SLong, 1, true, new byte[] { 4, 3, 2, 1 }, new int[] { 0x01020304 })] - [InlineDataAttribute((ushort)TiffType.SLong, 2, true, new byte[] { 4, 3, 2, 1, 255, 255, 255, 255, 99, 99 }, new int[] { 0x01020304, -1 })] - [InlineDataAttribute((ushort)TiffType.SLong, 1, false, new byte[] { 1, 2, 3, 4 }, new int[] { 0x01020304 })] - [InlineDataAttribute((ushort)TiffType.SLong, 2, false, new byte[] { 1, 2, 3, 4, 255, 255, 255, 255, 99, 99 }, new int[] { 0x01020304, -1 })] - public void ReadSignedIntegerArray_ReturnsValue(ushort type, int count, bool isLittleEndian, byte[] bytes, int[] expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, (uint)expectedValue.Length, bytes), isLittleEndian); - - int[] result = decoder.ReadSignedIntegerArray(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadSignedIntegerArray_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadSignedIntegerArray(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a signed integer.", e.Message); - } - - [Theory] - [InlineDataAttribute(true, new byte[] { 0 }, "")] - [InlineDataAttribute(true, new byte[] { (byte)'A', (byte)'B', (byte)'C', 0 }, "ABC")] - [InlineDataAttribute(true, new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', 0 }, "ABCDEF")] - [InlineDataAttribute(true, new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', 0, (byte)'E', (byte)'F', (byte)'G', (byte)'H', 0 }, "ABCD\0EFGH")] - [InlineDataAttribute(false, new byte[] { 0 }, "")] - [InlineDataAttribute(false, new byte[] { (byte)'A', (byte)'B', (byte)'C', 0 }, "ABC")] - [InlineDataAttribute(false, new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', 0 }, "ABCDEF")] - [InlineDataAttribute(false, new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', 0, (byte)'E', (byte)'F', (byte)'G', (byte)'H', 0 }, "ABCD\0EFGH")] - public void ReadString_ReturnsValue(bool isLittleEndian, byte[] bytes, string expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Ascii, (uint)bytes.Length, bytes), isLittleEndian); - - string result = decoder.ReadString(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadString_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadString(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a string.", e.Message); - } - - [Theory] - [InlineDataAttribute(true, new byte[] { (byte)'A' })] - [InlineDataAttribute(true, new byte[] { (byte)'A', (byte)'B', (byte)'C' })] - [InlineDataAttribute(true, new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F' })] - [InlineDataAttribute(true, new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', 0, (byte)'E', (byte)'F', (byte)'G', (byte)'H' })] - [InlineDataAttribute(false, new byte[] { (byte)'A' })] - [InlineDataAttribute(false, new byte[] { (byte)'A', (byte)'B', (byte)'C' })] - [InlineDataAttribute(false, new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F' })] - [InlineDataAttribute(false, new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', 0, (byte)'E', (byte)'F', (byte)'G', (byte)'H' })] - public void ReadString_ThrowsExceptionIfStringIsNotNullTerminated(bool isLittleEndian, byte[] bytes) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Ascii, (uint)bytes.Length, bytes), isLittleEndian); - - var e = Assert.Throws(() => decoder.ReadString(ref entry)); - - Assert.Equal($"The retrieved string is not null terminated.", e.Message); - } - - [Theory] - [InlineDataAttribute(true, new byte[] { 0, 0, 0, 0, 2, 0, 0, 0 }, 0, 2)] - [InlineDataAttribute(true, new byte[] { 1, 0, 0, 0, 2, 0, 0, 0 }, 1, 2)] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 0, 0, 0, 0, 2 }, 0, 2)] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 1, 0, 0, 0, 2 }, 1, 2)] - public void ReadUnsignedRational_ReturnsValue(bool isLittleEndian, byte[] bytes, uint expectedNumerator, uint expectedDenominator) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Rational, 1, bytes), isLittleEndian); - - Rational result = decoder.ReadUnsignedRational(ref entry); - Rational expectedValue = new Rational(expectedNumerator, expectedDenominator); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute(true, new byte[] { 0, 0, 0, 0, 2, 0, 0, 0 }, 0, 2)] - [InlineDataAttribute(true, new byte[] { 1, 0, 0, 0, 2, 0, 0, 0 }, 1, 2)] - [InlineDataAttribute(true, new byte[] { 255, 255, 255, 255, 2, 0, 0, 0 }, -1, 2)] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 0, 0, 0, 0, 2 }, 0, 2)] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 1, 0, 0, 0, 2 }, 1, 2)] - [InlineDataAttribute(false, new byte[] { 255, 255, 255, 255, 0, 0, 0, 2 }, -1, 2)] - public void ReadSignedRational_ReturnsValue(bool isLittleEndian, byte[] bytes, int expectedNumerator, int expectedDenominator) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.SRational, 1, bytes), isLittleEndian); - - SignedRational result = decoder.ReadSignedRational(ref entry); - SignedRational expectedValue = new SignedRational(expectedNumerator, expectedDenominator); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute(true, new byte[] { 0, 0, 0, 0, 2, 0, 0, 0 }, new uint[] { 0 }, new uint[] { 2 })] - [InlineDataAttribute(true, new byte[] { 1, 0, 0, 0, 2, 0, 0, 0 }, new uint[] { 1 }, new uint[] { 2 })] - [InlineDataAttribute(true, new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0 }, new uint[] { 1, 2 }, new uint[] { 2, 3 })] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 0, 0, 0, 0, 2 }, new uint[] { 0 }, new uint[] { 2 })] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 1, 0, 0, 0, 2 }, new uint[] { 1 }, new uint[] { 2 })] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 3 }, new uint[] { 1, 2 }, new uint[] { 2, 3 })] - public void ReadUnsignedRationalArray_ReturnsValue(bool isLittleEndian, byte[] bytes, uint[] expectedNumerators, uint[] expectedDenominators) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Rational, (uint)expectedNumerators.Length, bytes), isLittleEndian); - - Rational[] result = decoder.ReadUnsignedRationalArray(ref entry); - Rational[] expectedValue = Enumerable.Range(0, expectedNumerators.Length).Select(i => new Rational(expectedNumerators[i], expectedDenominators[i])).ToArray(); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute(true, new byte[] { 0, 0, 0, 0, 2, 0, 0, 0 }, new int[] { 0 }, new int[] { 2 })] - [InlineDataAttribute(true, new byte[] { 1, 0, 0, 0, 2, 0, 0, 0 }, new int[] { 1 }, new int[] { 2 })] - [InlineDataAttribute(true, new byte[] { 255, 255, 255, 255, 2, 0, 0, 0 }, new int[] { -1 }, new int[] { 2 })] - [InlineDataAttribute(true, new byte[] { 255, 255, 255, 255, 2, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0 }, new int[] { -1, 2 }, new int[] { 2, 3 })] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 0, 0, 0, 0, 2 }, new int[] { 0 }, new int[] { 2 })] - [InlineDataAttribute(false, new byte[] { 0, 0, 0, 1, 0, 0, 0, 2 }, new int[] { 1 }, new int[] { 2 })] - [InlineDataAttribute(false, new byte[] { 255, 255, 255, 255, 0, 0, 0, 2 }, new int[] { -1 }, new int[] { 2 })] - [InlineDataAttribute(false, new byte[] { 255, 255, 255, 255, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 3 }, new int[] { -1, 2 }, new int[] { 2, 3 })] - public void ReadSignedRationalArray_ReturnsValue(bool isLittleEndian, byte[] bytes, int[] expectedNumerators, int[] expectedDenominators) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.SRational, (uint)expectedNumerators.Length, bytes), isLittleEndian); - - SignedRational[] result = decoder.ReadSignedRationalArray(ref entry); - SignedRational[] expectedValue = Enumerable.Range(0, expectedNumerators.Length).Select(i => new SignedRational(expectedNumerators[i], expectedDenominators[i])).ToArray(); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadUnsignedRational_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadUnsignedRational(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a Rational.", e.Message); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadSignedRational_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadSignedRational(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a SignedRational.", e.Message); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadUnsignedRationalArray_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadUnsignedRationalArray(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a Rational.", e.Message); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadSignedRationalArray_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadSignedRationalArray(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a SignedRational.", e.Message); - } - - [Theory] - [InlineDataAttribute(false)] - [InlineDataAttribute(true)] - public void ReadUnsignedRational_ThrowsExceptionIfCountIsNotOne(bool isLittleEndian) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Rational, 2, new byte[4]), isLittleEndian); - - var e = Assert.Throws(() => decoder.ReadUnsignedRational(ref entry)); - - Assert.Equal($"Cannot read a single value from an array of multiple items.", e.Message); - } - - [Theory] - [InlineDataAttribute(false)] - [InlineDataAttribute(true)] - public void ReadSignedRational_ThrowsExceptionIfCountIsNotOne(bool isLittleEndian) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.SRational, 2, new byte[4]), isLittleEndian); - - var e = Assert.Throws(() => decoder.ReadSignedRational(ref entry)); - - Assert.Equal($"Cannot read a single value from an array of multiple items.", e.Message); - } - - [Theory] - [InlineDataAttribute(false, new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0.0F)] - [InlineDataAttribute(false, new byte[] { 0x3F, 0x80, 0x00, 0x00 }, 1.0F)] - [InlineDataAttribute(false, new byte[] { 0xC0, 0x00, 0x00, 0x00 }, -2.0F)] - [InlineDataAttribute(false, new byte[] { 0x7F, 0x7F, 0xFF, 0xFF }, float.MaxValue)] - [InlineDataAttribute(false, new byte[] { 0x7F, 0x80, 0x00, 0x00 }, float.PositiveInfinity)] - [InlineDataAttribute(false, new byte[] { 0xFF, 0x80, 0x00, 0x00 }, float.NegativeInfinity)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0.0F)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x80, 0x3F }, 1.0F)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0xC0 }, -2.0F)] - [InlineDataAttribute(true, new byte[] { 0xFF, 0xFF, 0x7F, 0x7F }, float.MaxValue)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x80, 0x7F }, float.PositiveInfinity)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x80, 0xFF }, float.NegativeInfinity)] - public void ReadFloat_ReturnsValue(bool isLittleEndian, byte[] bytes, float expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Float, 1, bytes), isLittleEndian); - - float result = decoder.ReadFloat(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadFloat_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadFloat(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a float.", e.Message); - } - - [Theory] - [InlineDataAttribute(false)] - [InlineDataAttribute(true)] - public void ReadFloat_ThrowsExceptionIfCountIsNotOne(bool isLittleEndian) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Float, 2, new byte[4]), isLittleEndian); - - var e = Assert.Throws(() => decoder.ReadFloat(ref entry)); - - Assert.Equal($"Cannot read a single value from an array of multiple items.", e.Message); - } - - [Theory] - [InlineDataAttribute(false, new byte[] { 0x00, 0x00, 0x00, 0x00 }, new float[] { 0.0F })] - [InlineDataAttribute(false, new byte[] { 0x3F, 0x80, 0x00, 0x00 }, new float[] { 1.0F })] - [InlineDataAttribute(false, new byte[] { 0xC0, 0x00, 0x00, 0x00 }, new float[] { -2.0F })] - [InlineDataAttribute(false, new byte[] { 0x7F, 0x7F, 0xFF, 0xFF }, new float[] { float.MaxValue })] - [InlineDataAttribute(false, new byte[] { 0x7F, 0x80, 0x00, 0x00 }, new float[] { float.PositiveInfinity })] - [InlineDataAttribute(false, new byte[] { 0xFF, 0x80, 0x00, 0x00 }, new float[] { float.NegativeInfinity })] - [InlineDataAttribute(false, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x3F, 0x80, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00 }, new float[] { 0.0F, 1.0F, -2.0F })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00 }, new float[] { 0.0F })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x80, 0x3F }, new float[] { 1.0F })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0xC0 }, new float[] { -2.0F })] - [InlineDataAttribute(true, new byte[] { 0xFF, 0xFF, 0x7F, 0x7F }, new float[] { float.MaxValue })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x80, 0x7F }, new float[] { float.PositiveInfinity })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x80, 0xFF }, new float[] { float.NegativeInfinity })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0xC0 }, new float[] { 0.0F, 1.0F, -2.0F })] - - public void ReadFloatArray_ReturnsValue(bool isLittleEndian, byte[] bytes, float[] expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Float, (uint)expectedValue.Length, bytes), isLittleEndian); - - float[] result = decoder.ReadFloatArray(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Double)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadFloatArray_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadFloatArray(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a float.", e.Message); - } - - [Theory] - [InlineDataAttribute(false, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0.0)] - [InlineDataAttribute(false, new byte[] { 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 1.0)] - [InlineDataAttribute(false, new byte[] { 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 2.0)] - [InlineDataAttribute(false, new byte[] { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, -2.0)] - [InlineDataAttribute(false, new byte[] { 0x7F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, double.MaxValue)] - [InlineDataAttribute(false, new byte[] { 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, double.PositiveInfinity)] - [InlineDataAttribute(false, new byte[] { 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, double.NegativeInfinity)] - [InlineDataAttribute(false, new byte[] { 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, double.NaN)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0.0)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F }, 1.0)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40 }, 2.0)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 }, -2.0)] - [InlineDataAttribute(true, new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7F }, double.MaxValue)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F }, double.PositiveInfinity)] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF }, double.NegativeInfinity)] - [InlineDataAttribute(true, new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F }, double.NaN)] - public void ReadDouble_ReturnsValue(bool isLittleEndian, byte[] bytes, double expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Double, 1, bytes), isLittleEndian); - - double result = decoder.ReadDouble(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadDouble_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadDouble(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a double.", e.Message); - } - - [Theory] - [InlineDataAttribute(false)] - [InlineDataAttribute(true)] - public void ReadDouble_ThrowsExceptionIfCountIsNotOne(bool isLittleEndian) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Double, 2, new byte[4]), isLittleEndian); - - var e = Assert.Throws(() => decoder.ReadDouble(ref entry)); - - Assert.Equal($"Cannot read a single value from an array of multiple items.", e.Message); - } - - [Theory] - [InlineDataAttribute(false, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { 0.0 })] - [InlineDataAttribute(false, new byte[] { 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { 1.0 })] - [InlineDataAttribute(false, new byte[] { 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { 2.0 })] - [InlineDataAttribute(false, new byte[] { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { -2.0 })] - [InlineDataAttribute(false, new byte[] { 0x7F, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, new double[] { double.MaxValue })] - [InlineDataAttribute(false, new byte[] { 0x7F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { double.PositiveInfinity })] - [InlineDataAttribute(false, new byte[] { 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { double.NegativeInfinity })] - [InlineDataAttribute(false, new byte[] { 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, new double[] { double.NaN })] - [InlineDataAttribute(false, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { 0.0, 1.0, -2.0 })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { 0.0 })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F }, new double[] { 1.0 })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40 }, new double[] { 2.0 })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 }, new double[] { -2.0 })] - [InlineDataAttribute(true, new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7F }, new double[] { double.MaxValue })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F }, new double[] { double.PositiveInfinity })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF }, new double[] { double.NegativeInfinity })] - [InlineDataAttribute(true, new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F }, new double[] { double.NaN })] - [InlineDataAttribute(true, new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 }, new double[] { 0.0, 1.0, -2.0 })] - public void ReadDoubleArray_ReturnsValue(bool isLittleEndian, byte[] bytes, double[] expectedValue) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, TiffType.Double, (uint)expectedValue.Length, bytes), isLittleEndian); - - double[] result = decoder.ReadDoubleArray(ref entry); - - Assert.Equal(expectedValue, result); - } - - [Theory] - [InlineDataAttribute((ushort)TiffType.Byte)] - [InlineDataAttribute((ushort)TiffType.Ascii)] - [InlineDataAttribute((ushort)TiffType.Short)] - [InlineDataAttribute((ushort)TiffType.Long)] - [InlineDataAttribute((ushort)TiffType.Rational)] - [InlineDataAttribute((ushort)TiffType.SByte)] - [InlineDataAttribute((ushort)TiffType.Undefined)] - [InlineDataAttribute((ushort)TiffType.SShort)] - [InlineDataAttribute((ushort)TiffType.SLong)] - [InlineDataAttribute((ushort)TiffType.SRational)] - [InlineDataAttribute((ushort)TiffType.Float)] - [InlineDataAttribute((ushort)TiffType.Ifd)] - [InlineDataAttribute((ushort)99)] - public void ReadDoubleArray_ThrowsExceptionIfInvalidType(ushort type) - { - (TiffDecoderCore decoder, TiffIfdEntry entry) = GenerateTestIfdEntry(TiffGenEntry.Bytes(TiffTags.ImageWidth, (TiffType)type, 1, new byte[4]), true); - - var e = Assert.Throws(() => decoder.ReadDoubleArray(ref entry)); - - Assert.Equal($"A value of type '{(TiffType)type}' cannot be converted to a double.", e.Message); - } - - private (TiffDecoderCore, TiffIfdEntry) GenerateTestIfdEntry(TiffGenEntry entry, bool isLittleEndian) - { - Stream stream = new TiffGenIfd() - { - Entries = - { - entry - } - } - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfdEntry ifdEntry = decoder.ReadIfd(0).Entries[0]; - - return (decoder, ifdEntry); - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderIfdTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderIfdTests.cs deleted file mode 100644 index 97ace8bed4..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderIfdTests.cs +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System.IO; -using SixLabors.ImageSharp.Formats.Tiff; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffDecoderIfdTests - { - public static object[][] IsLittleEndianValues = new[] { new object[] { false }, - new object[] { true } }; - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadIfd_ReadsNextIfdOffset_IfPresent(bool isLittleEndian) - { - Stream stream = new TiffGenIfd() - { - Entries = - { - TiffGenEntry.Integer(TiffTags.ImageWidth, TiffType.Long, 150) - }, - NextIfd = new TiffGenIfd() - } - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - Assert.Equal(18u, ifd.NextIfdOffset); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadIfd_ReadsNextIfdOffset_ZeroIfLastIfd(bool isLittleEndian) - { - Stream stream = new TiffGenIfd() - { - Entries = - { - TiffGenEntry.Integer(TiffTags.ImageWidth, TiffType.Long, 150) - } - } - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - Assert.Equal(0u, ifd.NextIfdOffset); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadIfd_ReturnsCorrectNumberOfEntries(bool isLittleEndian) - { - Stream stream = new TiffGenIfd() - { - Entries = - { - TiffGenEntry.Integer(TiffTags.ImageWidth, TiffType.Long, 150), - TiffGenEntry.Integer(TiffTags.ImageLength, TiffType.Long, 210), - TiffGenEntry.Integer(TiffTags.Orientation, TiffType.Short, 1), - TiffGenEntry.Ascii(TiffTags.Artist, "Image Artist Name"), - TiffGenEntry.Ascii(TiffTags.HostComputer, "Host Computer Name") - }, - NextIfd = new TiffGenIfd() - } - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - Assert.NotNull(ifd.Entries); - Assert.Equal(5, ifd.Entries.Length); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadIfd_ReadsRawTiffEntryData(bool isLittleEndian) - { - Stream stream = new TiffGenIfd() - { - Entries = - { - TiffGenEntry.Integer(TiffTags.ImageWidth, TiffType.Long, 150), - TiffGenEntry.Integer(TiffTags.ImageLength, TiffType.Long, 210), - TiffGenEntry.Integer(TiffTags.Orientation, TiffType.Short, 1) - }, - NextIfd = new TiffGenIfd() - } - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - TiffIfdEntry entry = ifd.Entries[1]; - - byte[] expectedData = isLittleEndian ? new byte[] { 210, 0, 0, 0 } : new byte[] { 0, 0, 0, 210 }; - - Assert.Equal(TiffTags.ImageLength, entry.Tag); - Assert.Equal(TiffType.Long, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(expectedData, entry.Value); - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderImageTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderImageTests.cs deleted file mode 100644 index 52f321a479..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderImageTests.cs +++ /dev/null @@ -1,510 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.IO; -using SixLabors.ImageSharp.Formats.Tiff; -using SixLabors.ImageSharp.PixelFormats; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffDecoderImageTests - { - public const int ImageWidth = 200; - public const int ImageHeight = 150; - - public static object[][] IsLittleEndianValues = new[] { new object[] { false }, - new object[] { true } }; - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void DecodeImage_SetsImageDimensions(bool isLittleEndian) - { - Stream stream = CreateTiffGenIfd() - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - Image image = decoder.DecodeImage(ifd); - - Assert.Equal(ImageWidth, image.Width); - Assert.Equal(ImageHeight, image.Height); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void DecodeImage_ThrowsException_WithMissingImageWidth(bool isLittleEndian) - { - Stream stream = CreateTiffGenIfd() - .WithoutEntry(TiffTags.ImageWidth) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - var e = Assert.Throws(() => decoder.DecodeImage(ifd)); - - Assert.Equal("The TIFF IFD does not specify the image dimensions.", e.Message); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void DecodeImage_ThrowsException_WithMissingImageLength(bool isLittleEndian) - { - Stream stream = CreateTiffGenIfd() - .WithoutEntry(TiffTags.ImageLength) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - var e = Assert.Throws(() => decoder.DecodeImage(ifd)); - - Assert.Equal("The TIFF IFD does not specify the image dimensions.", e.Message); - } - - [Theory] - [InlineData(false, (ushort)TiffCompression.None, (int)TiffCompressionType.None)] - [InlineData(true, (ushort)TiffCompression.None, (int)TiffCompressionType.None)] - [InlineData(false, (ushort)TiffCompression.PackBits, (int)TiffCompressionType.PackBits)] - [InlineData(true, (ushort)TiffCompression.PackBits, (int)TiffCompressionType.PackBits)] - [InlineData(false, (ushort)TiffCompression.Deflate, (int)TiffCompressionType.Deflate)] - [InlineData(true, (ushort)TiffCompression.Deflate, (int)TiffCompressionType.Deflate)] - [InlineData(false, (ushort)TiffCompression.OldDeflate, (int)TiffCompressionType.Deflate)] - [InlineData(true, (ushort)TiffCompression.OldDeflate, (int)TiffCompressionType.Deflate)] - [InlineData(false, (ushort)TiffCompression.Lzw, (int)TiffCompressionType.Lzw)] - [InlineData(true, (ushort)TiffCompression.Lzw, (int)TiffCompressionType.Lzw)] - public void ReadImageFormat_DeterminesCorrectCompressionImplementation(bool isLittleEndian, ushort compression, int compressionType) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.Compression, TiffType.Short, compression)) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal((TiffCompressionType)compressionType, decoder.CompressionType); - } - - [Theory] - [InlineData(false, (ushort)TiffCompression.Ccitt1D)] - [InlineData(false, (ushort)TiffCompression.CcittGroup3Fax)] - [InlineData(false, (ushort)TiffCompression.CcittGroup4Fax)] - [InlineData(false, (ushort)TiffCompression.ItuTRecT43)] - [InlineData(false, (ushort)TiffCompression.ItuTRecT82)] - [InlineData(false, (ushort)TiffCompression.Jpeg)] - [InlineData(false, (ushort)TiffCompression.OldJpeg)] - [InlineData(false, 999)] - [InlineData(true, (ushort)TiffCompression.Ccitt1D)] - [InlineData(true, (ushort)TiffCompression.CcittGroup3Fax)] - [InlineData(true, (ushort)TiffCompression.CcittGroup4Fax)] - [InlineData(true, (ushort)TiffCompression.ItuTRecT43)] - [InlineData(true, (ushort)TiffCompression.ItuTRecT82)] - [InlineData(true, (ushort)TiffCompression.Jpeg)] - [InlineData(true, (ushort)TiffCompression.OldJpeg)] - [InlineData(true, 999)] - public void ReadImageFormat_ThrowsExceptionForUnsupportedCompression(bool isLittleEndian, ushort compression) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.Compression, TiffType.Short, compression)) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); - - Assert.Equal("The specified TIFF compression format is not supported.", e.Message); - } - - [Theory] - [InlineData(false, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 3 }, (int)TiffColorType.WhiteIsZero)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 3 }, (int)TiffColorType.WhiteIsZero)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 8 }, (int)TiffColorType.WhiteIsZero8)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 8 }, (int)TiffColorType.WhiteIsZero8)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 4 }, (int)TiffColorType.WhiteIsZero4)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 4 }, (int)TiffColorType.WhiteIsZero4)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 1 }, (int)TiffColorType.WhiteIsZero1)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 1 }, (int)TiffColorType.WhiteIsZero1)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 3 }, (int)TiffColorType.BlackIsZero)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 3 }, (int)TiffColorType.BlackIsZero)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 8 }, (int)TiffColorType.BlackIsZero8)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 8 }, (int)TiffColorType.BlackIsZero8)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 4 }, (int)TiffColorType.BlackIsZero4)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 4 }, (int)TiffColorType.BlackIsZero4)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 1 }, (int)TiffColorType.BlackIsZero1)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 1 }, (int)TiffColorType.BlackIsZero1)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 3 }, (int)TiffColorType.PaletteColor)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 3 }, (int)TiffColorType.PaletteColor)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 8 }, (int)TiffColorType.PaletteColor)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 8 }, (int)TiffColorType.PaletteColor)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 4 }, (int)TiffColorType.PaletteColor)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 4 }, (int)TiffColorType.PaletteColor)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 1 }, (int)TiffColorType.PaletteColor)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 1 }, (int)TiffColorType.PaletteColor)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 4, 4, 4 }, (int)TiffColorType.Rgb)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 4, 4, 4 }, (int)TiffColorType.Rgb)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 8, 8, 8 }, (int)TiffColorType.Rgb888)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 8, 8, 8 }, (int)TiffColorType.Rgb888)] - public void ReadImageFormat_DeterminesCorrectColorImplementation_Chunky(bool isLittleEndian, ushort photometricInterpretation, int[] bitsPerSample, int colorType) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, photometricInterpretation)) - .WithEntry(TiffGenEntry.Integer(TiffTags.PlanarConfiguration, TiffType.Short, (int)TiffPlanarConfiguration.Chunky)) - .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, bitsPerSample)) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal((TiffColorType)colorType, decoder.ColorType); - } - - [Theory] - [InlineData(false, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 4, 4, 4 }, (int)TiffColorType.RgbPlanar)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 4, 4, 4 }, (int)TiffColorType.RgbPlanar)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 8, 8, 8 }, (int)TiffColorType.RgbPlanar)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 8, 8, 8 }, (int)TiffColorType.RgbPlanar)] - public void ReadImageFormat_DeterminesCorrectColorImplementation_Planar(bool isLittleEndian, ushort photometricInterpretation, int[] bitsPerSample, int colorType) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, photometricInterpretation)) - .WithEntry(TiffGenEntry.Integer(TiffTags.PlanarConfiguration, TiffType.Short, (int)TiffPlanarConfiguration.Planar)) - .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, bitsPerSample)) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal((TiffColorType)colorType, decoder.ColorType); - } - - [Theory] - [InlineData(false, (ushort)TiffPhotometricInterpretation.WhiteIsZero, (int)TiffColorType.WhiteIsZero1)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.WhiteIsZero, (int)TiffColorType.WhiteIsZero1)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.BlackIsZero, (int)TiffColorType.BlackIsZero1)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.BlackIsZero, (int)TiffColorType.BlackIsZero1)] - public void ReadImageFormat_DeterminesCorrectColorImplementation_DefaultsToBilevel(bool isLittleEndian, ushort photometricInterpretation, int colorType) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, photometricInterpretation)) - .WithoutEntry(TiffTags.BitsPerSample) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal((TiffColorType)colorType, decoder.ColorType); - } - - // [Theory] - // [InlineData(false, new[] { 8 }, (int)TiffColorType.WhiteIsZero8)] - // [InlineData(true, new[] { 8 }, (int)TiffColorType.WhiteIsZero8)] - // public void ReadImageFormat_UsesDefaultColorImplementationForCcitt1D(bool isLittleEndian, int[] bitsPerSample, int colorType) - // { - // Stream stream = CreateTiffGenIfd() - // .WithEntry(TiffGenEntry.Integer(TiffTags.Compression, TiffType.Short, (int)TiffCompression.Ccitt1D)) - // .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, bitsPerSample)) - // .WithoutEntry(TiffTags.PhotometricInterpretation) - // .ToStream(isLittleEndian); - - // TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - // TiffIfd ifd = decoder.ReadIfd(0); - // decoder.ReadImageFormat(ifd); - - // Assert.Equal((TiffColorType)colorType, decoder.ColorType); - // } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadImageFormat_ThrowsExceptionForMissingPhotometricInterpretation(bool isLittleEndian) - { - Stream stream = CreateTiffGenIfd() - .WithoutEntry(TiffTags.PhotometricInterpretation) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); - - Assert.Equal("The TIFF photometric interpretation entry is missing.", e.Message); - } - - [Theory] - [InlineData(false, (ushort)TiffPhotometricInterpretation.CieLab)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.ColorFilterArray)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.IccLab)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.ItuLab)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.LinearRaw)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.Separated)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.TransparencyMask)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.YCbCr)] - [InlineData(false, 999)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.CieLab)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.ColorFilterArray)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.IccLab)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.ItuLab)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.LinearRaw)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.Separated)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.TransparencyMask)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.YCbCr)] - [InlineData(true, 999)] - public void ReadImageFormat_ThrowsExceptionForUnsupportedPhotometricInterpretation(bool isLittleEndian, ushort photometricInterpretation) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, photometricInterpretation)) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); - - Assert.Equal("The specified TIFF photometric interpretation is not supported.", e.Message); - } - - [Theory] - [InlineData(false, new[] { 8u })] - [InlineData(true, new[] { 8u })] - [InlineData(false, new[] { 4u })] - [InlineData(true, new[] { 4u })] - [InlineData(false, new[] { 1u })] - [InlineData(true, new[] { 1u })] - // [InlineData(false, new[] { 1u, 2u, 3u })] - // [InlineData(true, new[] { 1u, 2u, 3u })] - // [InlineData(false, new[] { 8u, 8u, 8u })] - // [InlineData(true, new[] { 8u, 8u, 8u })] - public void ReadImageFormat_ReadsBitsPerSample(bool isLittleEndian, uint[] bitsPerSample) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, bitsPerSample)) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal(bitsPerSample, decoder.BitsPerSample); - } - - [Theory] - [InlineData(false, (ushort)TiffPhotometricInterpretation.WhiteIsZero)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.WhiteIsZero)] - [InlineData(false, (ushort)TiffPhotometricInterpretation.BlackIsZero)] - [InlineData(true, (ushort)TiffPhotometricInterpretation.BlackIsZero)] - public void ReadImageFormat_ReadsBitsPerSample_DefaultsToBilevel(bool isLittleEndian, ushort photometricInterpretation) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, photometricInterpretation)) - .WithoutEntry(TiffTags.BitsPerSample) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal(new[] { 1u }, decoder.BitsPerSample); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadImageFormat_ThrowsExceptionForMissingBitsPerSample(bool isLittleEndian) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, (int)TiffPhotometricInterpretation.PaletteColor)) - .WithoutEntry(TiffTags.BitsPerSample) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); - - Assert.Equal("The TIFF BitsPerSample entry is missing.", e.Message); - } - - [Theory] - [InlineData(false, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new int[] { })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new int[] { })] - [InlineData(false, (ushort)TiffPhotometricInterpretation.BlackIsZero, new int[] { })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.BlackIsZero, new int[] { })] - [InlineData(false, (ushort)TiffPhotometricInterpretation.PaletteColor, new int[] { })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.PaletteColor, new int[] { })] - [InlineData(false, (ushort)TiffPhotometricInterpretation.Rgb, new int[] { })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.Rgb, new int[] { })] - [InlineData(false, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 8, 8 })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.WhiteIsZero, new[] { 8, 8 })] - [InlineData(false, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 8, 8 })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.BlackIsZero, new[] { 8, 8 })] - [InlineData(false, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 8, 8 })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.PaletteColor, new[] { 8, 8 })] - [InlineData(false, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 8 })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 8 })] - [InlineData(false, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 8, 8 })] - [InlineData(true, (ushort)TiffPhotometricInterpretation.Rgb, new[] { 8, 8 })] - public void ReadImageFormat_ThrowsExceptionForUnsupportedNumberOfSamples(bool isLittleEndian, ushort photometricInterpretation, int[] bitsPerSample) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, photometricInterpretation)) - .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, bitsPerSample)) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); - - Assert.Equal("The number of samples in the TIFF BitsPerSample entry is not supported.", e.Message); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadImageFormat_ReadsColorMap(bool isLittleEndian) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, (int)TiffPhotometricInterpretation.PaletteColor)) - .WithEntry(TiffGenEntry.Integer(TiffTags.ColorMap, TiffType.Short, new int[] { 10, 20, 30, 40, 50, 60 })) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal(new uint[] { 10, 20, 30, 40, 50, 60 }, decoder.ColorMap); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadImageFormat_ThrowsExceptionForMissingColorMap(bool isLittleEndian) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, (int)TiffPhotometricInterpretation.PaletteColor)) - .WithoutEntry(TiffTags.ColorMap) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - - var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); - - Assert.Equal("The TIFF ColorMap entry is missing for a pallete color image.", e.Message); - } - - [Theory] - [InlineData(false, (ushort)TiffPlanarConfiguration.Chunky)] - [InlineData(true, (ushort)TiffPlanarConfiguration.Chunky)] - [InlineData(false, (ushort)TiffPlanarConfiguration.Planar)] - [InlineData(true, (ushort)TiffPlanarConfiguration.Planar)] - public void ReadImageFormat_ReadsPlanarConfiguration(bool isLittleEndian, int planarConfiguration) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, (int)TiffPhotometricInterpretation.Rgb)) - .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, new int[] { 8, 8, 8 })) - .WithEntry(TiffGenEntry.Integer(TiffTags.PlanarConfiguration, TiffType.Short, (int)planarConfiguration)) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal((TiffPlanarConfiguration)planarConfiguration, decoder.PlanarConfiguration); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void ReadImageFormat_DefaultsPlanarConfigurationToChunky(bool isLittleEndian) - { - Stream stream = CreateTiffGenIfd() - .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, (int)TiffPhotometricInterpretation.Rgb)) - .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, new int[] { 8, 8, 8 })) - .WithoutEntry(TiffTags.PlanarConfiguration) - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - decoder.ReadImageFormat(ifd); - - Assert.Equal(TiffPlanarConfiguration.Chunky, decoder.PlanarConfiguration); - } - - [Theory] - [InlineData((ushort)TiffColorType.WhiteIsZero, new uint[] { 1 }, 160, 80, 20 * 80)] - [InlineData((ushort)TiffColorType.WhiteIsZero, new uint[] { 1 }, 153, 80, 20 * 80)] - [InlineData((ushort)TiffColorType.WhiteIsZero, new uint[] { 3 }, 100, 80, 38 * 80)] - [InlineData((ushort)TiffColorType.WhiteIsZero, new uint[] { 4 }, 100, 80, 50 * 80)] - [InlineData((ushort)TiffColorType.WhiteIsZero, new uint[] { 4 }, 99, 80, 50 * 80)] - [InlineData((ushort)TiffColorType.WhiteIsZero, new uint[] { 8 }, 100, 80, 100 * 80)] - [InlineData((ushort)TiffColorType.PaletteColor, new uint[] { 1 }, 160, 80, 20 * 80)] - [InlineData((ushort)TiffColorType.PaletteColor, new uint[] { 1 }, 153, 80, 20 * 80)] - [InlineData((ushort)TiffColorType.PaletteColor, new uint[] { 3 }, 100, 80, 38 * 80)] - [InlineData((ushort)TiffColorType.PaletteColor, new uint[] { 4 }, 100, 80, 50 * 80)] - [InlineData((ushort)TiffColorType.PaletteColor, new uint[] { 4 }, 99, 80, 50 * 80)] - [InlineData((ushort)TiffColorType.PaletteColor, new uint[] { 8 }, 100, 80, 100 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 8, 8, 8 }, 100, 80, 300 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 4, 4 }, 100, 80, 150 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 8, 4 }, 100, 80, 200 * 80)] - public void CalculateImageBufferSize_ReturnsCorrectSize_Chunky(ushort colorType, uint[] bitsPerSample, int width, int height, int expectedResult) - { - TiffDecoderCore decoder = new TiffDecoderCore(null, null); - decoder.ColorType = (TiffColorType)colorType; - decoder.PlanarConfiguration = TiffPlanarConfiguration.Chunky; - decoder.BitsPerSample = bitsPerSample; - - int bufferSize = decoder.CalculateImageBufferSize(width, height, 0); - - Assert.Equal(expectedResult, bufferSize); - } - - [Theory] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 8, 8, 8 }, 100, 80, 0, 100 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 8, 8, 8 }, 100, 80, 1, 100 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 8, 8, 8 }, 100, 80, 2, 100 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 4, 4 }, 100, 80, 0, 50 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 4, 4 }, 100, 80, 1, 50 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 4, 4 }, 100, 80, 2, 50 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 8, 4 }, 100, 80, 0, 50 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 8, 4 }, 100, 80, 1, 100 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 8, 4 }, 100, 80, 2, 50 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 8, 4 }, 99, 80, 0, 50 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 8, 4 }, 99, 80, 1, 99 * 80)] - [InlineData((ushort)TiffColorType.Rgb, new uint[] { 4, 8, 4 }, 99, 80, 2, 50 * 80)] - - public void CalculateImageBufferSize_ReturnsCorrectSize_Planar(ushort colorType, uint[] bitsPerSample, int width, int height, int plane, int expectedResult) - { - TiffDecoderCore decoder = new TiffDecoderCore(null, null); - decoder.ColorType = (TiffColorType)colorType; - decoder.PlanarConfiguration = TiffPlanarConfiguration.Planar; - decoder.BitsPerSample = bitsPerSample; - - int bufferSize = decoder.CalculateImageBufferSize(width, height, plane); - - Assert.Equal(expectedResult, bufferSize); - } - - private TiffGenIfd CreateTiffGenIfd() - { - return new TiffGenIfd() - { - Entries = - { - TiffGenEntry.Integer(TiffTags.ImageWidth, TiffType.Long, ImageWidth), - TiffGenEntry.Integer(TiffTags.ImageLength, TiffType.Long, ImageHeight), - TiffGenEntry.Rational(TiffTags.XResolution, 100, 1), - TiffGenEntry.Rational(TiffTags.YResolution, 200, 1), - TiffGenEntry.Integer(TiffTags.ResolutionUnit, TiffType.Short, 2), - TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, (int)TiffPhotometricInterpretation.WhiteIsZero), - TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, new int[] { 8 }), - TiffGenEntry.Integer(TiffTags.Compression, TiffType.Short, (int)TiffCompression.None), - TiffGenEntry.Integer(TiffTags.ColorMap, TiffType.Short, new int[256]) - } - }; - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderMetadataTests.cs deleted file mode 100644 index b36d4e02f1..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffDecoderMetadataTests.cs +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System.IO; -using SixLabors.ImageSharp.Formats.Tiff; -using SixLabors.ImageSharp.PixelFormats; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffDecoderMetadataTests - { - public static object[][] BaselineMetadataValues = new[] { new object[] { false, TiffTags.Artist, TiffMetadataNames.Artist, "My Artist Name" }, - new object[] { false, TiffTags.Copyright, TiffMetadataNames.Copyright, "My Copyright Statement" }, - new object[] { false, TiffTags.DateTime, TiffMetadataNames.DateTime, "My DateTime Value" }, - new object[] { false, TiffTags.HostComputer, TiffMetadataNames.HostComputer, "My Host Computer Name" }, - new object[] { false, TiffTags.ImageDescription, TiffMetadataNames.ImageDescription, "My Image Description" }, - new object[] { false, TiffTags.Make, TiffMetadataNames.Make, "My Camera Make" }, - new object[] { false, TiffTags.Model, TiffMetadataNames.Model, "My Camera Model" }, - new object[] { false, TiffTags.Software, TiffMetadataNames.Software, "My Imaging Software" }, - new object[] { true, TiffTags.Artist, TiffMetadataNames.Artist, "My Artist Name" }, - new object[] { true, TiffTags.Copyright, TiffMetadataNames.Copyright, "My Copyright Statement" }, - new object[] { true, TiffTags.DateTime, TiffMetadataNames.DateTime, "My DateTime Value" }, - new object[] { true, TiffTags.HostComputer, TiffMetadataNames.HostComputer, "My Host Computer Name" }, - new object[] { true, TiffTags.ImageDescription, TiffMetadataNames.ImageDescription, "My Image Description" }, - new object[] { true, TiffTags.Make, TiffMetadataNames.Make, "My Camera Make" }, - new object[] { true, TiffTags.Model, TiffMetadataNames.Model, "My Camera Model" }, - new object[] { true, TiffTags.Software, TiffMetadataNames.Software, "My Imaging Software" }}; - - [Theory] - [InlineData(false, 150u, 1u, 200u, 1u, 2u /* Inch */, 150.0, 200.0)] - [InlineData(false, 150u, 1u, 200u, 1u, 3u /* Cm */, 150.0 * 2.54, 200.0 * 2.54)] - [InlineData(false, 150u, 1u, 200u, 1u, 1u /* None */, 96.0, 96.0)] - [InlineData(false, 150u, 1u, 200u, 1u, null /* Inch */, 150.0, 200.0)] - [InlineData(false, 5u, 2u, 9u, 4u, 2u /* Inch */, 2.5, 2.25)] - [InlineData(false, null, null, null, null, null /* Inch */, 96.0, 96.0)] - [InlineData(false, 150u, 1u, null, null, 2u /* Inch */, 150.0, 96.0)] - [InlineData(false, null, null, 200u, 1u, 2u /* Inch */, 96.0, 200.0)] - [InlineData(true, 150u, 1u, 200u, 1u, 2u /* Inch */, 150.0, 200.0)] - [InlineData(true, 150u, 1u, 200u, 1u, 3u /* Cm */, 150.0 * 2.54, 200.0 * 2.54)] - [InlineData(true, 150u, 1u, 200u, 1u, 1u /* None */, 96.0, 96.0)] - [InlineData(true, 5u, 2u, 9u, 4u, 2u /* Inch */, 2.5, 2.25)] - [InlineData(true, 150u, 1u, 200u, 1u, null /* Inch */, 150.0, 200.0)] - [InlineData(true, null, null, null, null, null /* Inch */, 96.0, 96.0)] - [InlineData(true, 150u, 1u, null, null, 2u /* Inch */, 150.0, 96.0)] - [InlineData(true, null, null, 200u, 1u, 2u /* Inch */, 96.0, 200.0)] - public void ReadMetadata_SetsImageResolution(bool isLittleEndian, uint? xResolutionNumerator, uint? xResolutionDenominator, - uint? yResolutionNumerator, uint? yResolutionDenominator, uint? resolutionUnit, - double expectedHorizonalResolution, double expectedVerticalResolution) - { - TiffGenIfd ifdGen = new TiffGenIfd(); - - if (xResolutionNumerator != null) - { - ifdGen.WithEntry(TiffGenEntry.Rational(TiffTags.XResolution, xResolutionNumerator.Value, xResolutionDenominator.Value)); - } - - if (yResolutionNumerator != null) - { - ifdGen.WithEntry(TiffGenEntry.Rational(TiffTags.YResolution, yResolutionNumerator.Value, yResolutionDenominator.Value)); - } - - if (resolutionUnit != null) - { - ifdGen.WithEntry(TiffGenEntry.Integer(TiffTags.ResolutionUnit, TiffType.Short, resolutionUnit.Value)); - } - - Stream stream = ifdGen.ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - Image image = new Image(null, 20, 20); - - decoder.ReadMetadata(ifd, image); - - Assert.Equal(expectedHorizonalResolution, image.Metadata.HorizontalResolution, 10); - Assert.Equal(expectedVerticalResolution, image.Metadata.VerticalResolution, 10); - } - /* - [Theory] - [MemberData(nameof(BaselineMetadataValues))] - public void ReadMetadata_SetsAsciiMetadata(bool isLittleEndian, ushort tag, string metadataName, string metadataValue) - { - Stream stream = new TiffGenIfd() - { - Entries = - { - TiffGenEntry.Integer(TiffTags.ImageWidth, TiffType.Long, 150), - TiffGenEntry.Integer(TiffTags.ImageLength, TiffType.Long, 210), - TiffGenEntry.Ascii(tag, metadataValue), - TiffGenEntry.Integer(TiffTags.Orientation, TiffType.Short, 1) - } - } - .ToStream(isLittleEndian); - - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); - TiffIfd ifd = decoder.ReadIfd(0); - Image image = new Image(null, 20, 20); - - decoder.ReadMetadata(ifd, image); - var metadata = image.Metadata.Properties.FirstOrDefault(m => m.Name == metadataName).Value; - - Assert.Equal(metadataValue, metadata); - } - - [Theory] - [MemberData(nameof(BaselineMetadataValues))] - public void ReadMetadata_DoesntSetMetadataIfIgnoring(bool isLittleEndian, ushort tag, string metadataName, string metadataValue) - { - Stream stream = new TiffGenIfd() - { - Entries = - { - TiffGenEntry.Integer(TiffTags.ImageWidth, TiffType.Long, 150), - TiffGenEntry.Integer(TiffTags.ImageLength, TiffType.Long, 210), - TiffGenEntry.Ascii(tag, metadataValue), - TiffGenEntry.Integer(TiffTags.Orientation, TiffType.Short, 1) - } - } - .ToStream(isLittleEndian); - - TiffDecoder options = new TiffDecoder() { IgnoreMetadata = true }; - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, options); - TiffIfd ifd = decoder.ReadIfd(0); - Image image = new Image(null, 20, 20); - - decoder.ReadMetadata(ifd, image); - var metadata = image.Metadata.Properties.FirstOrDefault(m => m.Name == metadataName).Value; - - Assert.Null(metadata); - } */ - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffEncoderIfdTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffEncoderIfdTests.cs deleted file mode 100644 index 1dfa7dc16f..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffEncoderIfdTests.cs +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using SixLabors.ImageSharp.Formats.Tiff; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffEncoderIfdTests - { - [Fact] - public void WriteIfd_DataIsCorrectLength() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(TiffTags.ImageWidth, TiffType.Long, 1, new byte[] { 1, 2, 3, 4 }), - new TiffIfdEntry(TiffTags.ImageLength, TiffType.Long, 1, new byte[] { 5, 6, 7, 8 }), - new TiffIfdEntry(TiffTags.Compression, TiffType.Long, 1, new byte[] { 9, 10, 11, 12 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - Assert.Equal(2 + 12 * 3 + 4, stream.Length); - } - - [Fact] - public void WriteIfd_WritesNumberOfEntries() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(TiffTags.ImageWidth, TiffType.Long, 1, new byte[] { 1, 2, 3, 4 }), - new TiffIfdEntry(TiffTags.ImageLength, TiffType.Long, 1, new byte[] { 5, 6, 7, 8 }), - new TiffIfdEntry(TiffTags.Compression, TiffType.Long, 1, new byte[] { 9, 10, 11, 12 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - var ifdEntryBytes = stream.ToArray().Take(2).ToArray(); - Assert.Equal(new byte[] { 3, 0 }, ifdEntryBytes); - } - - [Fact] - public void WriteIfd_ReturnsNextIfdMarker() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(TiffTags.ImageWidth, TiffType.Long, 1, new byte[] { 1, 2, 3, 4 }), - new TiffIfdEntry(TiffTags.ImageLength, TiffType.Long, 1, new byte[] { 5, 6, 7, 8 }), - new TiffIfdEntry(TiffTags.Compression, TiffType.Long, 1, new byte[] { 9, 10, 11, 12 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - long nextIfdMarker = encoder.WriteIfd(writer, entries); - Assert.Equal(2 + 12 * 3, nextIfdMarker); - } - } - - [Fact] - public void WriteIfd_WritesTagIdForEachEntry() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(10, TiffType.Long, 1, new byte[] { 1, 2, 3, 4 }), - new TiffIfdEntry(20, TiffType.Long, 1, new byte[] { 5, 6, 7, 8 }), - new TiffIfdEntry(30, TiffType.Long, 1, new byte[] { 9, 10, 11, 12 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - var ifdEntry1Bytes = stream.ToArray().Skip(2 + 12 * 0).Take(2).ToArray(); - var ifdEntry2Bytes = stream.ToArray().Skip(2 + 12 * 1).Take(2).ToArray(); - var ifdEntry3Bytes = stream.ToArray().Skip(2 + 12 * 2).Take(2).ToArray(); - - Assert.Equal(new byte[] { 10, 0 }, ifdEntry1Bytes); - Assert.Equal(new byte[] { 20, 0 }, ifdEntry2Bytes); - Assert.Equal(new byte[] { 30, 0 }, ifdEntry3Bytes); - } - - [Fact] - public void WriteIfd_WritesTypeForEachEntry() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(TiffTags.ImageWidth, TiffType.Long, 1, new byte[] { 1, 2, 3, 4 }), - new TiffIfdEntry(TiffTags.ImageLength, TiffType.Short, 2, new byte[] { 5, 6, 7, 8 }), - new TiffIfdEntry(TiffTags.Compression, TiffType.Ascii, 4, new byte[] { (byte)'A', (byte)'B', (byte)'C', 0 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - var ifdEntry1Bytes = stream.ToArray().Skip(4 + 12 * 0).Take(2).ToArray(); - var ifdEntry2Bytes = stream.ToArray().Skip(4 + 12 * 1).Take(2).ToArray(); - var ifdEntry3Bytes = stream.ToArray().Skip(4 + 12 * 2).Take(2).ToArray(); - - Assert.Equal(new byte[] { 4, 0 }, ifdEntry1Bytes); - Assert.Equal(new byte[] { 3, 0 }, ifdEntry2Bytes); - Assert.Equal(new byte[] { 2, 0 }, ifdEntry3Bytes); - } - - [Fact] - public void WriteIfd_WritesCountForEachEntry() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(TiffTags.ImageWidth, TiffType.Long, 1, new byte[] { 1, 2, 3, 4 }), - new TiffIfdEntry(TiffTags.ImageLength, TiffType.Short, 2, new byte[] { 5, 6, 7, 8 }), - new TiffIfdEntry(TiffTags.Compression, TiffType.Ascii, 4, new byte[] { (byte)'A', (byte)'B', (byte)'C', 0 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - var ifdEntry1Bytes = stream.ToArray().Skip(6 + 12 * 0).Take(4).ToArray(); - var ifdEntry2Bytes = stream.ToArray().Skip(6 + 12 * 1).Take(4).ToArray(); - var ifdEntry3Bytes = stream.ToArray().Skip(6 + 12 * 2).Take(4).ToArray(); - - Assert.Equal(new byte[] { 1, 0, 0, 0 }, ifdEntry1Bytes); - Assert.Equal(new byte[] { 2, 0, 0, 0 }, ifdEntry2Bytes); - Assert.Equal(new byte[] { 4, 0, 0, 0 }, ifdEntry3Bytes); - } - - [Fact] - public void WriteIfd_WritesDataInline() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(TiffTags.ImageWidth, TiffType.Long, 1, new byte[] { 1, 2, 3, 4 }), - new TiffIfdEntry(TiffTags.ImageLength, TiffType.Short, 2, new byte[] { 5, 6, 7, 8 }), - new TiffIfdEntry(TiffTags.Compression, TiffType.Ascii, 3, new byte[] { (byte)'A', (byte)'B', 0 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - var ifdEntry1Bytes = stream.ToArray().Skip(10 + 12 * 0).Take(4).ToArray(); - var ifdEntry2Bytes = stream.ToArray().Skip(10 + 12 * 1).Take(4).ToArray(); - var ifdEntry3Bytes = stream.ToArray().Skip(10 + 12 * 2).Take(4).ToArray(); - - Assert.Equal(new byte[] { 1, 2, 3, 4 }, ifdEntry1Bytes); - Assert.Equal(new byte[] { 5, 6, 7, 8 }, ifdEntry2Bytes); - Assert.Equal(new byte[] { (byte)'A', (byte)'B', 0, 0 }, ifdEntry3Bytes); - } - - [Fact] - public void WriteIfd_WritesDataByReference() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(TiffTags.ImageWidth, TiffType.Byte, 8, new byte[] { 1, 2, 3, 4, 4, 3, 2, 1 }), - new TiffIfdEntry(TiffTags.ImageLength, TiffType.Short, 4, new byte[] { 5, 6, 7, 8, 9, 10, 11, 12 }), - new TiffIfdEntry(TiffTags.Compression, TiffType.Ascii, 3, new byte[] { (byte)'A', (byte)'B', 0 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - writer.Write(new byte[] { 1, 2, 3, 4 }); - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - var ifdEntry1Bytes = stream.ToArray().Skip(14 + 12 * 0).Take(4).ToArray(); - var ifdEntry1Data = stream.ToArray().Skip(46).Take(8).ToArray(); - var ifdEntry2Bytes = stream.ToArray().Skip(14 + 12 * 1).Take(4).ToArray(); - var ifdEntry2Data = stream.ToArray().Skip(54).Take(8).ToArray(); - var ifdEntry3Bytes = stream.ToArray().Skip(14 + 12 * 2).Take(4).ToArray(); - - Assert.Equal(new byte[] { 46, 0, 0, 0 }, ifdEntry1Bytes); - Assert.Equal(new byte[] { 1, 2, 3, 4, 4, 3, 2, 1 }, ifdEntry1Data); - Assert.Equal(new byte[] { 54, 0, 0, 0 }, ifdEntry2Bytes); - Assert.Equal(new byte[] { 5, 6, 7, 8, 9, 10, 11, 12 }, ifdEntry2Data); - Assert.Equal(new byte[] { (byte)'A', (byte)'B', 0, 0 }, ifdEntry3Bytes); - } - - [Fact] - public void WriteIfd_WritesDataByReferenceOnWordBoundary() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(TiffTags.ImageWidth, TiffType.Byte, 8, new byte[] { 1, 2, 3, 4, 5 }), - new TiffIfdEntry(TiffTags.ImageLength, TiffType.Short, 4, new byte[] { 5, 6, 7, 8, 9, 10, 11, 12 }), - new TiffIfdEntry(TiffTags.Compression, TiffType.Ascii, 3, new byte[] { (byte)'A', (byte)'B', 0 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - writer.Write(new byte[] { 1, 2, 3, 4 }); - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - var ifdEntry1Bytes = stream.ToArray().Skip(14 + 12 * 0).Take(4).ToArray(); - var ifdEntry1Data = stream.ToArray().Skip(46).Take(5).ToArray(); - var ifdEntry2Bytes = stream.ToArray().Skip(14 + 12 * 1).Take(4).ToArray(); - var ifdEntry2Data = stream.ToArray().Skip(52).Take(8).ToArray(); - var ifdEntry3Bytes = stream.ToArray().Skip(14 + 12 * 2).Take(4).ToArray(); - - Assert.Equal(new byte[] { 46, 0, 0, 0 }, ifdEntry1Bytes); - Assert.Equal(new byte[] { 1, 2, 3, 4, 5 }, ifdEntry1Data); - Assert.Equal(new byte[] { 52, 0, 0, 0 }, ifdEntry2Bytes); - Assert.Equal(new byte[] { 5, 6, 7, 8, 9, 10, 11, 12 }, ifdEntry2Data); - Assert.Equal(new byte[] { (byte)'A', (byte)'B', 0, 0 }, ifdEntry3Bytes); - } - - [Fact] - public void WriteIfd_WritesEntriesInCorrectOrder() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List() - { - new TiffIfdEntry(10, TiffType.Long, 1, new byte[] { 1, 2, 3, 4 }), - new TiffIfdEntry(30, TiffType.Long, 1, new byte[] { 5, 6, 7, 8 }), - new TiffIfdEntry(20, TiffType.Long, 1, new byte[] { 9, 10, 11, 12 }) - }; - - using (TiffWriter writer = new TiffWriter(stream)) - { - long nextIfdMarker = encoder.WriteIfd(writer, entries); - } - - var ifdEntry1Bytes = stream.ToArray().Skip(2 + 12 * 0).Take(2).ToArray(); - var ifdEntry2Bytes = stream.ToArray().Skip(2 + 12 * 1).Take(2).ToArray(); - var ifdEntry3Bytes = stream.ToArray().Skip(2 + 12 * 2).Take(2).ToArray(); - - Assert.Equal(new byte[] { 10, 0 }, ifdEntry1Bytes); - Assert.Equal(new byte[] { 20, 0 }, ifdEntry2Bytes); - Assert.Equal(new byte[] { 30, 0 }, ifdEntry3Bytes); - } - - [Fact] - public void WriteIfd_ThrowsException_IfNoEntriesArePresent() - { - MemoryStream stream = new MemoryStream(); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List entries = new List(); - - using (TiffWriter writer = new TiffWriter(stream)) - { - ArgumentException e = Assert.Throws(() => { encoder.WriteIfd(writer, entries); }); - - Assert.Equal($"There must be at least one entry per IFD.{Environment.NewLine}Parameter name: entries", e.Message); - Assert.Equal("entries", e.ParamName); - } - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffEncoderMetadataTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffEncoderMetadataTests.cs deleted file mode 100644 index ec90381ab8..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffEncoderMetadataTests.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System.Collections.Generic; -using SixLabors.ImageSharp.Formats.Tiff; -using SixLabors.ImageSharp.PixelFormats; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffEncoderMetadataTests - { - public static object[][] BaselineMetadataValues = new[] { new object[] { TiffTags.Artist, TiffMetadataNames.Artist, "My Artist Name" }, - new object[] { TiffTags.Copyright, TiffMetadataNames.Copyright, "My Copyright Statement" }, - new object[] { TiffTags.DateTime, TiffMetadataNames.DateTime, "My DateTime Value" }, - new object[] { TiffTags.HostComputer, TiffMetadataNames.HostComputer, "My Host Computer Name" }, - new object[] { TiffTags.ImageDescription, TiffMetadataNames.ImageDescription, "My Image Description" }, - new object[] { TiffTags.Make, TiffMetadataNames.Make, "My Camera Make" }, - new object[] { TiffTags.Model, TiffMetadataNames.Model, "My Camera Model" }, - new object[] { TiffTags.Software, TiffMetadataNames.Software, "My Imaging Software" }}; - - [Fact] - public void AddMetadata_SetsImageResolution() - { - Image image = new Image(100, 100); - image.Metadata.HorizontalResolution = 40.0; - image.Metadata.VerticalResolution = 50.5; - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List ifdEntries = new List(); - encoder.AddMetadata(image, ifdEntries); - - Assert.Equal(new Rational(40, 1), ifdEntries.GetUnsignedRational(TiffTags.XResolution)); - Assert.Equal(new Rational(101, 2), ifdEntries.GetUnsignedRational(TiffTags.YResolution)); - Assert.Equal(TiffResolutionUnit.Inch, (TiffResolutionUnit?)ifdEntries.GetInteger(TiffTags.ResolutionUnit)); - } - - /* - [Theory] - [MemberData(nameof(BaselineMetadataValues))] - public void AddMetadata_SetsAsciiMetadata(ushort tag, string metadataName, string metadataValue) - { - Image image = new Image(100, 100); - image.Metadata.Properties.Add(new ImageProperty(metadataName, metadataValue)); - TiffEncoderCore encoder = new TiffEncoderCore(null); - - List ifdEntries = new List(); - encoder.AddMetadata(image, ifdEntries); - - Assert.Equal(metadataValue + "\0", ifdEntries.GetAscii(tag)); - } */ - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdEntryCreatorTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdEntryCreatorTests.cs deleted file mode 100644 index c3c108e9fe..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdEntryCreatorTests.cs +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Collections.Generic; -using System.Linq; -using SixLabors.ImageSharp.Formats.Tiff; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffIfdEntryCreatorTests - { - [Theory] - [InlineDataAttribute(new byte[] { 0 }, 0)] - [InlineDataAttribute(new byte[] { 1 }, 1)] - [InlineDataAttribute(new byte[] { 255 }, 255)] - public void AddUnsignedByte_AddsSingleValue(byte[] bytes, uint value) - { - var entries = new List(); - - entries.AddUnsignedByte(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Byte, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0 }, new uint[] { 0 })] - [InlineDataAttribute(new byte[] { 0, 1, 2 }, new uint[] { 0, 1, 2 })] - [InlineDataAttribute(new byte[] { 0, 1, 2, 3, 4, 5, 6 }, new uint[] { 0, 1, 2, 3, 4, 5, 6 })] - public void AddUnsignedByte_AddsArray(byte[] bytes, uint[] value) - { - var entries = new List(); - - entries.AddUnsignedByte(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Byte, entry.Type); - Assert.Equal((uint)value.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0, 0 }, 0)] - [InlineDataAttribute(new byte[] { 1, 0 }, 1)] - [InlineDataAttribute(new byte[] { 0, 1 }, 256)] - [InlineDataAttribute(new byte[] { 2, 1 }, 258)] - [InlineDataAttribute(new byte[] { 255, 255 }, UInt16.MaxValue)] - public void AddUnsignedShort_AddsSingleValue(byte[] bytes, uint value) - { - var entries = new List(); - - entries.AddUnsignedShort(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Short, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 1, 0 }, new uint[] { 1 })] - [InlineDataAttribute(new byte[] { 1, 0, 3, 2 }, new uint[] { 1, 515 })] - [InlineDataAttribute(new byte[] { 1, 0, 3, 2, 5, 4 }, new uint[] { 1, 515, 1029 })] - public void AddUnsignedShort_AddsArray(byte[] bytes, uint[] value) - { - var entries = new List(); - - entries.AddUnsignedShort(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Short, entry.Type); - Assert.Equal((uint)value.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0, 0, 0, 0 }, 0)] - [InlineDataAttribute(new byte[] { 1, 0, 0, 0 }, 1)] - [InlineDataAttribute(new byte[] { 0, 1, 0, 0 }, 256)] - [InlineDataAttribute(new byte[] { 0, 0, 1, 0 }, 256 * 256)] - [InlineDataAttribute(new byte[] { 0, 0, 0, 1 }, 256 * 256 * 256)] - [InlineDataAttribute(new byte[] { 1, 2, 3, 4 }, 67305985)] - [InlineDataAttribute(new byte[] { 255, 255, 255, 255 }, UInt32.MaxValue)] - public void AddUnsignedLong_AddsSingleValue(byte[] bytes, uint value) - { - var entries = new List(); - - entries.AddUnsignedLong(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Long, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 4, 3, 2, 1 }, new uint[] { 0x01020304 })] - [InlineDataAttribute(new byte[] { 4, 3, 2, 1, 6, 5, 4, 3 }, new uint[] { 0x01020304, 0x03040506 })] - public void AddUnsignedLong_AddsArray(byte[] bytes, uint[] value) - { - var entries = new List(); - - entries.AddUnsignedLong(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Long, entry.Type); - Assert.Equal((uint)value.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0 }, 0)] - [InlineDataAttribute(new byte[] { 1 }, 1)] - [InlineDataAttribute(new byte[] { 255 }, -1)] - public void AddSignedByte_AddsSingleValue(byte[] bytes, int value) - { - var entries = new List(); - - entries.AddSignedByte(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.SByte, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0 }, new int[] { 0 })] - [InlineDataAttribute(new byte[] { 0, 255, 2 }, new int[] { 0, -1, 2 })] - [InlineDataAttribute(new byte[] { 0, 255, 2, 3, 4, 5, 6 }, new int[] { 0, -1, 2, 3, 4, 5, 6 })] - public void AddSignedByte_AddsArray(byte[] bytes, int[] value) - { - var entries = new List(); - - entries.AddSignedByte(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.SByte, entry.Type); - Assert.Equal((uint)value.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0, 0 }, 0)] - [InlineDataAttribute(new byte[] { 1, 0 }, 1)] - [InlineDataAttribute(new byte[] { 0, 1 }, 256)] - [InlineDataAttribute(new byte[] { 2, 1 }, 258)] - [InlineDataAttribute(new byte[] { 255, 255 }, -1)] - public void AddSignedShort_AddsSingleValue(byte[] bytes, int value) - { - var entries = new List(); - - entries.AddSignedShort(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.SShort, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 1, 0 }, new int[] { 1 })] - [InlineDataAttribute(new byte[] { 1, 0, 255, 255 }, new int[] { 1, -1 })] - [InlineDataAttribute(new byte[] { 1, 0, 255, 255, 5, 4 }, new int[] { 1, -1, 1029 })] - public void AddSignedShort_AddsArray(byte[] bytes, int[] value) - { - var entries = new List(); - - entries.AddSignedShort(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.SShort, entry.Type); - Assert.Equal((uint)value.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0, 0, 0, 0 }, 0)] - [InlineDataAttribute(new byte[] { 1, 0, 0, 0 }, 1)] - [InlineDataAttribute(new byte[] { 0, 1, 0, 0 }, 256)] - [InlineDataAttribute(new byte[] { 0, 0, 1, 0 }, 256 * 256)] - [InlineDataAttribute(new byte[] { 0, 0, 0, 1 }, 256 * 256 * 256)] - [InlineDataAttribute(new byte[] { 1, 2, 3, 4 }, 67305985)] - [InlineDataAttribute(new byte[] { 255, 255, 255, 255 }, -1)] - public void AddSignedLong_AddsSingleValue(byte[] bytes, int value) - { - var entries = new List(); - - entries.AddSignedLong(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.SLong, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 4, 3, 2, 1 }, new int[] { 0x01020304 })] - [InlineDataAttribute(new byte[] { 4, 3, 2, 1, 255, 255, 255, 255 }, new int[] { 0x01020304, -1 })] - public void AddSignedLong_AddsArray(byte[] bytes, int[] value) - { - var entries = new List(); - - entries.AddSignedLong(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.SLong, entry.Type); - Assert.Equal((uint)value.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0 }, "")] - [InlineDataAttribute(new byte[] { (byte)'A', (byte)'B', (byte)'C', 0 }, "ABC")] - [InlineDataAttribute(new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', 0 }, "ABCDEF")] - [InlineDataAttribute(new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', 0, (byte)'E', (byte)'F', (byte)'G', (byte)'H', 0 }, "ABCD\0EFGH")] - public void AddAscii_AddsEntry(byte[] bytes, string value) - { - var entries = new List(); - - entries.AddAscii(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Ascii, entry.Type); - Assert.Equal((uint)bytes.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, 0)] - [InlineDataAttribute(new byte[] { 2, 0, 0, 0, 1, 0, 0, 0 }, 2, 1)] - [InlineDataAttribute(new byte[] { 1, 0, 0, 0, 2, 0, 0, 0 }, 1, 2)] - public void AddUnsignedRational_AddsSingleValue(byte[] bytes, uint numerator, uint denominator) - { - var entries = new List(); - - entries.AddUnsignedRational(TiffTags.ImageWidth, new Rational(numerator, denominator)); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Rational, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, new uint[] { 0 }, new uint[] { 0 })] - [InlineDataAttribute(new byte[] { 1, 0, 0, 0, 2, 0, 0, 0 }, new uint[] { 1 }, new uint[] { 2 })] - [InlineDataAttribute(new byte[] { 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0 }, new uint[] { 1, 2 }, new uint[] { 2, 3 })] - public void AddUnsignedRational_AddsArray(byte[] bytes, uint[] numerators, uint[] denominators) - { - var entries = new List(); - Rational[] value = Enumerable.Range(0, numerators.Length).Select(i => new Rational(numerators[i], denominators[i])).ToArray(); - - entries.AddUnsignedRational(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Rational, entry.Type); - Assert.Equal((uint)numerators.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, 0, 0)] - [InlineDataAttribute(new byte[] { 2, 0, 0, 0, 1, 0, 0, 0 }, 2, 1)] - [InlineDataAttribute(new byte[] { 1, 0, 0, 0, 2, 0, 0, 0 }, 1, 2)] - [InlineDataAttribute(new byte[] { 255, 255, 255, 255, 2, 0, 0, 0 }, -1, 2)] - public void AddSignedRational_AddsSingleValue(byte[] bytes, int numerator, int denominator) - { - var entries = new List(); - - entries.AddSignedRational(TiffTags.ImageWidth, new SignedRational(numerator, denominator)); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.SRational, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }, new int[] { 0 }, new int[] { 0 })] - [InlineDataAttribute(new byte[] { 2, 0, 0, 0, 1, 0, 0, 0 }, new int[] { 2 }, new int[] { 1 })] - [InlineDataAttribute(new byte[] { 1, 0, 0, 0, 2, 0, 0, 0 }, new int[] { 1 }, new int[] { 2 })] - [InlineDataAttribute(new byte[] { 255, 255, 255, 255, 2, 0, 0, 0 }, new int[] { -1 }, new int[] { 2 })] - [InlineDataAttribute(new byte[] { 255, 255, 255, 255, 2, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0 }, new int[] { -1, 2 }, new int[] { 2, 3 })] - public void AddSignedRational_AddsArray(byte[] bytes, int[] numerators, int[] denominators) - { - var entries = new List(); - SignedRational[] value = Enumerable.Range(0, numerators.Length).Select(i => new SignedRational(numerators[i], denominators[i])).ToArray(); - - entries.AddSignedRational(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.SRational, entry.Type); - Assert.Equal((uint)numerators.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00 }, 0.0F)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x80, 0x3F }, 1.0F)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0xC0 }, -2.0F)] - [InlineDataAttribute(new byte[] { 0xFF, 0xFF, 0x7F, 0x7F }, float.MaxValue)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x80, 0x7F }, float.PositiveInfinity)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x80, 0xFF }, float.NegativeInfinity)] - public void AddFloat_AddsSingleValue(byte[] bytes, float value) - { - var entries = new List(); - - entries.AddFloat(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Float, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00 }, new float[] { 0.0F })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x80, 0x3F }, new float[] { 1.0F })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0xC0 }, new float[] { -2.0F })] - [InlineDataAttribute(new byte[] { 0xFF, 0xFF, 0x7F, 0x7F }, new float[] { float.MaxValue })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x80, 0x7F }, new float[] { float.PositiveInfinity })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x80, 0xFF }, new float[] { float.NegativeInfinity })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x00, 0x00, 0x00, 0xC0 }, new float[] { 0.0F, 1.0F, -2.0F })] - public void AddFloat_AddsArray(byte[] bytes, float[] value) - { - var entries = new List(); - - entries.AddFloat(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Float, entry.Type); - Assert.Equal((uint)value.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, 0.0)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F }, 1.0)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40 }, 2.0)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 }, -2.0)] - [InlineDataAttribute(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7F }, double.MaxValue)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F }, double.PositiveInfinity)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF }, double.NegativeInfinity)] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF }, double.NaN)] - public void AddDouble_AddsSingleValue(byte[] bytes, double value) - { - var entries = new List(); - - entries.AddDouble(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Double, entry.Type); - Assert.Equal(1u, entry.Count); - Assert.Equal(bytes, entry.Value); - } - - [Theory] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, new double[] { 0.0 })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F }, new double[] { 1.0 })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40 }, new double[] { 2.0 })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 }, new double[] { -2.0 })] - [InlineDataAttribute(new byte[] { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEF, 0x7F }, new double[] { double.MaxValue })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F }, new double[] { double.PositiveInfinity })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF }, new double[] { double.NegativeInfinity })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF }, new double[] { double.NaN })] - [InlineDataAttribute(new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0 }, new double[] { 0.0, 1.0, -2.0 })] - public void AddDouble_AddsArray(byte[] bytes, double[] value) - { - var entries = new List(); - - entries.AddDouble(TiffTags.ImageWidth, value); - - var entry = entries[0]; - Assert.Equal(TiffTags.ImageWidth, entry.Tag); - Assert.Equal(TiffType.Double, entry.Type); - Assert.Equal((uint)value.Length, entry.Count); - Assert.Equal(bytes, entry.Value); - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdEntryTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdEntryTests.cs deleted file mode 100644 index f5f44b3228..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdEntryTests.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.Formats.Tiff; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffIfdEntryTests - { - [Fact] - public void Constructor_SetsProperties() - { - var entry = new TiffIfdEntry((ushort)10u, TiffType.Short, 20u, new byte[] { 2, 4, 6, 8 }); - - Assert.Equal(10u, entry.Tag); - Assert.Equal(TiffType.Short, entry.Type); - Assert.Equal(20u, entry.Count); - Assert.Equal(new byte[] { 2, 4, 6, 8 }, entry.Value); - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdTests.cs deleted file mode 100644 index 88ae289615..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffIfd/TiffIfdTests.cs +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using SixLabors.ImageSharp.Formats.Tiff; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffIfdTests - { - [Fact] - public void Constructor_SetsProperties() - { - var entries = new TiffIfdEntry[10]; - var ifd = new TiffIfd(entries, 1234u); - - Assert.Equal(entries, ifd.Entries); - Assert.Equal(1234u, ifd.NextIfdOffset); - } - - [Fact] - public void GetIfdEntry_ReturnsIfdIfExists() - { - var entries = new[] - { - new TiffIfdEntry(10, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(20, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(30, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(40, TiffType.Short, 20, new byte[4]) - }; - var ifd = new TiffIfd(entries, 1234u); - - TiffIfdEntry? entry = ifd.GetIfdEntry(30); - - Assert.True(entry.HasValue); - Assert.Equal(30, entry.Value.Tag); - } - - [Fact] - public void GetIfdEntry_ReturnsNullOtherwise() - { - var entries = new[] - { - new TiffIfdEntry(10, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(20, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(30, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(40, TiffType.Short, 20, new byte[4]) - }; - var ifd = new TiffIfd(entries, 1234u); - - TiffIfdEntry? entry = ifd.GetIfdEntry(25); - - Assert.False(entry.HasValue); - } - - [Fact] - public void TryGetIfdEntry_ReturnsIfdIfExists() - { - var entries = new[] - { - new TiffIfdEntry(10, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(20, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(30, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(40, TiffType.Short, 20, new byte[4]) - }; - var ifd = new TiffIfd(entries, 1234u); - - bool success = ifd.TryGetIfdEntry(30, out var entry); - - Assert.True(success); - Assert.Equal(30, entry.Tag); - } - - [Fact] - public void TryGetIfdEntry_ReturnsFalseOtherwise() - { - var entries = new[] - { - new TiffIfdEntry(10, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(20, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(30, TiffType.Short, 20, new byte[4]), - new TiffIfdEntry(40, TiffType.Short, 20, new byte[4]) - }; - var ifd = new TiffIfd(entries, 1234u); - - bool success = ifd.TryGetIfdEntry(25, out var entry); - - Assert.False(success); - Assert.Equal(0, entry.Tag); - } - } -} diff --git a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffImageFormatDetectorTests.cs b/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffImageFormatDetectorTests.cs deleted file mode 100644 index 7d8cad56bf..0000000000 --- a/tests/ImageSharp.Tests/Formats/Tiff/__obsolete/TiffImageFormatDetectorTests.cs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Apache License, Version 2.0. - -using System.Linq; -using SixLabors.ImageSharp.Formats.Tiff; -using Xunit; - -namespace SixLabors.ImageSharp.Tests.Formats.Tiff -{ - [Trait("Category", "Tiff")] - public class TiffImageFormatDetectorTests - { - public static object[][] IsLittleEndianValues = new[] { new object[] { false }, - new object[] { true } }; - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void DetectFormat_ReturnsTiffFormat_ForValidFile(bool isLittleEndian) - { - byte[] bytes = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd() - } - .ToBytes(isLittleEndian); - - TiffImageFormatDetector formatDetector = new TiffImageFormatDetector(); - byte[] headerBytes = bytes.Take(formatDetector.HeaderSize).ToArray(); - var format = formatDetector.DetectFormat(headerBytes); - - Assert.NotNull(format); - Assert.IsType(format); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void DetectFormat_ReturnsNull_WithInvalidByteOrderMarkers(bool isLittleEndian) - { - byte[] bytes = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd(), - ByteOrderMarker = 0x1234 - } - .ToBytes(isLittleEndian); - - TiffImageFormatDetector formatDetector = new TiffImageFormatDetector(); - byte[] headerBytes = bytes.Take(formatDetector.HeaderSize).ToArray(); - var format = formatDetector.DetectFormat(headerBytes); - - Assert.Null(format); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void DetectFormat_ReturnsNull_WithIncorrectMagicNumber(bool isLittleEndian) - { - byte[] bytes = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd(), - MagicNumber = 32 - } - .ToBytes(isLittleEndian); - - TiffImageFormatDetector formatDetector = new TiffImageFormatDetector(); - byte[] headerBytes = bytes.Take(formatDetector.HeaderSize).ToArray(); - var format = formatDetector.DetectFormat(headerBytes); - - Assert.Null(format); - } - - [Theory] - [MemberData(nameof(IsLittleEndianValues))] - public void DetectFormat_ReturnsNull_WithShortHeader(bool isLittleEndian) - { - byte[] bytes = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd() - } - .ToBytes(isLittleEndian); - - TiffImageFormatDetector formatDetector = new TiffImageFormatDetector(); - byte[] headerBytes = bytes.Take(formatDetector.HeaderSize - 1).ToArray(); - var format = formatDetector.DetectFormat(headerBytes); - - Assert.Null(format); - } - } -} diff --git a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj index 0d9d055f16..e9d4b031ba 100644 --- a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj +++ b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj @@ -9,12 +9,6 @@ SixLabors.ImageSharp.Tests - - - - - - diff --git a/tests/ImageSharp.Tests/TestImages.cs b/tests/ImageSharp.Tests/TestImages.cs index 27ec39e704..92d5f1bcf0 100644 --- a/tests/ImageSharp.Tests/TestImages.cs +++ b/tests/ImageSharp.Tests/TestImages.cs @@ -497,12 +497,16 @@ namespace SixLabors.ImageSharp.Tests public static class Tiff { - public const string Benchmark_GrayscaleUncompressed = "Tiff/Benchmarks/jpeg444_big_grayscale_uncompressed.tiff"; - public const string Benchmark_PaletteUncompressed = "Tiff/Benchmarks/jpeg444_big_palette_uncompressed.tiff"; - public const string Benchmark_RgbDeflate = "Tiff/Benchmarks/jpeg444_big_rgb_deflate.tiff"; - public const string Benchmark_RgbLzw = "Tiff/Benchmarks/jpeg444_big_rgb_lzw.tiff"; - public const string Benchmark_RgbPackbits = "Tiff/Benchmarks/jpeg444_big_rgb_packbits.tiff"; - public const string Benchmark_RgbUncompressed = "Tiff/Benchmarks/jpeg444_big_rgb_uncompressed.tiff"; + public const string Benchmark_Path = "Tiff/Benchmarks/"; + public const string Benchmark_BwFax3 = "medium_bw_Fax3.tiff"; + public const string Benchmark_BwFax4 = "medium_bw_Fax4.tiff"; + public const string Benchmark_BwRle = "medium_bw_Rle.tiff"; + public const string Benchmark_GrayscaleUncompressed = "medium_grayscale_uncompressed.tiff"; + public const string Benchmark_PaletteUncompressed = "medium_palette_uncompressed.tiff"; + public const string Benchmark_RgbDeflate = "medium_rgb_deflate.tiff"; + public const string Benchmark_RgbLzw = "medium_rgb_lzw.tiff"; + public const string Benchmark_RgbPackbits = "medium_rgb_packbits.tiff"; + public const string Benchmark_RgbUncompressed = "medium_rgb_uncompressed.tiff"; public const string Calliphora_GrayscaleUncompressed = "Tiff/Calliphora_grayscale_uncompressed.tiff"; public const string Calliphora_GrayscaleDeflate_Predictor = "Tiff/Calliphora_gray_deflate_predictor.tiff"; diff --git a/tests/Images/Input/Tiff/Benchmarks/SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-report-github.md b/tests/Images/Input/Tiff/Benchmarks/SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-report-github.md index 68b149c50d..366c1480ab 100644 --- a/tests/Images/Input/Tiff/Benchmarks/SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-report-github.md +++ b/tests/Images/Input/Tiff/Benchmarks/SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-report-github.md @@ -1,69 +1,87 @@ ``` ini -BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19041.450 (2004/?/20H1) +BenchmarkDotNet=v0.12.1, OS=Windows 10.0.19042 Intel Core i7-3610QM CPU 2.30GHz (Ivy Bridge), 1 CPU, 8 logical and 4 physical cores -.NET Core SDK=3.1.401 - [Host] : .NET Core 3.1.7 (CoreCLR 4.700.20.36602, CoreFX 4.700.20.37001), X64 RyuJIT - Job-MTZTUC : .NET Framework 4.8 (4.8.4200.0), X64 RyuJIT - Job-BGVYTJ : .NET Core 2.1.21 (CoreCLR 4.6.29130.01, CoreFX 4.6.29130.02), X64 RyuJIT - Job-ZDUDFU : .NET Core 3.1.7 (CoreCLR 4.700.20.36602, CoreFX 4.700.20.37001), X64 RyuJIT +.NET Core SDK=5.0.100 + [Host] : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT + Job-KSIANY : .NET Framework 4.8 (4.8.4250.0), X64 RyuJIT + Job-VMCLSF : .NET Core 2.1.23 (CoreCLR 4.6.29321.03, CoreFX 4.6.29321.01), X64 RyuJIT + Job-UHENIY : .NET Core 3.1.9 (CoreCLR 4.700.20.47201, CoreFX 4.700.20.47203), X64 RyuJIT InvocationCount=1 IterationCount=5 LaunchCount=1 UnrollFactor=1 WarmupCount=3 ``` -| Method | Job | Runtime | TestImage | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated | -|---------------------- |----------- |-------------- |-------------------------------------------------------- |------------:|------------:|------------:|-------:|--------:|------------:|----------:|----------:|-------------:| -| **'System.Drawing Tiff'** | **Job-MTZTUC** | **.NET 4.7.2** | **Tiff/Benchmarks/jpeg444_big_grayscale_uncompressed.tiff** | **180.2 ms** | **15.21 ms** | **2.35 ms** | **1.00** | **0.00** | **85000.0000** | **-** | **-** | **269221840 B** | -| 'ImageSharp Tiff' | Job-MTZTUC | .NET 4.7.2 | Tiff/Benchmarks/jpeg444_big_grayscale_uncompressed.tiff | 31,527.8 ms | 4,371.70 ms | 1,135.32 ms | 176.11 | 8.81 | 1000.0000 | 1000.0000 | 1000.0000 | 1342029912 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_grayscale_uncompressed.tiff | 185.5 ms | 15.88 ms | 2.46 ms | 1.00 | 0.00 | 85000.0000 | - | - | 268813936 B | -| 'ImageSharp Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_grayscale_uncompressed.tiff | 17,768.7 ms | 116.03 ms | 30.13 ms | 95.84 | 1.13 | 1000.0000 | 1000.0000 | 1000.0000 | 1342016464 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_grayscale_uncompressed.tiff | 149.9 ms | 8.23 ms | 1.27 ms | 1.00 | 0.00 | - | - | - | 176 B | -| 'ImageSharp Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_grayscale_uncompressed.tiff | 16,782.2 ms | 718.14 ms | 111.13 ms | 111.94 | 0.80 | 1000.0000 | 1000.0000 | 1000.0000 | 1342016440 B | -| | | | | | | | | | | | | | -| **'System.Drawing Tiff'** | **Job-MTZTUC** | **.NET 4.7.2** | **Tiff/Benchmarks/jpeg444_big_palette_uncompressed.tiff** | **178.0 ms** | **7.07 ms** | **1.83 ms** | **1.00** | **0.00** | **85000.0000** | **-** | **-** | **269221840 B** | -| 'ImageSharp Tiff' | Job-MTZTUC | .NET 4.7.2 | Tiff/Benchmarks/jpeg444_big_palette_uncompressed.tiff | 33,721.9 ms | 78.03 ms | 12.08 ms | 188.96 | 1.80 | 1000.0000 | 1000.0000 | 1000.0000 | 1342023280 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_palette_uncompressed.tiff | 180.1 ms | 8.81 ms | 2.29 ms | 1.00 | 0.00 | 85000.0000 | - | - | 268815616 B | -| 'ImageSharp Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_palette_uncompressed.tiff | 22,941.4 ms | 728.12 ms | 189.09 ms | 127.37 | 1.07 | 1000.0000 | 1000.0000 | 1000.0000 | 1342022368 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_palette_uncompressed.tiff | 145.5 ms | 3.20 ms | 0.50 ms | 1.00 | 0.00 | - | - | - | 176 B | -| 'ImageSharp Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_palette_uncompressed.tiff | 21,485.0 ms | 711.10 ms | 184.67 ms | 148.04 | 0.66 | 1000.0000 | 1000.0000 | 1000.0000 | 1342025632 B | -| | | | | | | | | | | | | | -| **'System.Drawing Tiff'** | **Job-MTZTUC** | **.NET 4.7.2** | **Tiff/Benchmarks/jpeg444_big_rgb_deflate.tiff** | **2,518.2 ms** | **76.22 ms** | **19.79 ms** | **1.00** | **0.00** | **6000.0000** | **-** | **-** | **29598616 B** | -| 'ImageSharp Tiff' | Job-MTZTUC | .NET 4.7.2 | Tiff/Benchmarks/jpeg444_big_rgb_deflate.tiff | 29,327.2 ms | 102.72 ms | 26.68 ms | 11.65 | 0.10 | 1000.0000 | 1000.0000 | 1000.0000 | 1124088224 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_rgb_deflate.tiff | 2,500.3 ms | 67.24 ms | 10.41 ms | 1.00 | 0.00 | 6000.0000 | - | - | 29528752 B | -| 'ImageSharp Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_rgb_deflate.tiff | 18,974.7 ms | 199.58 ms | 30.89 ms | 7.59 | 0.04 | 1000.0000 | 1000.0000 | 1000.0000 | 1123947608 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_rgb_deflate.tiff | 2,541.1 ms | 21.36 ms | 5.55 ms | 1.00 | 0.00 | - | - | - | 176 B | -| 'ImageSharp Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_rgb_deflate.tiff | 17,974.8 ms | 751.73 ms | 116.33 ms | 7.07 | 0.04 | 1000.0000 | 1000.0000 | 1000.0000 | 1123949960 B | -| | | | | | | | | | | | | | -| **'System.Drawing Tiff'** | **Job-MTZTUC** | **.NET 4.7.2** | **Tiff/Benchmarks/jpeg444_big_rgb_lzw.tiff** | **3,368.4 ms** | **40.71 ms** | **6.30 ms** | **1.00** | **0.00** | **4000.0000** | **-** | **-** | **22835824 B** | -| 'ImageSharp Tiff' | Job-MTZTUC | .NET 4.7.2 | Tiff/Benchmarks/jpeg444_big_rgb_lzw.tiff | 28,919.9 ms | 705.58 ms | 183.24 ms | 8.57 | 0.04 | 1000.0000 | 1000.0000 | 1000.0000 | 1123956384 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_rgb_lzw.tiff | 3,365.1 ms | 36.93 ms | 5.72 ms | 1.00 | 0.00 | 4000.0000 | - | - | 22789840 B | -| 'ImageSharp Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_rgb_lzw.tiff | 17,905.1 ms | 40.08 ms | 10.41 ms | 5.32 | 0.01 | 1000.0000 | 1000.0000 | 1000.0000 | 1123949072 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_rgb_lzw.tiff | 3,377.6 ms | 125.36 ms | 32.56 ms | 1.00 | 0.00 | - | - | - | 176 B | -| 'ImageSharp Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_rgb_lzw.tiff | 16,998.0 ms | 460.59 ms | 119.61 ms | 5.03 | 0.07 | 1000.0000 | 1000.0000 | 1000.0000 | 1123952144 B | -| | | | | | | | | | | | | | -| **'System.Drawing Tiff'** | **Job-MTZTUC** | **.NET 4.7.2** | **Tiff/Benchmarks/jpeg444_big_rgb_packbits.tiff** | **1,849.3 ms** | **43.52 ms** | **11.30 ms** | **1.00** | **0.00** | **255000.0000** | **-** | **-** | **812350880 B** | -| 'ImageSharp Tiff' | Job-MTZTUC | .NET 4.7.2 | Tiff/Benchmarks/jpeg444_big_rgb_packbits.tiff | 29,360.0 ms | 157.78 ms | 40.98 ms | 15.88 | 0.12 | - | - | - | 2690323752 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_rgb_packbits.tiff | 1,882.7 ms | 64.85 ms | 16.84 ms | 1.00 | 0.00 | 255000.0000 | - | - | 811943568 B | -| 'ImageSharp Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_rgb_packbits.tiff | 18,967.7 ms | 445.86 ms | 115.79 ms | 10.08 | 0.09 | - | - | - | 2690318648 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_rgb_packbits.tiff | 1,743.2 ms | 78.50 ms | 20.39 ms | 1.00 | 0.00 | - | - | - | 176 B | -| 'ImageSharp Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_rgb_packbits.tiff | 17,379.6 ms | 243.53 ms | 63.24 ms | 9.97 | 0.10 | - | - | - | 2690321912 B | -| | | | | | | | | | | | | | -| **'System.Drawing Tiff'** | **Job-MTZTUC** | **.NET 4.7.2** | **Tiff/Benchmarks/jpeg444_big_rgb_uncompressed.tiff** | **758.5 ms** | **9.75 ms** | **2.53 ms** | **1.00** | **0.00** | **255000.0000** | **-** | **-** | **806059984 B** | -| 'ImageSharp Tiff' | Job-MTZTUC | .NET 4.7.2 | Tiff/Benchmarks/jpeg444_big_rgb_uncompressed.tiff | 29,198.2 ms | 677.81 ms | 176.03 ms | 38.50 | 0.19 | - | - | - | 1878827096 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_rgb_uncompressed.tiff | 760.1 ms | 15.95 ms | 2.47 ms | 1.00 | 0.00 | 255000.0000 | - | - | 805652192 B | -| 'ImageSharp Tiff' | Job-BGVYTJ | .NET Core 2.1 | Tiff/Benchmarks/jpeg444_big_rgb_uncompressed.tiff | 18,457.2 ms | 35.60 ms | 5.51 ms | 24.28 | 0.08 | - | - | - | 1878821992 B | -| | | | | | | | | | | | | | -| 'System.Drawing Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_rgb_uncompressed.tiff | 629.5 ms | 11.40 ms | 2.96 ms | 1.00 | 0.00 | - | - | - | 176 B | -| 'ImageSharp Tiff' | Job-ZDUDFU | .NET Core 3.1 | Tiff/Benchmarks/jpeg444_big_rgb_uncompressed.tiff | 17,579.8 ms | 371.72 ms | 96.54 ms | 27.93 | 0.11 | - | - | - | 1878825256 B | +| Method | Job | Runtime | TestImage | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated | +|---------------------- |----------- |-------------- |----------------------------------- |-----------:|----------:|----------:|------:|--------:|-----------:|----------:|----------:|------------:| +| **'System.Drawing Tiff'** | **Job-KSIANY** | **.NET 4.7.2** | **medium_bw_Fax3.tiff** | **491.6 ms** | **20.40 ms** | **5.30 ms** | **1.00** | **0.00** | **1000.0000** | **-** | **-** | **5768128 B** | +| 'ImageSharp Tiff' | Job-KSIANY | .NET 4.7.2 | medium_bw_Fax3.tiff | 6,970.2 ms | 70.64 ms | 10.93 ms | 14.23 | 0.12 | 1000.0000 | 1000.0000 | 1000.0000 | 241518600 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_bw_Fax3.tiff | 486.2 ms | 23.15 ms | 3.58 ms | 1.00 | 0.00 | 1000.0000 | - | - | 5751016 B | +| 'ImageSharp Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_bw_Fax3.tiff | 4,150.2 ms | 322.16 ms | 83.66 ms | 8.47 | 0.16 | - | - | - | 235961088 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-UHENIY | .NET Core 3.1 | medium_bw_Fax3.tiff | 490.1 ms | 12.76 ms | 3.31 ms | 1.00 | 0.00 | - | - | - | 176 B | +| 'ImageSharp Tiff' | Job-UHENIY | .NET Core 3.1 | medium_bw_Fax3.tiff | 3,582.9 ms | 61.89 ms | 16.07 ms | 7.31 | 0.06 | - | - | - | 235961496 B | +| | | | | | | | | | | | | | +| **'System.Drawing Tiff'** | **Job-KSIANY** | **.NET 4.7.2** | **medium_bw_Rle.tiff** | **499.1 ms** | **26.71 ms** | **6.94 ms** | **1.00** | **0.00** | **1000.0000** | **-** | **-** | **8494472 B** | +| 'ImageSharp Tiff' | Job-KSIANY | .NET 4.7.2 | medium_bw_Rle.tiff | 7,290.4 ms | 938.28 ms | 243.67 ms | 14.61 | 0.33 | 1000.0000 | 1000.0000 | 1000.0000 | 237020384 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_bw_Rle.tiff | 490.6 ms | 30.19 ms | 4.67 ms | 1.00 | 0.00 | 1000.0000 | - | - | 8475688 B | +| 'ImageSharp Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_bw_Rle.tiff | 4,230.2 ms | 35.59 ms | 5.51 ms | 8.62 | 0.08 | - | - | - | 235961944 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-UHENIY | .NET Core 3.1 | medium_bw_Rle.tiff | 487.6 ms | 12.07 ms | 1.87 ms | 1.00 | 0.00 | - | - | - | 176 B | +| 'ImageSharp Tiff' | Job-UHENIY | .NET Core 3.1 | medium_bw_Rle.tiff | 3,647.4 ms | 42.62 ms | 11.07 ms | 7.48 | 0.04 | - | - | - | 235962184 B | +| | | | | | | | | | | | | | +| **'System.Drawing Tiff'** | **Job-KSIANY** | **.NET 4.7.2** | **medium_grayscale_uncompressed.tiff** | **606.7 ms** | **20.45 ms** | **5.31 ms** | **1.00** | **0.00** | **18000.0000** | **-** | **-** | **90301696 B** | +| 'ImageSharp Tiff' | Job-KSIANY | .NET 4.7.2 | medium_grayscale_uncompressed.tiff | 1,852.9 ms | 6.74 ms | 1.75 ms | 3.05 | 0.03 | - | - | - | 235970584 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_grayscale_uncompressed.tiff | 606.6 ms | 36.58 ms | 9.50 ms | 1.00 | 0.00 | 18000.0000 | - | - | 90104048 B | +| 'ImageSharp Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_grayscale_uncompressed.tiff | 764.3 ms | 15.69 ms | 4.08 ms | 1.26 | 0.02 | - | - | - | 235965376 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-UHENIY | .NET Core 3.1 | medium_grayscale_uncompressed.tiff | 569.6 ms | 17.44 ms | 4.53 ms | 1.00 | 0.00 | - | - | - | 176 B | +| 'ImageSharp Tiff' | Job-UHENIY | .NET Core 3.1 | medium_grayscale_uncompressed.tiff | 655.2 ms | 17.48 ms | 4.54 ms | 1.15 | 0.01 | - | - | - | 235965488 B | +| | | | | | | | | | | | | | +| **'System.Drawing Tiff'** | **Job-KSIANY** | **.NET 4.7.2** | **medium_palette_uncompressed.tiff** | **578.0 ms** | **22.32 ms** | **5.80 ms** | **1.00** | **0.00** | **18000.0000** | **-** | **-** | **90301696 B** | +| 'ImageSharp Tiff' | Job-KSIANY | .NET 4.7.2 | medium_palette_uncompressed.tiff | 3,336.9 ms | 21.42 ms | 5.56 ms | 5.77 | 0.07 | - | - | - | 236003608 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_palette_uncompressed.tiff | 601.9 ms | 40.85 ms | 6.32 ms | 1.00 | 0.00 | 18000.0000 | - | - | 90107368 B | +| 'ImageSharp Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_palette_uncompressed.tiff | 1,971.9 ms | 15.69 ms | 4.07 ms | 3.28 | 0.04 | - | - | - | 235996096 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-UHENIY | .NET Core 3.1 | medium_palette_uncompressed.tiff | 566.1 ms | 28.06 ms | 4.34 ms | 1.00 | 0.00 | - | - | - | 176 B | +| 'ImageSharp Tiff' | Job-UHENIY | .NET Core 3.1 | medium_palette_uncompressed.tiff | 1,664.1 ms | 11.59 ms | 1.79 ms | 2.94 | 0.02 | - | - | - | 235996208 B | +| | | | | | | | | | | | | | +| **'System.Drawing Tiff'** | **Job-KSIANY** | **.NET 4.7.2** | **medium_rgb_deflate.tiff** | **357.4 ms** | **15.54 ms** | **2.40 ms** | **1.00** | **0.00** | **3000.0000** | **-** | **-** | **9662560 B** | +| 'ImageSharp Tiff' | Job-KSIANY | .NET 4.7.2 | medium_rgb_deflate.tiff | 776.1 ms | 14.51 ms | 3.77 ms | 2.17 | 0.01 | 22000.0000 | 1000.0000 | 1000.0000 | 303476856 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_rgb_deflate.tiff | 359.7 ms | 12.29 ms | 3.19 ms | 1.00 | 0.00 | 3000.0000 | - | - | 9629400 B | +| 'ImageSharp Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_rgb_deflate.tiff | 554.5 ms | 16.78 ms | 4.36 ms | 1.54 | 0.02 | 2000.0000 | 1000.0000 | 1000.0000 | 239716144 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-UHENIY | .NET Core 3.1 | medium_rgb_deflate.tiff | 353.2 ms | 7.22 ms | 1.12 ms | 1.00 | 0.00 | - | - | - | 176 B | +| 'ImageSharp Tiff' | Job-UHENIY | .NET Core 3.1 | medium_rgb_deflate.tiff | 557.1 ms | 10.79 ms | 2.80 ms | 1.58 | 0.00 | 2000.0000 | 1000.0000 | 1000.0000 | 239470552 B | +| | | | | | | | | | | | | | +| **'System.Drawing Tiff'** | **Job-KSIANY** | **.NET 4.7.2** | **medium_rgb_lzw.tiff** | **511.0 ms** | **6.43 ms** | **1.67 ms** | **1.00** | **0.00** | **3000.0000** | **-** | **-** | **11600840 B** | +| 'ImageSharp Tiff' | Job-KSIANY | .NET 4.7.2 | medium_rgb_lzw.tiff | 2,691.6 ms | 16.81 ms | 2.60 ms | 5.27 | 0.02 | - | - | - | 236044312 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_rgb_lzw.tiff | 511.4 ms | 11.44 ms | 1.77 ms | 1.00 | 0.00 | 3000.0000 | - | - | 11569776 B | +| 'ImageSharp Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_rgb_lzw.tiff | 1,654.1 ms | 12.42 ms | 1.92 ms | 3.23 | 0.01 | - | - | - | 236041592 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-UHENIY | .NET Core 3.1 | medium_rgb_lzw.tiff | 507.7 ms | 8.89 ms | 2.31 ms | 1.00 | 0.00 | - | - | - | 176 B | +| 'ImageSharp Tiff' | Job-UHENIY | .NET Core 3.1 | medium_rgb_lzw.tiff | 1,689.5 ms | 40.41 ms | 6.25 ms | 3.33 | 0.03 | - | - | - | 236041656 B | +| | | | | | | | | | | | | | +| **'System.Drawing Tiff'** | **Job-KSIANY** | **.NET 4.7.2** | **medium_rgb_packbits.tiff** | **776.8 ms** | **31.69 ms** | **8.23 ms** | **1.00** | **0.00** | **56000.0000** | **-** | **-** | **304057016 B** | +| 'ImageSharp Tiff' | Job-KSIANY | .NET 4.7.2 | medium_rgb_packbits.tiff | 531.2 ms | 23.17 ms | 6.02 ms | 0.68 | 0.01 | - | - | - | 236003352 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_rgb_packbits.tiff | 764.2 ms | 41.43 ms | 6.41 ms | 1.00 | 0.00 | 56000.0000 | - | - | 303861120 B | +| 'ImageSharp Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_rgb_packbits.tiff | 300.0 ms | 4.39 ms | 0.68 ms | 0.39 | 0.00 | - | - | - | 235998408 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-UHENIY | .NET Core 3.1 | medium_rgb_packbits.tiff | 659.1 ms | 34.59 ms | 8.98 ms | 1.00 | 0.00 | - | - | - | 176 B | +| 'ImageSharp Tiff' | Job-UHENIY | .NET Core 3.1 | medium_rgb_packbits.tiff | 297.5 ms | 21.13 ms | 5.49 ms | 0.45 | 0.00 | - | - | - | 235998520 B | +| | | | | | | | | | | | | | +| **'System.Drawing Tiff'** | **Job-KSIANY** | **.NET 4.7.2** | **medium_rgb_uncompressed.tiff** | **742.5 ms** | **50.45 ms** | **13.10 ms** | **1.00** | **0.00** | **55000.0000** | **-** | **-** | **302644272 B** | +| 'ImageSharp Tiff' | Job-KSIANY | .NET 4.7.2 | medium_rgb_uncompressed.tiff | 414.3 ms | 15.37 ms | 3.99 ms | 0.56 | 0.01 | - | - | - | 235986968 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_rgb_uncompressed.tiff | 750.2 ms | 74.13 ms | 19.25 ms | 1.00 | 0.00 | 55000.0000 | - | - | 302448096 B | +| 'ImageSharp Tiff' | Job-VMCLSF | .NET Core 2.1 | medium_rgb_uncompressed.tiff | 283.6 ms | 21.56 ms | 5.60 ms | 0.38 | 0.01 | - | - | - | 235981128 B | +| | | | | | | | | | | | | | +| 'System.Drawing Tiff' | Job-UHENIY | .NET Core 3.1 | medium_rgb_uncompressed.tiff | 662.6 ms | 49.79 ms | 12.93 ms | 1.00 | 0.00 | - | - | - | 176 B | +| 'ImageSharp Tiff' | Job-UHENIY | .NET Core 3.1 | medium_rgb_uncompressed.tiff | 278.6 ms | 9.48 ms | 2.46 ms | 0.42 | 0.01 | - | - | - | 235981352 B | diff --git a/tests/Images/Input/Tiff/Benchmarks/SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-report.html b/tests/Images/Input/Tiff/Benchmarks/SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-report.html index 406b728191..10fd01fd45 100644 --- a/tests/Images/Input/Tiff/Benchmarks/SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-report.html +++ b/tests/Images/Input/Tiff/Benchmarks/SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-report.html @@ -2,7 +2,7 @@ -SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-20200824-095044 +SixLabors.ImageSharp.Benchmarks.Codecs.DecodeTiffBig-20201209-175548