Browse Source

Update TIFF codec to new IImageDecoder signature

pull/119/head
Andrew Wilkinson 9 years ago
parent
commit
6979a7248b
  1. 7
      src/ImageSharp/Formats/Tiff/TiffDecoder.cs
  2. 31
      src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs
  3. 53
      tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderHeaderTests.cs
  4. 2
      tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdEntryTests.cs
  5. 8
      tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderIfdTests.cs
  6. 38
      tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffDecoderImageTests.cs
  7. 1
      tests/ImageSharp.Formats.Tiff.Tests/Formats/Tiff/TiffIfd/TiffIfdTests.cs

7
src/ImageSharp/Formats/Tiff/TiffDecoder.cs

@ -13,15 +13,14 @@ namespace ImageSharp.Formats
public class TiffDecoder : IImageDecoder
{
/// <inheritdoc/>
public void Decode<TColor>(Image<TColor> image, Stream stream, IDecoderOptions options)
public Image<TColor> Decode<TColor>(Configuration configuration, Stream stream, IDecoderOptions options)
where TColor : struct, IPixel<TColor>
{
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<TColor>(stream);
}
}
}

31
src/ImageSharp/Formats/Tiff/TiffDecoderCore.cs

@ -21,12 +21,19 @@ namespace ImageSharp.Formats
/// </summary>
private readonly IDecoderOptions options;
/// <summary>
/// The global configuration
/// </summary>
private readonly Configuration configuration;
/// <summary>
/// Initializes a new instance of the <see cref="TiffDecoderCore" /> class.
/// </summary>
/// <param name="options">The decoder options.</param>
public TiffDecoderCore(IDecoderOptions options)
/// <param name="configuration">The configuration.</param>
public TiffDecoderCore(IDecoderOptions options, Configuration configuration)
{
this.configuration = configuration ?? Configuration.Default;
this.options = options ?? new DecoderOptions();
}
@ -36,8 +43,9 @@ namespace ImageSharp.Formats
/// <param name="stream">The input stream.</param>
/// <param name="isLittleEndian">A flag indicating if the file is encoded in little-endian or big-endian format.</param>
/// <param name="options">The decoder options.</param>
public TiffDecoderCore(Stream stream, bool isLittleEndian, IDecoderOptions options)
: this(options)
/// <param name="configuration">The configuration.</param>
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.
/// </summary>
/// <typeparam name="TColor">The pixel format.</typeparam>
/// <param name="image">The image, where the data should be set to.</param>
/// <param name="stream">The stream, where the image should be.</param>
/// <param name="metadataOnly">Whether to decode metadata only.</param>
public void Decode<TColor>(Image<TColor> image, Stream stream, bool metadataOnly)
/// <returns>The decoded image.</returns>
public Image<TColor> Decode<TColor>(Stream stream)
where TColor : struct, IPixel<TColor>
{
this.InputStream = stream;
uint firstIfdOffset = this.ReadHeader();
TiffIfd firstIfd = this.ReadIfd(firstIfdOffset);
this.DecodeImage(firstIfd, image);
Image<TColor> image = this.DecodeImage<TColor>(firstIfd);
return image;
}
/// <summary>
@ -168,8 +177,8 @@ namespace ImageSharp.Formats
/// </summary>
/// <typeparam name="TColor">The pixel format.</typeparam>
/// <param name="ifd">The IFD to read the image from.</param>
/// <param name="image">The image, where the data should be set to.</param>
public void DecodeImage<TColor>(TiffIfd ifd, Image<TColor> image)
/// <returns>The decoded image.</returns>
public Image<TColor> DecodeImage<TColor>(TiffIfd ifd)
where TColor : struct, IPixel<TColor>
{
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<TColor> image = Image.Create<TColor>(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;
}
/// <summary>

53
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<ImageFormatException>(() => { 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<ImageFormatException>(() => { 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<ImageFormatException>(() => { 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<Color>(image, stream, null);
Image<Color> image = decoder.Decode<Color>(Configuration.Default, stream, null);
}
}
}

2
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);

8
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];

38
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<Color> image = new Image<Color>(1, 1);
decoder.DecodeImage(ifd, image);
Image<Color> image = decoder.DecodeImage<Color>(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<Color> image = new Image<Color>(1, 1);
decoder.DecodeImage(ifd, image);
Image<Color> image = decoder.DecodeImage<Color>(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<Color> image = new Image<Color>(1, 1);
var e = Assert.Throws<ImageFormatException>(() => decoder.DecodeImage(ifd, image));
var e = Assert.Throws<ImageFormatException>(() => decoder.DecodeImage<Color>(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<Color> image = new Image<Color>(1, 1);
var e = Assert.Throws<ImageFormatException>(() => decoder.DecodeImage(ifd, image));
var e = Assert.Throws<ImageFormatException>(() => decoder.DecodeImage<Color>(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<NotSupportedException>(() => 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<ImageFormatException>(() => 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<NotSupportedException>(() => 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<NotSupportedException>(() => 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);

1
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;

Loading…
Cancel
Save