Browse Source

Fix LUT entry calculator for XYZ PCS with non-identity matrix

pull/1567/head
Wacton 2 years ago
parent
commit
f21c0c2752
  1. 2
      src/ImageSharp/ColorProfiles/Icc/Calculators/LutEntryCalculator.cs
  2. 4
      tests/ImageSharp.Tests/ColorProfiles/Icc/Calculators/LutEntryCalculatorTests.cs
  3. 8
      tests/ImageSharp.Tests/TestDataIcc/Conversion/IccConversionDataLutEntry.cs

2
src/ImageSharp/ColorProfiles/Icc/Calculators/LutEntryCalculator.cs

@ -37,7 +37,7 @@ internal class LutEntryCalculator : IVector4Calculator
{ {
if (this.doTransform) if (this.doTransform)
{ {
value = Vector4.Transform(value, this.matrix); value = Vector4.Transform(value, Matrix4x4.Transpose(this.matrix));
} }
value = CalculateLut(this.inputCurve, value); value = CalculateLut(this.inputCurve, value);

4
tests/ImageSharp.Tests/ColorProfiles/Icc/Calculators/LutEntryCalculatorTests.cs

@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.Tests.ColorProfiles.Icc.Calculators
[Trait("Color", "Conversion")] [Trait("Color", "Conversion")]
public class LutEntryCalculatorTests public class LutEntryCalculatorTests
{ {
[Theory(Skip = "Results do not match not expected.")] [Theory]
[MemberData(nameof(IccConversionDataLutEntry.Lut8ConversionTestData), MemberType = typeof(IccConversionDataLutEntry))] [MemberData(nameof(IccConversionDataLutEntry.Lut8ConversionTestData), MemberType = typeof(IccConversionDataLutEntry))]
internal void LutEntryCalculator_WithLut8_ReturnsResult(IccLut8TagDataEntry lut, Vector4 input, Vector4 expected) internal void LutEntryCalculator_WithLut8_ReturnsResult(IccLut8TagDataEntry lut, Vector4 input, Vector4 expected)
{ {
@ -25,7 +25,7 @@ namespace SixLabors.ImageSharp.Tests.ColorProfiles.Icc.Calculators
VectorAssert.Equal(expected, result, 4); VectorAssert.Equal(expected, result, 4);
} }
[Theory(Skip = "Results do not match not expected.")] [Theory]
[MemberData(nameof(IccConversionDataLutEntry.Lut16ConversionTestData), MemberType = typeof(IccConversionDataLutEntry))] [MemberData(nameof(IccConversionDataLutEntry.Lut16ConversionTestData), MemberType = typeof(IccConversionDataLutEntry))]
internal void LutEntryCalculator_WithLut16_ReturnsResult(IccLut16TagDataEntry lut, Vector4 input, Vector4 expected) internal void LutEntryCalculator_WithLut16_ReturnsResult(IccLut16TagDataEntry lut, Vector4 input, Vector4 expected)
{ {

8
tests/ImageSharp.Tests/TestDataIcc/Conversion/IccConversionDataLutEntry.cs

@ -49,13 +49,13 @@ public class IccConversionDataLutEntry
public static object[][] Lut8ConversionTestData = public static object[][] Lut8ConversionTestData =
{ {
new object[] { Lut8, new Vector4(0.2f, 0.3f, 0, 0), new Vector4(0.339762866f, 0, 0, 0) }, new object[] { Lut8, new Vector4(0.2f, 0.3f, 0, 0), new Vector4(0.4578933760499877f, 0, 0, 0) },
new object[] { Lut8Matrix, new Vector4(0.21f, 0.31f, 0.41f, 0), new Vector4(0.431305826f, 0, 0, 0) }, new object[] { Lut8Matrix, new Vector4(0.21f, 0.31f, 0.41f, 0), new Vector4(0.40099657491875312f, 0, 0, 0) },
}; };
public static object[][] Lut16ConversionTestData = public static object[][] Lut16ConversionTestData =
{ {
new object[] { Lut16, new Vector4(0.2f, 0.3f, 0, 0), new Vector4(0.245625019f, 0, 0, 0) }, new object[] { Lut16, new Vector4(0.2f, 0.3f, 0, 0), new Vector4(0.3543750030529918f, 0, 0, 0) },
new object[] { Lut16Matrix, new Vector4(0.21f, 0.31f, 0.41f, 0), new Vector4(0.336980581f, 0, 0, 0) }, new object[] { Lut16Matrix, new Vector4(0.21f, 0.31f, 0.41f, 0), new Vector4(0.29739562389689594f, 0, 0, 0) },
}; };
} }

Loading…
Cancel
Save