From 6979a7248b700a941cfbdc84408f4bb292397ca3 Mon Sep 17 00:00:00 2001 From: Andrew Wilkinson Date: Tue, 4 Apr 2017 21:26:57 +0100 Subject: [PATCH] Update TIFF codec to new IImageDecoder signature --- src/ImageSharp/Formats/Tiff/TiffDecoder.cs | 7 ++- .../Formats/Tiff/TiffDecoderCore.cs | 31 +++++++---- .../Formats/Tiff/TiffDecoderHeaderTests.cs | 53 +++++++++---------- .../Formats/Tiff/TiffDecoderIfdEntryTests.cs | 2 +- .../Formats/Tiff/TiffDecoderIfdTests.cs | 8 +-- .../Formats/Tiff/TiffDecoderImageTests.cs | 38 ++++++------- .../Formats/Tiff/TiffIfd/TiffIfdTests.cs | 1 - 7 files changed, 71 insertions(+), 69 deletions(-) diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoder.cs b/src/ImageSharp/Formats/Tiff/TiffDecoder.cs index 794fb4f1f1..333c707e31 100644 --- a/src/ImageSharp/Formats/Tiff/TiffDecoder.cs +++ b/src/ImageSharp/Formats/Tiff/TiffDecoder.cs @@ -13,15 +13,14 @@ namespace ImageSharp.Formats public class TiffDecoder : IImageDecoder { /// - public void Decode(Image image, Stream stream, IDecoderOptions options) + public Image Decode(Configuration configuration, Stream stream, IDecoderOptions options) where TColor : struct, IPixel { - Guard.NotNull(image, "image"); Guard.NotNull(stream, "stream"); - using (TiffDecoderCore decoder = new TiffDecoderCore(options)) + using (TiffDecoderCore decoder = new TiffDecoderCore(options, configuration)) { - decoder.Decode(image, stream, false); + return decoder.Decode(stream); } } } diff --git a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs index d5d7d06b86..d9086c95a7 100644 --- a/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs +++ b/src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs @@ -21,12 +21,19 @@ namespace ImageSharp.Formats /// private readonly IDecoderOptions options; + /// + /// The global configuration + /// + private readonly Configuration configuration; + /// /// Initializes a new instance of the class. /// /// The decoder options. - public TiffDecoderCore(IDecoderOptions options) + /// The configuration. + public TiffDecoderCore(IDecoderOptions options, Configuration configuration) { + this.configuration = configuration ?? Configuration.Default; this.options = options ?? new DecoderOptions(); } @@ -36,8 +43,9 @@ namespace ImageSharp.Formats /// The input stream. /// A flag indicating if the file is encoded in little-endian or big-endian format. /// The decoder options. - public TiffDecoderCore(Stream stream, bool isLittleEndian, IDecoderOptions options) - : this(options) + /// The configuration. + public TiffDecoderCore(Stream stream, bool isLittleEndian, IDecoderOptions options, Configuration configuration) + : this(options, configuration) { this.InputStream = stream; this.IsLittleEndian = isLittleEndian; @@ -75,17 +83,18 @@ namespace ImageSharp.Formats /// the data to image. /// /// The pixel format. - /// The image, where the data should be set to. /// The stream, where the image should be. - /// Whether to decode metadata only. - public void Decode(Image image, Stream stream, bool metadataOnly) + /// The decoded image. + public Image Decode(Stream stream) where TColor : struct, IPixel { this.InputStream = stream; uint firstIfdOffset = this.ReadHeader(); TiffIfd firstIfd = this.ReadIfd(firstIfdOffset); - this.DecodeImage(firstIfd, image); + Image image = this.DecodeImage(firstIfd); + + return image; } /// @@ -168,8 +177,8 @@ namespace ImageSharp.Formats /// /// The pixel format. /// The IFD to read the image from. - /// The image, where the data should be set to. - public void DecodeImage(TiffIfd ifd, Image image) + /// The decoded image. + public Image DecodeImage(TiffIfd ifd) where TColor : struct, IPixel { if (!ifd.TryGetIfdEntry(TiffTags.ImageLength, out TiffIfdEntry imageLengthEntry) @@ -181,7 +190,7 @@ namespace ImageSharp.Formats int width = (int)this.ReadUnsignedInteger(ref imageWidthEntry); int height = (int)this.ReadUnsignedInteger(ref imageLengthEntry); - image.InitPixels(width, height); + Image image = Image.Create(width, height, this.configuration); TiffResolutionUnit resolutionUnit = TiffResolutionUnit.Inch; if (ifd.TryGetIfdEntry(TiffTags.ResolutionUnit, out TiffIfdEntry resolutionUnitEntry)) @@ -233,6 +242,8 @@ namespace ImageSharp.Formats } } } + + return image; } /// diff --git a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderHeaderTests.cs b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderHeaderTests.cs index 11c999a0f3..48d64b71c6 100644 --- a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderHeaderTests.cs +++ b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderHeaderTests.cs @@ -20,12 +20,12 @@ namespace ImageSharp.Tests public void ReadHeader_ReadsEndianness(bool isLittleEndian) { Stream stream = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd() - } + { + FirstIfd = new TiffGenIfd() + } .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, false, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, false, null, null); decoder.ReadHeader(); @@ -37,12 +37,12 @@ namespace ImageSharp.Tests public void ReadHeader_ReadsFirstIfdOffset(bool isLittleEndian) { Stream stream = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd() - } + { + FirstIfd = new TiffGenIfd() + } .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, false, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, false, null, null); uint firstIfdOffset = decoder.ReadHeader(); @@ -60,16 +60,16 @@ namespace ImageSharp.Tests public void Decode_ThrowsException_WithInvalidByteOrderMarkers(ushort byteOrderMarker) { Stream stream = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd(), - ByteOrderMarker = byteOrderMarker - } + { + FirstIfd = new TiffGenIfd(), + ByteOrderMarker = byteOrderMarker + } .ToStream(true); TiffDecoder decoder = new TiffDecoder(); - + ImageFormatException e = Assert.Throws(() => { TestDecode(decoder, stream); }); - + Assert.Equal("Invalid TIFF file header.", e.Message); } @@ -78,16 +78,16 @@ namespace ImageSharp.Tests public void Decode_ThrowsException_WithIncorrectMagicNumber(bool isLittleEndian) { Stream stream = new TiffGenHeader() - { - FirstIfd = new TiffGenIfd(), - MagicNumber = 32 - } + { + FirstIfd = new TiffGenIfd(), + MagicNumber = 32 + } .ToStream(isLittleEndian); TiffDecoder decoder = new TiffDecoder(); - + ImageFormatException e = Assert.Throws(() => { TestDecode(decoder, stream); }); - + Assert.Equal("Invalid TIFF file header.", e.Message); } @@ -96,23 +96,22 @@ namespace ImageSharp.Tests public void Decode_ThrowsException_WithNoIfdZero(bool isLittleEndian) { Stream stream = new TiffGenHeader() - { - FirstIfd = null - } + { + FirstIfd = null + } .ToStream(isLittleEndian); TiffDecoder decoder = new TiffDecoder(); - + ImageFormatException e = Assert.Throws(() => { TestDecode(decoder, stream); }); - + Assert.Equal("Invalid TIFF file header.", e.Message); } private void TestDecode(TiffDecoder decoder, Stream stream) { Configuration.Default.AddImageFormat(new TiffFormat()); - Image image = new Image(1,1); - decoder.Decode(image, stream, null); + Image image = decoder.Decode(Configuration.Default, stream, null); } } } \ No newline at end of file diff --git a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdEntryTests.cs b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdEntryTests.cs index f8dcfed53a..846495f671 100644 --- a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdEntryTests.cs +++ b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdEntryTests.cs @@ -836,7 +836,7 @@ namespace ImageSharp.Tests } .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfdEntry ifdEntry = decoder.ReadIfd(0).Entries[0]; return (decoder, ifdEntry); diff --git a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdTests.cs b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdTests.cs index 7aa60af82c..a8d01cf27e 100644 --- a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdTests.cs +++ b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdTests.cs @@ -30,7 +30,7 @@ namespace ImageSharp.Tests } .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); Assert.Equal(18u, ifd.NextIfdOffset); @@ -49,7 +49,7 @@ namespace ImageSharp.Tests } .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); Assert.Equal(0u, ifd.NextIfdOffset); @@ -73,7 +73,7 @@ namespace ImageSharp.Tests } .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); Assert.NotNull(ifd.Entries); @@ -96,7 +96,7 @@ namespace ImageSharp.Tests } .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); TiffIfdEntry entry = ifd.Entries[1]; diff --git a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderImageTests.cs b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderImageTests.cs index 4b5c77e1bb..b949318d91 100644 --- a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderImageTests.cs +++ b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderImageTests.cs @@ -29,11 +29,9 @@ namespace ImageSharp.Tests Stream stream = CreateTiffGenIfd() .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); - Image image = new Image(1, 1); - - decoder.DecodeImage(ifd, image); + Image image = decoder.DecodeImage(ifd); Assert.Equal(ImageWidth, image.Width); Assert.Equal(ImageHeight, image.Height); @@ -82,11 +80,9 @@ namespace ImageSharp.Tests Stream stream = ifdGen.ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); - Image image = new Image(1, 1); - - decoder.DecodeImage(ifd, image); + Image image = decoder.DecodeImage(ifd); Assert.Equal(expectedHorizonalResolution, image.MetaData.HorizontalResolution, 10); Assert.Equal(expectedVerticalResolution, image.MetaData.VerticalResolution, 10); @@ -100,11 +96,10 @@ namespace ImageSharp.Tests .WithoutEntry(TiffTags.ImageWidth) .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); - Image image = new Image(1, 1); - var e = Assert.Throws(() => decoder.DecodeImage(ifd, image)); + var e = Assert.Throws(() => decoder.DecodeImage(ifd)); Assert.Equal("The TIFF IFD does not specify the image dimensions.", e.Message); } @@ -117,11 +112,10 @@ namespace ImageSharp.Tests .WithoutEntry(TiffTags.ImageLength) .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); - Image image = new Image(1, 1); - var e = Assert.Throws(() => decoder.DecodeImage(ifd, image)); + var e = Assert.Throws(() => decoder.DecodeImage(ifd)); Assert.Equal("The TIFF IFD does not specify the image dimensions.", e.Message); } @@ -135,7 +129,7 @@ namespace ImageSharp.Tests .WithEntry(TiffGenEntry.Integer(TiffTags.Compression, TiffType.Short, compression)) .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); decoder.ReadImageFormat(ifd); @@ -173,7 +167,7 @@ namespace ImageSharp.Tests .WithEntry(TiffGenEntry.Integer(TiffTags.Compression, TiffType.Short, compression)) .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); @@ -191,7 +185,7 @@ namespace ImageSharp.Tests .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, bitsPerSample)) .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); decoder.ReadImageFormat(ifd); @@ -209,7 +203,7 @@ namespace ImageSharp.Tests // .WithoutEntry(TiffTags.PhotometricInterpretation) // .ToStream(isLittleEndian); - // TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + // TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); // TiffIfd ifd = decoder.ReadIfd(0); // decoder.ReadImageFormat(ifd); @@ -224,7 +218,7 @@ namespace ImageSharp.Tests .WithoutEntry(TiffTags.PhotometricInterpretation) .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); @@ -263,7 +257,7 @@ namespace ImageSharp.Tests .WithEntry(TiffGenEntry.Integer(TiffTags.PhotometricInterpretation, TiffType.Short, photometricInterpretation)) .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); @@ -281,7 +275,7 @@ namespace ImageSharp.Tests .WithEntry(TiffGenEntry.Integer(TiffTags.BitsPerSample, TiffType.Short, bitsPerSample)) .ToStream(isLittleEndian); - TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null); + TiffDecoderCore decoder = new TiffDecoderCore(stream, isLittleEndian, null, null); TiffIfd ifd = decoder.ReadIfd(0); var e = Assert.Throws(() => decoder.ReadImageFormat(ifd)); @@ -293,7 +287,7 @@ namespace ImageSharp.Tests [InlineData(TiffColorType.WhiteIsZero8, 100, 80, 100 * 80)] public void CalculateImageBufferSize_ReturnsCorrectSize(ushort colorType, int width, int height, int expectedResult) { - TiffDecoderCore decoder = new TiffDecoderCore(null); + TiffDecoderCore decoder = new TiffDecoderCore(null, null); int bufferSize = decoder.CalculateImageBufferSize(width, height); diff --git a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffIfd/TiffIfdTests.cs b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffIfd/TiffIfdTests.cs index b9eea06b3f..97e46ef4e6 100644 --- a/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffIfd/TiffIfdTests.cs +++ b/tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffIfd/TiffIfdTests.cs @@ -5,7 +5,6 @@ namespace ImageSharp.Tests { - using System.IO; using Xunit; using ImageSharp.Formats.Tiff;