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;