mirror of https://github.com/SixLabors/ImageSharp
5 changed files with 997 additions and 0 deletions
@ -0,0 +1,354 @@ |
|||
// <copyright file="TiffIfdEntryCreator.cs" company="James Jackson-South">
|
|||
// Copyright (c) James Jackson-South and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
// </copyright>
|
|||
|
|||
namespace ImageSharp.Formats.Tiff |
|||
{ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Text; |
|||
|
|||
/// <summary>
|
|||
/// Utility class for generating TIFF IFD entries.
|
|||
/// </summary>
|
|||
internal static class TiffIfdEntryCreator |
|||
{ |
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Byte' from a unsigned integer.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddUnsignedByte(this List<TiffIfdEntry> entries, ushort tag, uint value) |
|||
{ |
|||
TiffIfdEntryCreator.AddUnsignedByte(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Byte' from an array of unsigned integers.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddUnsignedByte(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Short' from a unsigned integer.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddUnsignedShort(this List<TiffIfdEntry> entries, ushort tag, uint value) |
|||
{ |
|||
TiffIfdEntryCreator.AddUnsignedShort(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Short' from an array of unsigned integers.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddUnsignedShort(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Long' from a unsigned integer.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddUnsignedLong(this List<TiffIfdEntry> entries, ushort tag, uint value) |
|||
{ |
|||
TiffIfdEntryCreator.AddUnsignedLong(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Long' from an array of unsigned integers.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddUnsignedLong(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'SByte' from a signed integer.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddSignedByte(this List<TiffIfdEntry> entries, ushort tag, int value) |
|||
{ |
|||
TiffIfdEntryCreator.AddSignedByte(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'SByte' from an array of signed integers.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddSignedByte(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'SShort' from a signed integer.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddSignedShort(this List<TiffIfdEntry> entries, ushort tag, int value) |
|||
{ |
|||
TiffIfdEntryCreator.AddSignedShort(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'SShort' from an array of signed integers.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddSignedShort(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'SLong' from a signed integer.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddSignedLong(this List<TiffIfdEntry> entries, ushort tag, int value) |
|||
{ |
|||
TiffIfdEntryCreator.AddSignedLong(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'SLong' from an array of signed integers.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddSignedLong(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Ascii' from a string.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddAscii(this List<TiffIfdEntry> entries, ushort tag, string value) |
|||
{ |
|||
byte[] bytes = Encoding.UTF8.GetBytes(value + "\0"); |
|||
|
|||
entries.Add(new TiffIfdEntry(tag, TiffType.Ascii, (uint)bytes.Length, bytes)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Rational' from a <see cref="Rational"/>.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddUnsignedRational(this List<TiffIfdEntry> entries, ushort tag, Rational value) |
|||
{ |
|||
TiffIfdEntryCreator.AddUnsignedRational(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Rational' from an array of <see cref="Rational"/> values.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddUnsignedRational(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'SRational' from a <see cref="SignedRational"/>.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddSignedRational(this List<TiffIfdEntry> entries, ushort tag, SignedRational value) |
|||
{ |
|||
TiffIfdEntryCreator.AddSignedRational(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'SRational' from an array of <see cref="SignedRational"/> values.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddSignedRational(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Float' from a floating-point value.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddFloat(this List<TiffIfdEntry> entries, ushort tag, float value) |
|||
{ |
|||
TiffIfdEntryCreator.AddFloat(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Float' from an array of floating-point values.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddFloat(this List<TiffIfdEntry> 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)); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Double' from a floating-point value.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddDouble(this List<TiffIfdEntry> entries, ushort tag, double value) |
|||
{ |
|||
TiffIfdEntryCreator.AddDouble(entries, tag, new[] { value }); |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// Adds a new <see cref="TiffIfdEntry"/> of type 'Double' from an array of floating-point values.
|
|||
/// </summary>
|
|||
/// <param name="entries">The list of <see cref="TiffIfdEntry"/> to add the new entry to.</param>
|
|||
/// <param name="tag">The tag for the resulting entry.</param>
|
|||
/// <param name="value">The value for the resulting entry.</param>
|
|||
public static void AddDouble(this List<TiffIfdEntry> 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); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,58 @@ |
|||
// <copyright file="TiffEncoderMetadataTests.cs" company="James Jackson-South">
|
|||
// Copyright (c) James Jackson-South and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
// </copyright>
|
|||
|
|||
namespace ImageSharp.Tests |
|||
{ |
|||
using System; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using Xunit; |
|||
|
|||
using ImageSharp.Formats; |
|||
using ImageSharp.Formats.Tiff; |
|||
using System.Collections.Generic; |
|||
|
|||
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<Rgba32> image = new Image<Rgba32>(100, 100); |
|||
image.MetaData.HorizontalResolution = 40.0; |
|||
image.MetaData.VerticalResolution = 50.5; |
|||
TiffEncoderCore encoder = new TiffEncoderCore(null); |
|||
|
|||
List<TiffIfdEntry> ifdEntries = new List<TiffIfdEntry>(); |
|||
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<Rgba32> image = new Image<Rgba32>(100, 100); |
|||
image.MetaData.Properties.Add(new ImageProperty(metadataName, metadataValue)); |
|||
TiffEncoderCore encoder = new TiffEncoderCore(null); |
|||
|
|||
List<TiffIfdEntry> ifdEntries = new List<TiffIfdEntry>(); |
|||
encoder.AddMetadata(image, ifdEntries); |
|||
|
|||
Assert.Equal(metadataValue + "\0", ifdEntries.GetAscii(tag)); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,410 @@ |
|||
// <copyright file="TiffIfdEntryCreatorTests.cs" company="James Jackson-South">
|
|||
// Copyright (c) James Jackson-South and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
// </copyright>
|
|||
|
|||
namespace ImageSharp.Tests |
|||
{ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.IO; |
|||
using System.Linq; |
|||
using Xunit; |
|||
|
|||
using ImageSharp.Formats; |
|||
using ImageSharp.Formats.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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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<TiffIfdEntry>(); |
|||
|
|||
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); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,77 @@ |
|||
// <copyright file="TiffIfdParser.cs" company="James Jackson-South">
|
|||
// Copyright (c) James Jackson-South and contributors.
|
|||
// Licensed under the Apache License, Version 2.0.
|
|||
// </copyright>
|
|||
|
|||
namespace ImageSharp.Tests |
|||
{ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using ImageSharp.Formats.Tiff; |
|||
using Xunit; |
|||
|
|||
/// <summary>
|
|||
/// A utility data structure to decode Tiff IFD entries in unit tests.
|
|||
/// </summary>
|
|||
internal static class TiffIfdParser |
|||
{ |
|||
public static int? GetInteger(this List<TiffIfdEntry> 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<TiffIfdEntry> 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<TiffIfdEntry> 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); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue