Browse Source

Added bulk adaptation method plus more tests

af/merge-core
James Jackson-South 7 years ago
parent
commit
e71f2b37e9
  1. 4
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieLchuv.cs
  2. 13
      src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs
  3. 19
      src/ImageSharp/ColorSpaces/Conversion/IChromaticAdaptation.cs
  4. 43
      src/ImageSharp/ColorSpaces/Conversion/VonKriesChromaticAdaptation.cs
  5. 2
      src/ImageSharp/ColorSpaces/LinearRgb.cs
  6. 3
      tests/ImageSharp.Tests/Colorspaces/CieLabTests.cs
  7. 5
      tests/ImageSharp.Tests/Colorspaces/CieLchTests.cs
  8. 5
      tests/ImageSharp.Tests/Colorspaces/CieLchuvTests.cs
  9. 5
      tests/ImageSharp.Tests/Colorspaces/CieLuvTests.cs
  10. 43
      tests/ImageSharp.Tests/Colorspaces/CieXyChromaticityCoordinatesTests.cs
  11. 5
      tests/ImageSharp.Tests/Colorspaces/CieXyyTests.cs
  12. 5
      tests/ImageSharp.Tests/Colorspaces/CieXyzTests.cs
  13. 5
      tests/ImageSharp.Tests/Colorspaces/CmykTests.cs
  14. 2
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCieLchConversionTests.cs
  15. 96
      tests/ImageSharp.Tests/Colorspaces/Conversion/CieLabAndCieLchuvConversionTests.cs
  16. 55
      tests/ImageSharp.Tests/Colorspaces/Conversion/ColorConverterAdaptTest.cs
  17. 5
      tests/ImageSharp.Tests/Colorspaces/HslTests.cs
  18. 5
      tests/ImageSharp.Tests/Colorspaces/HsvTests.cs
  19. 2
      tests/ImageSharp.Tests/Colorspaces/HunterLabTests.cs
  20. 2
      tests/ImageSharp.Tests/Colorspaces/LinearRgbTests.cs
  21. 2
      tests/ImageSharp.Tests/Colorspaces/LmsTests.cs
  22. 2
      tests/ImageSharp.Tests/Colorspaces/RgbTests.cs
  23. 1
      tests/ImageSharp.Tests/Colorspaces/StringRepresentationTests.cs
  24. 2
      tests/ImageSharp.Tests/Colorspaces/YCbCrTests.cs

4
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.CieLchuv.cs

@ -159,9 +159,9 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// <returns>The <see cref="CieLchuv"/></returns>
public CieLchuv ToCieLchuv(in CieXyz color)
{
var labColor = this.ToCieLab(color);
var luvColor = this.ToCieLuv(color);
return this.ToCieLchuv(labColor);
return this.ToCieLchuv(luvColor);
}
/// <summary>

13
src/ImageSharp/ColorSpaces/Conversion/ColorSpaceConverter.cs

@ -12,11 +12,12 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
public partial class ColorSpaceConverter
{
// Options.
private Matrix4x4 lmsAdaptationMatrix;
private CieXyz whitePoint;
private CieXyz targetLuvWhitePoint;
private CieXyz targetLabWhitePoint;
private CieXyz targetHunterLabWhitePoint;
private static readonly ColorSpaceConverterOptions DefaultOptions = new ColorSpaceConverterOptions();
private readonly Matrix4x4 lmsAdaptationMatrix;
private readonly CieXyz whitePoint;
private readonly CieXyz targetLuvWhitePoint;
private readonly CieXyz targetLabWhitePoint;
private readonly CieXyz targetHunterLabWhitePoint;
private readonly RgbWorkingSpace targetRgbWorkingSpace;
private readonly IChromaticAdaptation chromaticAdaptation;
private readonly bool performChromaticAdaptation;
@ -30,7 +31,7 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// Initializes a new instance of the <see cref="ColorSpaceConverter"/> class.
/// </summary>
public ColorSpaceConverter()
: this(new ColorSpaceConverterOptions())
: this(DefaultOptions)
{
}

19
src/ImageSharp/ColorSpaces/Conversion/IChromaticAdaptation.cs

@ -1,6 +1,8 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
namespace SixLabors.ImageSharp.ColorSpaces.Conversion
{
/// <summary>
@ -14,10 +16,21 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
/// Performs a linear transformation of a source color in to the destination color.
/// </summary>
/// <remarks>Doesn't crop the resulting color space coordinates (e. g. allows negative values for XYZ coordinates).</remarks>
/// <param name="sourceColor">The source color.</param>
/// <param name="source">The source color.</param>
/// <param name="sourceWhitePoint">The source white point.</param>
/// <param name="targetWhitePoint">The target white point.</param>
/// <param name="destinationWhitePoint">The destination white point.</param>
/// <returns>The <see cref="CieXyz"/></returns>
CieXyz Transform(in CieXyz sourceColor, in CieXyz sourceWhitePoint, in CieXyz targetWhitePoint);
CieXyz Transform(in CieXyz source, in CieXyz sourceWhitePoint, in CieXyz destinationWhitePoint);
/// <summary>
/// Performs a bulk linear transformation of a source color in to the destination color.
/// </summary>
/// <remarks>Doesn't crop the resulting color space coordinates (e. g. allows negative values for XYZ coordinates).</remarks>
/// <param name="source">The span to the source colors.</param>
/// <param name="destination">The span to the destination colors.</param>
/// <param name="sourceWhitePoint">The source white point.</param>
/// <param name="destinationWhitePoint">The destination white point.</param>
/// <param name="count">The number of colors to convert.</param>
void Transform(Span<CieXyz> source, Span<CieXyz> destination, CieXyz sourceWhitePoint, in CieXyz destinationWhitePoint, int count);
}
}

43
src/ImageSharp/ColorSpaces/Conversion/VonKriesChromaticAdaptation.cs

@ -1,7 +1,10 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using System;
using System.Numerics;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using SixLabors.ImageSharp.ColorSpaces.Conversion.Implementation;
namespace SixLabors.ImageSharp.ColorSpaces.Conversion
@ -44,21 +47,51 @@ namespace SixLabors.ImageSharp.ColorSpaces.Conversion
internal VonKriesChromaticAdaptation(CieXyzAndLmsConverter converter) => this.converter = converter;
/// <inheritdoc/>
public CieXyz Transform(in CieXyz sourceColor, in CieXyz sourceWhitePoint, in CieXyz targetWhitePoint)
public CieXyz Transform(in CieXyz source, in CieXyz sourceWhitePoint, in CieXyz destinationWhitePoint)
{
if (sourceWhitePoint.Equals(targetWhitePoint))
if (sourceWhitePoint.Equals(destinationWhitePoint))
{
return sourceColor;
return source;
}
Lms sourceColorLms = this.converter.Convert(sourceColor);
Lms sourceColorLms = this.converter.Convert(source);
Lms sourceWhitePointLms = this.converter.Convert(sourceWhitePoint);
Lms targetWhitePointLms = this.converter.Convert(targetWhitePoint);
Lms targetWhitePointLms = this.converter.Convert(destinationWhitePoint);
Vector3 vector = targetWhitePointLms.ToVector3() / sourceWhitePointLms.ToVector3();
var targetColorLms = new Lms(Vector3.Multiply(vector, sourceColorLms.ToVector3()));
return this.converter.Convert(targetColorLms);
}
/// <inheritdoc/>
public void Transform(Span<CieXyz> source, Span<CieXyz> destination, CieXyz sourceWhitePoint, in CieXyz destinationWhitePoint, int count)
{
Guard.SpansMustBeSizedAtLeast(source, nameof(source), destination, nameof(destination), count);
if (sourceWhitePoint.Equals(destinationWhitePoint))
{
source.CopyTo(destination.Slice(0, count));
return;
}
ref CieXyz sourceRef = ref MemoryMarshal.GetReference(source);
ref CieXyz destRef = ref MemoryMarshal.GetReference(destination);
for (int i = 0; i < count; i++)
{
ref CieXyz sp = ref Unsafe.Add(ref sourceRef, i);
ref CieXyz dp = ref Unsafe.Add(ref destRef, i);
Lms sourceColorLms = this.converter.Convert(sp);
Lms sourceWhitePointLms = this.converter.Convert(sourceWhitePoint);
Lms targetWhitePointLms = this.converter.Convert(destinationWhitePoint);
Vector3 vector = targetWhitePointLms.ToVector3() / sourceWhitePointLms.ToVector3();
var targetColorLms = new Lms(Vector3.Multiply(vector, sourceColorLms.ToVector3()));
dp = this.converter.Convert(targetColorLms);
}
}
}
}

2
src/ImageSharp/ColorSpaces/LinearRgb.cs

@ -52,7 +52,7 @@ namespace SixLabors.ImageSharp.ColorSpaces
/// <param name="b">The blue component ranging between 0 and 1.</param>
[MethodImpl(InliningOptions.ShortMethod)]
public LinearRgb(float r, float g, float b)
: this(new Vector3(r, g, b))
: this(r, g, b, DefaultWorkingSpace)
{
}

3
tests/ImageSharp.Tests/Colorspaces/CieLabTests.cs

@ -38,6 +38,9 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
Assert.Equal(new CieLab(1, 0, 1), new CieLab(1, 0, 1));
Assert.Equal(new CieLab(Vector3.One), new CieLab(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(default(CieLab) == new CieLab(1, 0, 1));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/CieLchTests.cs

@ -30,10 +30,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{
var x = default(CieLch);
var y = new CieLch(Vector3.One);
Assert.True(default(CieLch) == default(CieLch));
Assert.False(default(CieLch) != default(CieLch));
Assert.Equal(default(CieLch), default(CieLch));
Assert.Equal(new CieLch(1, 0, 1), new CieLch(1, 0, 1));
Assert.Equal(new CieLch(Vector3.One), new CieLch(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/CieLchuvTests.cs

@ -30,10 +30,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{
var x = default(CieLchuv);
var y = new CieLchuv(Vector3.One);
Assert.True(default(CieLchuv) == default(CieLchuv));
Assert.False(default(CieLchuv) != default(CieLchuv));
Assert.Equal(default(CieLchuv), default(CieLchuv));
Assert.Equal(new CieLchuv(1, 0, 1), new CieLchuv(1, 0, 1));
Assert.Equal(new CieLchuv(Vector3.One), new CieLchuv(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/CieLuvTests.cs

@ -30,10 +30,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{
var x = default(CieLuv);
var y = new CieLuv(Vector3.One);
Assert.True(default(CieLuv) == default(CieLuv));
Assert.False(default(CieLuv) != default(CieLuv));
Assert.Equal(default(CieLuv), default(CieLuv));
Assert.Equal(new CieLuv(1, 0, 1), new CieLuv(1, 0, 1));
Assert.Equal(new CieLuv(Vector3.One), new CieLuv(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

43
tests/ImageSharp.Tests/Colorspaces/CieXyChromaticityCoordinatesTests.cs

@ -0,0 +1,43 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
using SixLabors.ImageSharp.ColorSpaces;
using Xunit;
namespace SixLabors.ImageSharp.Tests.Colorspaces
{
/// <summary>
/// Tests the <see cref="CieXyChromaticityCoordinates"/> struct.
/// </summary>
public class CieXyChromaticityCoordinatesTests
{
[Fact]
public void CieXyChromaticityCoordinatesConstructorAssignsFields()
{
const float x = .75F;
const float y = .64F;
var coordinates = new CieXyChromaticityCoordinates(x, y);
Assert.Equal(x, coordinates.X);
Assert.Equal(y, coordinates.Y);
}
[Fact]
public void CieXyChromaticityCoordinatesEquality()
{
var x = default(CieXyChromaticityCoordinates);
var y = new CieXyChromaticityCoordinates(1, 1);
Assert.True(default(CieXyChromaticityCoordinates) == default(CieXyChromaticityCoordinates));
Assert.True(default(CieXyChromaticityCoordinates) != new CieXyChromaticityCoordinates(1, 0));
Assert.False(default(CieXyChromaticityCoordinates) == new CieXyChromaticityCoordinates(1, 0));
Assert.Equal(default(CieXyChromaticityCoordinates), default(CieXyChromaticityCoordinates));
Assert.Equal(new CieXyChromaticityCoordinates(1, 0), new CieXyChromaticityCoordinates(1, 0));
Assert.Equal(new CieXyChromaticityCoordinates(1, 1), new CieXyChromaticityCoordinates(1, 1));
Assert.False(x.Equals(y));
Assert.False(default(CieXyChromaticityCoordinates) == new CieXyChromaticityCoordinates(1, 0));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/CieXyyTests.cs

@ -30,10 +30,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{
var x = default(CieXyy);
var y = new CieXyy(Vector3.One);
Assert.True(default(CieXyy) == default(CieXyy));
Assert.False(default(CieXyy) != default(CieXyy));
Assert.Equal(default(CieXyy), default(CieXyy));
Assert.Equal(new CieXyy(1, 0, 1), new CieXyy(1, 0, 1));
Assert.Equal(new CieXyy(Vector3.One), new CieXyy(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/CieXyzTests.cs

@ -30,10 +30,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{
var x = default(CieXyz);
var y = new CieXyz(Vector3.One);
Assert.True(default(CieXyz) == default(CieXyz));
Assert.False(default(CieXyz) != default(CieXyz));
Assert.Equal(default(CieXyz), default(CieXyz));
Assert.Equal(new CieXyz(1, 0, 1), new CieXyz(1, 0, 1));
Assert.Equal(new CieXyz(Vector3.One), new CieXyz(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/CmykTests.cs

@ -32,10 +32,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{
var x = default(Cmyk);
var y = new Cmyk(Vector4.One);
Assert.True(default(Cmyk) == default(Cmyk));
Assert.False(default(Cmyk) != default(Cmyk));
Assert.Equal(default(Cmyk), default(Cmyk));
Assert.Equal(new Cmyk(1, 0, 1, 0), new Cmyk(1, 0, 1, 0));
Assert.Equal(new Cmyk(Vector4.One), new Cmyk(Vector4.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

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

@ -68,7 +68,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
[InlineData(10, -20, 30, 10, 36.0555, 123.6901)]
[InlineData(10, 20, -30, 10, 36.0555, 303.6901)]
[InlineData(10, -20, -30, 10, 36.0555, 236.3099)]
public void Convert_Lab_to_LCHab(float l, float a, float b, float l2, float c, float h)
public void Convert_Lab_to_Lch(float l, float a, float b, float l2, float c, float h)
{
// Arrange
var input = new CieLab(l, a, b);

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

@ -0,0 +1,96 @@
// 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="CieLchuv"/> conversions.
/// </summary>
/// <remarks>
/// Test data generated using:
/// <see href="http://www.brucelindbloom.com/index.html?ColorCalculator.html"/>
/// </remarks>
public class CieLabAndCieLchuvConversionTests
{
private static readonly ApproximateColorSpaceComparer ColorSpaceComparer = new ApproximateColorSpaceComparer(.0001F);
private static readonly ColorSpaceConverter Converter = new ColorSpaceConverter();
/// <summary>
/// Tests conversion from <see cref="CieLchuv"/> to <see cref="CieLab"/>.
/// </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)]
public void Convert_Lchuv_to_Lab(float l, float c, float h, float l2, float a, float b)
{
// Arrange
var input = new CieLchuv(l, c, h);
var expected = new CieLab(l2, a, b);
Span<CieLchuv> inputSpan = new CieLchuv[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="CieLchuv"/>.
/// </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)]
public void Convert_Lab_to_Lchuv(float l, float a, float b, float l2, float c, float h)
{
// Arrange
var input = new CieLab(l, a, b);
var expected = new CieLchuv(l2, c, h);
Span<CieLab> inputSpan = new CieLab[5];
inputSpan.Fill(input);
Span<CieLchuv> actualSpan = new CieLchuv[5];
// Act
var actual = Converter.ToCieLchuv(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);
}
}
}
}

55
tests/ImageSharp.Tests/Colorspaces/Conversion/ColorConverterAdaptTest.cs

@ -61,7 +61,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(22, 33, 1, 22.269869, 32.841164, 1.633926)]
public void Adapt_Lab_D50_To_D65(float l1, float a1, float b1, float l2, float a2, float b2)
public void Adapt_Lab_D65_To_D50(float l1, float a1, float b1, float l2, float a2, float b2)
{
// Arrange
var input = new CieLab(l1, a1, b1, Illuminants.D65);
@ -97,7 +97,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(0.5, 0.5, 0.5, 0.507233, 0.500000, 0.378943)]
public void Adapt_CieXyz_D65_To_D50_XyzScaling(float x1, float y1, float z1, float x2, float y2, float z2)
public void Adapt_Xyz_D65_To_D50_XyzScaling(float x1, float y1, float z1, float x2, float y2, float z2)
{
// Arrange
var input = new CieXyz(x1, y1, z1);
@ -119,22 +119,61 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces.Conversion
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(0.5, 0.5, 0.5, 0.507233, 0.500000, 0.378943)]
public void Adapt_Xyz_D65_To_D50_XyzScaling(float x1, float y1, float z1, float x2, float y2, float z2)
[InlineData(22, 33, 1, 22.1090755, 32.2102661, 1.153463)]
public void Adapt_HunterLab_D65_To_D50(float l1, float a1, float b1, float l2, float a2, float b2)
{
// Arrange
var input = new CieXyz(x1, y1, z1);
var expected = new CieXyz(x2, y2, z2);
var input = new HunterLab(l1, a1, b1, Illuminants.D65);
var expected = new HunterLab(l2, a2, b2);
var options = new ColorSpaceConverterOptions { TargetLabWhitePoint = Illuminants.D50 };
var converter = new ColorSpaceConverter(options);
// Action
HunterLab actual = converter.Adapt(input);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
}
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(22, 33, 1, 22, 33, 0.9999999)]
public void Adapt_CieLchuv_D65_To_D50_XyzScaling(float l1, float c1, float h1, float l2, float c2, float h2)
{
// Arrange
var input = new CieLchuv(l1, c1, h1, Illuminants.D65);
var expected = new CieLchuv(l2, c2, h2);
var options = new ColorSpaceConverterOptions
{
ChromaticAdaptation = new VonKriesChromaticAdaptation(LmsAdaptationMatrix.XyzScaling),
WhitePoint = Illuminants.D50
TargetLabWhitePoint = Illuminants.D50
};
var converter = new ColorSpaceConverter(options);
// Action
CieLchuv actual = converter.Adapt(input);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);
}
[Theory]
[InlineData(0, 0, 0, 0, 0, 0)]
[InlineData(22, 33, 1, 22, 33, 0.9999999)]
public void Adapt_CieLch_D65_To_D50_XyzScaling(float l1, float c1, float h1, float l2, float c2, float h2)
{
// Arrange
var input = new CieLch(l1, c1, h1, Illuminants.D65);
var expected = new CieLch(l2, c2, h2);
var options = new ColorSpaceConverterOptions
{
ChromaticAdaptation = new VonKriesChromaticAdaptation(LmsAdaptationMatrix.XyzScaling),
TargetLabWhitePoint = Illuminants.D50
};
var converter = new ColorSpaceConverter(options);
// Action
CieXyz actual = converter.Adapt(input, Illuminants.D65);
CieLch actual = converter.Adapt(input);
// Assert
Assert.Equal(expected, actual, ColorSpaceComparer);

5
tests/ImageSharp.Tests/Colorspaces/HslTests.cs

@ -30,10 +30,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{
var x = default(Hsl);
var y = new Hsl(Vector3.One);
Assert.True(default(Hsl) == default(Hsl));
Assert.False(default(Hsl) != default(Hsl));
Assert.Equal(default(Hsl), default(Hsl));
Assert.Equal(new Hsl(1, 0, 1), new Hsl(1, 0, 1));
Assert.Equal(new Hsl(Vector3.One), new Hsl(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

5
tests/ImageSharp.Tests/Colorspaces/HsvTests.cs

@ -30,10 +30,15 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{
var x = default(Hsv);
var y = new Hsv(Vector3.One);
Assert.True(default(Hsv) == default(Hsv));
Assert.False(default(Hsv) != default(Hsv));
Assert.Equal(default(Hsv), default(Hsv));
Assert.Equal(new Hsv(1, 0, 1), new Hsv(1, 0, 1));
Assert.Equal(new Hsv(Vector3.One), new Hsv(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

2
tests/ImageSharp.Tests/Colorspaces/HunterLabTests.cs

@ -38,6 +38,8 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
Assert.Equal(new HunterLab(1, 0, 1), new HunterLab(1, 0, 1));
Assert.Equal(new HunterLab(Vector3.One), new HunterLab(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

2
tests/ImageSharp.Tests/Colorspaces/LinearRgbTests.cs

@ -37,6 +37,8 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
Assert.Equal(new LinearRgb(1, 0, 1), new LinearRgb(1, 0, 1));
Assert.Equal(new LinearRgb(Vector3.One), new LinearRgb(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

2
tests/ImageSharp.Tests/Colorspaces/LmsTests.cs

@ -38,6 +38,8 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
Assert.Equal(new Lms(1, 0, 1), new Lms(1, 0, 1));
Assert.Equal(new Lms(Vector3.One), new Lms(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

2
tests/ImageSharp.Tests/Colorspaces/RgbTests.cs

@ -38,6 +38,8 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
Assert.Equal(new Rgb(1, 0, 1), new Rgb(1, 0, 1));
Assert.Equal(new Rgb(Vector3.One), new Rgb(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
[Fact]

1
tests/ImageSharp.Tests/Colorspaces/StringRepresentationTests.cs

@ -42,6 +42,7 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
{ new Hsl(one), "Hsl(1, 1, 1)" },
{ new Hsv(one), "Hsv(1, 1, 1)" },
{ new YCbCr(one), "YCbCr(1, 1, 1)" },
{ new CieXyChromaticityCoordinates(1, 1), "CieXyChromaticityCoordinates(1, 1)"},
{ new CieLab(random), "CieLab(42.4, 94.5, 83.4)" },
{ new CieLch(random), "CieLch(42.4, 94.5, 83.4)" },

2
tests/ImageSharp.Tests/Colorspaces/YCbCrTests.cs

@ -37,6 +37,8 @@ namespace SixLabors.ImageSharp.Tests.Colorspaces
Assert.Equal(new YCbCr(1, 0, 1), new YCbCr(1, 0, 1));
Assert.Equal(new YCbCr(Vector3.One), new YCbCr(Vector3.One));
Assert.False(x.Equals(y));
Assert.False(x.Equals((object)y));
Assert.False(x.GetHashCode().Equals(y.GetHashCode()));
}
}
}

Loading…
Cancel
Save