Browse Source

Add CieLab tests

af/merge-core
James Jackson-South 7 years ago
parent
commit
9ebebeac0f
  1. 2
      src/ImageSharp/ColorSpaces/CieLab.cs
  2. 5
      src/ImageSharp/ColorSpaces/CieLuv.cs
  3. 4
      src/ImageSharp/ColorSpaces/CieXyy.cs
  4. 2
      src/ImageSharp/ColorSpaces/CieXyz.cs
  5. 2
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieLuv.cs
  6. 11
      src/ImageSharp/ColorSpaces/HunterLab.cs
  7. 2
      src/ImageSharp/ColorSpaces/Lms.cs
  8. 103
      tests/ImageSharp.Tests/Colorspaces/Conversion/ApproximateColorspaceComparer.cs
  9. 16
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCieLchuvConversionTests.cs
  10. 83
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCieLuvConversionTests.cs
  11. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCieXyyConversionTests.cs
  12. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCmykConversionTests.cs
  13. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndHslConversionTests.cs
  14. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndHsvConversionTests.cs
  15. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndHunterLabConversionTests.cs
  16. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndLinearRgbConversionTests.cs
  17. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndLmsConversionTests.cs
  18. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndRgbConversionTests.cs
  19. 79
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndYCbCrConversionTests.cs
  20. 2
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndCieLchuvConversionTests.cs
  21. 41
      tests/ImageSharp.Tests/Colorspaces/Conversion/VonKriesChromaticAdaptationTests.cs

2
src/ImageSharp/ColorSpaces/CieLab.cs

@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
public CieLab(Vector3 vector, CieXyz whitePoint)
: this()
{
// Not clamping as documentation about this space seems to indicate "usual" ranges
// Not clamping as documentation about this space only indicates "usual" ranges
this.L = vector.X;
this.A = vector.Y;
this.B = vector.Z;

5
src/ImageSharp/ColorSpaces/CieLuv.cs

@ -15,9 +15,6 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// </summary>
public readonly struct CieLuv : IEquatable<CieLuv>
{
private static readonly Vector3 Min = new Vector3(0, -100, -100);
private static readonly Vector3 Max = new Vector3(100, 100, 100);
/// <summary>
/// D65 standard illuminant.
/// Used when reference white is not specified explicitly.
@ -92,7 +89,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
[MethodImpl(InliningOptions.ShortMethod)]
public CieLuv(Vector3 vector, CieXyz whitePoint)
{
vector = Vector3.Clamp(vector, Min, Max);
// Not clamping as documentation about this space only indicates "usual" ranges
this.L = vector.X;
this.U = vector.Y;
this.V = vector.Z;

4
src/ImageSharp/ColorSpaces/CieXyy.cs

@ -40,7 +40,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
[MethodImpl(InliningOptions.ShortMethod)]
public CieXyy(float x, float y, float yl)
{
// Not clamping as documentation about this space seems to indicate "usual" ranges
// Not clamping as documentation about this space only indicates "usual" ranges
this.X = x;
this.Y = y;
this.Yl = yl;
@ -54,7 +54,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
public CieXyy(Vector3 vector)
: this()
{
// Not clamping as documentation about this space seems to indicate "usual" ranges
// Not clamping as documentation about this space only indicates "usual" ranges
this.X = vector.X;
this.Y = vector.Y;
this.Yl = vector.Z;

2
src/ImageSharp/ColorSpaces/CieXyz.cs

@ -50,7 +50,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
public CieXyz(Vector3 vector)
: this()
{
// Not clamping as documentation about this space seems to indicate "usual" ranges
// Not clamping as documentation about this space only indicates "usual" ranges
this.X = vector.X;
this.Y = vector.Y;
this.Z = vector.Z;

2
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieLuv.cs

@ -154,7 +154,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
public CieLuv ToCieLuv(in CieXyz color)
{
// Adaptation
CieXyz adapted = this.Adapt(color, this.whitePoint, this.targetLabWhitePoint);
CieXyz adapted = this.Adapt(color, this.whitePoint, this.targetLuvWhitePoint);
// Conversion
return this.cieXyzToCieLuvConverter.Convert(adapted);

11
src/ImageSharp/ColorSpaces/HunterLab.cs

@ -13,9 +13,6 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// </summary>
public readonly struct HunterLab : IEquatable<HunterLab>
{
private static readonly Vector3 Min = new Vector3(0, -100, -100);
private static readonly Vector3 Max = new Vector3(100, 100, 100);
/// <summary>
/// D50 standard illuminant.
/// Used when reference white is not specified explicitly.
@ -24,19 +21,19 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <summary>
/// Gets the lightness dimension.
/// <remarks>A value ranging between 0 (black), 100 (diffuse white) or higher (specular white).</remarks>
/// <remarks>A value usually ranging between 0 (black), 100 (diffuse white) or higher (specular white).</remarks>
/// </summary>
public readonly float L;
/// <summary>
/// Gets the a color component.
/// <remarks>A value ranging from -100 to 100. Negative is green, positive magenta.</remarks>
/// <remarks>A value usually ranging from -100 to 100. Negative is green, positive magenta.</remarks>
/// </summary>
public readonly float A;
/// <summary>
/// Gets the b color component.
/// <remarks>A value ranging from -100 to 100. Negative is blue, positive is yellow</remarks>
/// <remarks>A value usually ranging from -100 to 100. Negative is blue, positive is yellow</remarks>
/// </summary>
public readonly float B;
@ -90,7 +87,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
[MethodImpl(InliningOptions.ShortMethod)]
public HunterLab(Vector3 vector, CieXyz whitePoint)
{
vector = Vector3.Clamp(vector, Min, Max);
// Not clamping as documentation about this space only indicates "usual" ranges
this.L = vector.X;
this.A = vector.Y;
this.B = vector.Z;

2
src/ImageSharp/ColorSpaces/Lms.cs

@ -51,7 +51,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
[MethodImpl(InliningOptions.ShortMethod)]
public Lms(Vector3 vector)
{
// Not clamping as documentation about this space seems to indicate "usual" ranges
// Not clamping as documentation about this space only indicates "usual" ranges
this.L = vector.X;
this.M = vector.Y;
this.S = vector.Z;

103
tests/ImageSharp.Tests/Colorspaces/Conversion/ApproximateColorspaceComparer.cs

@ -12,6 +12,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
/// </summary>
internal readonly struct ApproximateColorSpaceComparer :
IEqualityComparer<Rgb>,
IEqualityComparer<LinearRgb>,
IEqualityComparer<CieLab>,
IEqualityComparer<CieLch>,
IEqualityComparer<CieLchuv>,
@ -34,10 +35,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
/// Initializes a new instance of the <see cref="ApproximateColorSpaceComparer"/> class.
/// </summary>
/// <param name="epsilon">The comparison error difference epsilon to use.</param>
public ApproximateColorSpaceComparer(float epsilon = 1F)
{
this.Epsilon = epsilon;
}
public ApproximateColorSpaceComparer(float epsilon = 1F) => this.Epsilon = epsilon;
/// <inheritdoc/>
public bool Equals(Rgb x, Rgb y)
@ -48,11 +46,19 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(Rgb obj)
public int GetHashCode(Rgb obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(LinearRgb x, LinearRgb y)
{
return obj.GetHashCode();
return this.Equals(x.R, y.R)
&& this.Equals(x.G, y.G)
&& this.Equals(x.B, y.B);
}
/// <inheritdoc/>
public int GetHashCode(LinearRgb obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(CieLab x, CieLab y)
{
@ -62,10 +68,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(CieLab obj)
{
return obj.GetHashCode();
}
public int GetHashCode(CieLab obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(CieLch x, CieLch y)
@ -76,10 +79,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(CieLch obj)
{
return obj.GetHashCode();
}
public int GetHashCode(CieLch obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(CieLchuv x, CieLchuv y)
@ -90,10 +90,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(CieLchuv obj)
{
return obj.GetHashCode();
}
public int GetHashCode(CieLchuv obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(CieLuv x, CieLuv y)
@ -104,10 +101,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(CieLuv obj)
{
return obj.GetHashCode();
}
public int GetHashCode(CieLuv obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(CieXyz x, CieXyz y)
@ -118,10 +112,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(CieXyz obj)
{
return obj.GetHashCode();
}
public int GetHashCode(CieXyz obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(CieXyy x, CieXyy y)
@ -132,10 +123,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(CieXyy obj)
{
return obj.GetHashCode();
}
public int GetHashCode(CieXyy obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(Cmyk x, Cmyk y)
@ -147,10 +135,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(Cmyk obj)
{
return obj.GetHashCode();
}
public int GetHashCode(Cmyk obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(HunterLab x, HunterLab y)
@ -161,10 +146,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(HunterLab obj)
{
return obj.GetHashCode();
}
public int GetHashCode(HunterLab obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(Hsl x, Hsl y)
@ -175,10 +157,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(Hsl obj)
{
return obj.GetHashCode();
}
public int GetHashCode(Hsl obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(Hsv x, Hsv y)
@ -189,10 +168,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(Hsv obj)
{
return obj.GetHashCode();
}
public int GetHashCode(Hsv obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(Lms x, Lms y)
@ -203,10 +179,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(Lms obj)
{
return obj.GetHashCode();
}
public int GetHashCode(Lms obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(YCbCr x, YCbCr y)
@ -217,34 +190,19 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(YCbCr obj)
{
return obj.GetHashCode();
}
public int GetHashCode(YCbCr obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(CieXyChromaticityCoordinates x, CieXyChromaticityCoordinates y)
{
return this.Equals(x.X, y.X) && this.Equals(x.Y, y.Y);
}
public bool Equals(CieXyChromaticityCoordinates x, CieXyChromaticityCoordinates y) => this.Equals(x.X, y.X) && this.Equals(x.Y, y.Y);
/// <inheritdoc/>
public int GetHashCode(CieXyChromaticityCoordinates obj)
{
return obj.GetHashCode();
}
public int GetHashCode(CieXyChromaticityCoordinates obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(RgbPrimariesChromaticityCoordinates x, RgbPrimariesChromaticityCoordinates y)
{
return this.Equals(x.R, y.R) && this.Equals(x.G, y.G) && this.Equals(x.B, y.B);
}
public bool Equals(RgbPrimariesChromaticityCoordinates x, RgbPrimariesChromaticityCoordinates y) => this.Equals(x.R, y.R) && this.Equals(x.G, y.G) && this.Equals(x.B, y.B);
/// <inheritdoc/>
public int GetHashCode(RgbPrimariesChromaticityCoordinates obj)
{
return obj.GetHashCode();
}
public int GetHashCode(RgbPrimariesChromaticityCoordinates obj) => obj.GetHashCode();
/// <inheritdoc/>
public bool Equals(RgbWorkingSpace x, RgbWorkingSpace y)
@ -260,10 +218,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
}
/// <inheritdoc/>
public int GetHashCode(RgbWorkingSpace obj)
{
return obj.GetHashCode();
}
public int GetHashCode(RgbWorkingSpace obj) => obj.GetHashCode();
private bool Equals(float x, float y)
{

16
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCieLchuvConversionTests.cs

@ -25,13 +25,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(54.2917, 106.8391, 40.8526, 54.9205055, 30.7944126, 93.17662)]
[InlineData(100, 0, 0, 100, 0, 0)]
[InlineData(100, 50, 180, 99.74778, -35.5287476, -4.24233675)]
[InlineData(10, 36.0555, 56.3099, 10.2056971, 7.886916, 17.498457)]
[InlineData(10, 36.0555, 123.6901, 9.953703, -35.1176033, 16.8696461)]
[InlineData(10, 36.0555, 303.6901, 9.805839, 55.69225, -36.6074753)]
[InlineData(10, 36.0555, 236.3099, 8.86916, -34.4068336, -42.2136269)]
[InlineData(30.66194, 200, 352.7564, 31.95653, 116.8745, 2.388602)]
public void Convert_Lchuv_to_Lab(float l, float c, float h, float l2, float a, float b)
{
// Arrange
@ -61,13 +55,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(54.9205055, 30.7944126, 93.17662, 54.9205055, 103.269287, 35.46892)]
[InlineData(100, 0, 0, 100, 29.5789261, 60.1635857)]
[InlineData(99.74778, -35.5287476, -4.24233675, 99.74778, 48.8177834, 139.54837)]
[InlineData(10.2056971, 7.886916, 17.498457, 10.205699, 17.00984, 42.9908066)]
[InlineData(9.953703, -35.1176033, 16.8696461, 9.953705, 25.3788586, 141.070892)]
[InlineData(9.805839, 55.69225, -36.6074753, 9.80584049, 35.3214073, 314.4875)]
[InlineData(8.86916, -34.4068336, -42.2136269, 8.869162, 32.1432457, 227.960419)]
[InlineData(36.0555, 303.6901, 10.01514, 30.66194, 200, 352.7564)]
public void Convert_Lab_to_Lchuv(float l, float a, float b, float l2, float c, float h)
{
// Arrange

83
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCieLuvConversionTests.cs

@ -0,0 +1,83 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="CieLuv"/> conversions.
/// </summary>
/// <remarks>
/// Test data generated using:
/// <see href="http://www.brucelindbloom.com/index.html?ColorCalculator.html"/>
/// </remarks>
public class CieLabAndCieLuvConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="CieLuv"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(10, 36.0555, 303.6901, 10.0151367, -23.9644356, 17.0226)]
public void Convert_CieLuv_to_CieLab(float l, float u, float v, float l2, float a, float b)
{
// Arrange
var input = new CieLuv(l, u, v);
var expected = new CieLab(l2, a, b);
Span<CieLuv> inputSpan = new CieLuv[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="CieLuv"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(10.0151367, -23.9644356, 17.0226, 10.0000038, -12.830183, 15.1829338)]
public void Convert_CieLab_to_CieLuv(float l, float a, float b, float l2, float u, float v)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new CieLuv(l2, u, v);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<CieLuv> actualSpan = new CieLuv[5];
// Act
var actual = Converter.ToCieLuv(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCieXyyConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="CieXyy"/> conversions.
/// </summary>
public class CieLabAndCieXyyConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="CieXyy"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(0.8644734, 0.06098868, 0.06509002, 36.05552, 275.6228, 10.01517)]
public void Convert_CieXyy_to_CieLab(float x, float y, float yl, float l, float a, float b)
{
// Arrange
var input = new CieXyy(x, y, yl);
var expected = new CieLab(l, a, b);
Span<CieXyy> inputSpan = new CieXyy[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="CieXyy"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(36.0555, 303.6901, 10.01514, 0.8644734, 0.06098868, 0.06509002)]
public void Convert_CieLab_to_CieXyy(float l, float a, float b, float x, float y, float yl)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new CieXyy(x, y, yl);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<CieXyy> actualSpan = new CieXyy[5];
// Act
var actual = Converter.ToCieXyy(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCmykConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="Cmyk"/> conversions.
/// </summary>
public class CieLabAndCmykConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="Cmyk"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 1, 0, 0, 0)]
[InlineData(0, 1, 0.6156551, 5.960464E-08, 55.063, 82.54871, 23.16506)]
public void Convert_Cmyk_to_CieLab(float c, float m, float y, float k, float l, float a, float b)
{
// Arrange
var input = new Cmyk(c, m, y, k);
var expected = new CieLab(l, a, b);
Span<Cmyk> inputSpan = new Cmyk[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="Cmyk"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0, 1)]
[InlineData(36.0555, 303.6901, 10.01514, 0, 1, 0.6156551, 5.960464E-08)]
public void Convert_CieLab_to_Cmyk(float l, float a, float b, float c, float m, float y, float k)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new Cmyk(c, m, y, k);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<Cmyk> actualSpan = new Cmyk[5];
// Act
var actual = Converter.ToCmyk(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndHslConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="Hsl"/> conversions.
/// </summary>
public class CieLabAndHslConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="Hsl"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(336.9393, 1, 0.5, 55.063, 82.54868, 23.16508)]
public void Convert_Hsl_to_CieLab(float h, float s, float ll, float l, float a, float b)
{
// Arrange
var input = new Hsl(h, s, ll);
var expected = new CieLab(l, a, b);
Span<Hsl> inputSpan = new Hsl[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="Hsl"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(36.0555, 303.6901, 10.01514, 336.9393, 1, 0.5)]
public void Convert_CieLab_to_Hsl(float l, float a, float b, float h, float s, float ll)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new Hsl(h, s, ll);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<Hsl> actualSpan = new Hsl[5];
// Act
var actual = Converter.ToHsl(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndHsvConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="Hsv"/> conversions.
/// </summary>
public class CieLabAndHsvConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="Hsv"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(336.9393, 1, 0.9999999, 55.063, 82.54871, 23.16504)]
public void Convert_Hsv_to_CieLab(float h, float s, float v, float l, float a, float b)
{
// Arrange
var input = new Hsv(h, s, v);
var expected = new CieLab(l, a, b);
Span<Hsv> inputSpan = new Hsv[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="Hsv"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(36.0555, 303.6901, 10.01514, 336.9393, 1, 0.9999999)]
public void Convert_CieLab_to_Hsv(float l, float a, float b, float h, float s, float v)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new Hsv(h, s, v);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<Hsv> actualSpan = new Hsv[5];
// Act
var actual = Converter.ToHsv(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndHunterLabConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="HunterLab"/> conversions.
/// </summary>
public class CieLabAndHunterLabConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="HunterLab"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(27.51646, 556.9392, -0.03974226, 36.05554, 275.6227, 10.01519)]
public void Convert_HunterLab_to_CieLab(float l2, float a2, float b2, float l, float a, float b)
{
// Arrange
var input = new HunterLab(l2, a2, b2);
var expected = new CieLab(l, a, b);
Span<HunterLab> inputSpan = new HunterLab[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="HunterLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(36.0555, 303.6901, 10.01514, 27.51646, 556.9392, -0.03974226)]
public void Convert_CieLab_to_HunterLab(float l, float a, float b, float l2, float a2, float b2)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new HunterLab(l2, a2, b2);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<HunterLab> actualSpan = new HunterLab[5];
// Act
var actual = Converter.ToHunterLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndLinearRgbConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="LinearRgb"/> conversions.
/// </summary>
public class CieLabAndLinearRgbConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="LinearRgb"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(1, 0, 0.1221596, 55.063, 82.54871, 23.16505)]
public void Convert_LinearRgb_to_CieLab(float r, float g, float b2, float l, float a, float b)
{
// Arrange
var input = new LinearRgb(r, g, b2);
var expected = new CieLab(l, a, b);
Span<LinearRgb> inputSpan = new LinearRgb[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="LinearRgb"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(36.0555, 303.6901, 10.01514, 1, 0, 0.1221596)]
public void Convert_CieLab_to_LinearRgb(float l, float a, float b, float r, float g, float b2)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new LinearRgb(r, g, b2);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<LinearRgb> actualSpan = new LinearRgb[5];
// Act
var actual = Converter.ToLinearRgb(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndLmsConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="Lms"/> conversions.
/// </summary>
public class CieLabAndLmsConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="Lms"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(0.8303261, -0.5776886, 0.1133359, 36.05553, 275.6228, 10.01518)]
public void Convert_Lms_to_CieLab(float l2, float m, float s, float l, float a, float b)
{
// Arrange
var input = new Lms(l2, m, s);
var expected = new CieLab(l, a, b);
Span<Lms> inputSpan = new Lms[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="Lms"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(36.0555, 303.6901, 10.01514, 0.8303261, -0.5776886, 0.1133359)]
public void Convert_CieLab_to_Lms(float l, float a, float b, float l2, float m, float s)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new Lms(l2, m, s);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<Lms> actualSpan = new Lms[5];
// Act
var actual = Converter.ToLms(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndRgbConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="Rgb"/> conversions.
/// </summary>
public class CieLabAndRgbConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="Rgb"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(0.9999999, 0, 0.384345, 55.063, 82.54871, 23.16505)]
public void Convert_Rgb_to_CieLab(float r, float g, float b2, float l, float a, float b)
{
// Arrange
var input = new Rgb(r, g, b2);
var expected = new CieLab(l, a, b);
Span<Rgb> inputSpan = new Rgb[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="Rgb"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(36.0555, 303.6901, 10.01514, 0.9999999, 0, 0.384345)]
public void Convert_CieLab_to_Rgb(float l, float a, float b, float r, float g, float b2)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new Rgb(r, g, b2);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<Rgb> actualSpan = new Rgb[5];
// Act
var actual = Converter.ToRgb(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

79
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndYCbCrConversionTests.cs

@ -0,0 +1,79 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
/// <summary>
/// Tests <see cref="CieLab"/>-<see cref="YCbCr"/> conversions.
/// </summary>
public class CieLabAndYCbCrConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0002F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="YCbCr"/> to <see cref="CieLab"/>.
/// </summary>
[Theory]
[InlineData(0, 128, 128, 0, 0, 0)]
[InlineData(87.4179, 133.9763, 247.5308, 55.06287, 82.54838, 23.1697)]
public void Convert_YCbCr_to_CieLab(float y, float cb, float cr, float l, float a, float b)
{
// Arrange
var input = new YCbCr(y, cb, cr);
var expected = new CieLab(l, a, b);
Span<YCbCr> inputSpan = new YCbCr[5];
inputSpan.Fill(input);
Span<CieLab> actualSpan = new CieLab[5];
// Act
var actual = Converter.ToCieLab(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
/// <summary>
/// Tests conversion from <see cref="CieLab"/> to <see cref="YCbCr"/>.
/// </summary>
[Theory]
[InlineData(0, 0, 0, 0, 128, 128)]
[InlineData(36.0555, 303.6901, 10.01514, 87.4179, 133.9763, 247.5308)]
public void Convert_CieLab_to_YCbCr(float l, float a, float b, float y, float cb, float cr)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new YCbCr(y, cb, cr);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<YCbCr> actualSpan = new YCbCr[5];
// Act
var actual = Converter.ToYCbCr(input);
Converter.Convert(inputSpan, actualSpan, actualSpan.Length);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
for (int i = 0; i < actualSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}

2
tests/ImageSharp.Tests/Colorspaces/Conversion/CieLuvAndCieLchuvConversionTests.cs

@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
/// Test data generated using:
/// <see href="http://www.brucelindbloom.com/index.html?ColorCalculator.html"/>
/// </remarks>
public class CieLuvAndCieLchuvuvConversionTests
public class CieLuvAndCieLchuvConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0001F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();

41
tests/ImageSharp.Tests/Colorspaces/Conversion/VonKriesChromaticAdaptationTests.cs

@ -0,0 +1,41 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using SixLabors.ImageSharp.ColorSpaces;
using SixLabors.ImageSharp.ColorSpaces.Conversion;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
{
public class VonKriesChromaticAdaptationTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0001F);
public static readonly TheoryData<CieXyz, CieXyz> WhitePoints = new TheoryData<CieXyz, CieXyz>
{
{CieLuv.DefaultWhitePoint, CieLab.DefaultWhitePoint},
{CieLuv.DefaultWhitePoint, CieLuv.DefaultWhitePoint}
};
[Theory]
[MemberData(nameof(WhitePoints))]
public void SingleAndBulkTransformYieldIdenticalResults(CieXyz sourceWhitePoint, CieXyz destinationWhitePoint)
{
var adaptation = new VonKriesChromaticAdaptation();
var input = new CieXyz(1, 0, 1);
CieXyz expected = adaptation.Transform(input, sourceWhitePoint, destinationWhitePoint);
Span<CieXyz> inputSpan = new CieXyz[5];
inputSpan.Fill(input);
Span<CieXyz> actualSpan = new CieXyz[5];
adaptation.Transform(inputSpan, actualSpan, sourceWhitePoint, destinationWhitePoint, inputSpan.Length);
for (int i = 0; i < inputSpan.Length; i++)
{
Assert.Equal(expected, actualSpan[i], ColorSpaceComparer);
}
}
}
}
Loading…
Cancel
Save