Browse Source

Add comparing intrinsics color conversion to scalar version

pull/2400/head
Brian Popow 4 years ago
parent
commit
1e2607ef7d
  1. 94
      tests/ImageSharp.Tests/Formats/Jpg/JpegColorConverterTests.cs

94
tests/ImageSharp.Tests/Formats/Jpg/JpegColorConverterTests.cs

@ -36,7 +36,7 @@ public class JpegColorConverterTests
[Fact] [Fact]
public void GetConverterThrowsExceptionOnInvalidColorSpace() public void GetConverterThrowsExceptionOnInvalidColorSpace()
{ {
var invalidColorSpace = (JpegColorSpace)(-1); JpegColorSpace invalidColorSpace = (JpegColorSpace)(-1);
Assert.Throws<InvalidImageContentException>(() => JpegColorConverterBase.GetConverter(invalidColorSpace, 8)); Assert.Throws<InvalidImageContentException>(() => JpegColorConverterBase.GetConverter(invalidColorSpace, 8));
} }
@ -61,7 +61,7 @@ public class JpegColorConverterTests
[InlineData(JpegColorSpace.YCbCr, 12)] [InlineData(JpegColorSpace.YCbCr, 12)]
internal void GetConverterReturnsValidConverter(JpegColorSpace colorSpace, int precision) internal void GetConverterReturnsValidConverter(JpegColorSpace colorSpace, int precision)
{ {
var converter = JpegColorConverterBase.GetConverter(colorSpace, precision); JpegColorConverterBase converter = JpegColorConverterBase.GetConverter(colorSpace, precision);
Assert.NotNull(converter); Assert.NotNull(converter);
Assert.True(converter.IsAvailable); Assert.True(converter.IsAvailable);
@ -77,7 +77,7 @@ public class JpegColorConverterTests
[InlineData(JpegColorSpace.YCbCr, 3)] [InlineData(JpegColorSpace.YCbCr, 3)]
internal void ConvertWithSelectedConverter(JpegColorSpace colorSpace, int componentCount) internal void ConvertWithSelectedConverter(JpegColorSpace colorSpace, int componentCount)
{ {
var converter = JpegColorConverterBase.GetConverter(colorSpace, 8); JpegColorConverterBase converter = JpegColorConverterBase.GetConverter(colorSpace, 8);
ValidateConversion( ValidateConversion(
converter, converter,
componentCount, componentCount,
@ -93,7 +93,7 @@ public class JpegColorConverterTests
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromYCbCrVector(int seed) public void FromYCbCrVector(int seed)
{ {
var converter = new JpegColorConverterBase.YCbCrVector(8); JpegColorConverterBase.YCbCrVector converter = new(8);
if (!converter.IsAvailable) if (!converter.IsAvailable)
{ {
@ -111,7 +111,8 @@ public class JpegColorConverterTests
ValidateConversion( ValidateConversion(
new JpegColorConverterBase.YCbCrVector(8), new JpegColorConverterBase.YCbCrVector(8),
3, 3,
FeatureTestRunner.Deserialize<int>(arg)); FeatureTestRunner.Deserialize<int>(arg),
new JpegColorConverterBase.YCbCrScalar(8));
} }
[Theory] [Theory]
@ -123,7 +124,7 @@ public class JpegColorConverterTests
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromCmykVector(int seed) public void FromCmykVector(int seed)
{ {
var converter = new JpegColorConverterBase.CmykVector(8); JpegColorConverterBase.CmykVector converter = new(8);
if (!converter.IsAvailable) if (!converter.IsAvailable)
{ {
@ -141,7 +142,8 @@ public class JpegColorConverterTests
ValidateConversion( ValidateConversion(
new JpegColorConverterBase.CmykVector(8), new JpegColorConverterBase.CmykVector(8),
4, 4,
FeatureTestRunner.Deserialize<int>(arg)); FeatureTestRunner.Deserialize<int>(arg),
new JpegColorConverterBase.CmykScalar(8));
} }
[Theory] [Theory]
@ -153,7 +155,7 @@ public class JpegColorConverterTests
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromGrayscaleVector(int seed) public void FromGrayscaleVector(int seed)
{ {
var converter = new JpegColorConverterBase.GrayScaleVector(8); JpegColorConverterBase.GrayScaleVector converter = new JpegColorConverterBase.GrayScaleVector(8);
if (!converter.IsAvailable) if (!converter.IsAvailable)
{ {
@ -171,7 +173,8 @@ public class JpegColorConverterTests
ValidateConversion( ValidateConversion(
new JpegColorConverterBase.GrayScaleVector(8), new JpegColorConverterBase.GrayScaleVector(8),
1, 1,
FeatureTestRunner.Deserialize<int>(arg)); FeatureTestRunner.Deserialize<int>(arg),
new JpegColorConverterBase.GrayscaleScalar(8));
} }
[Theory] [Theory]
@ -183,7 +186,7 @@ public class JpegColorConverterTests
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromRgbVector(int seed) public void FromRgbVector(int seed)
{ {
var converter = new JpegColorConverterBase.RgbVector(8); JpegColorConverterBase.RgbVector converter = new JpegColorConverterBase.RgbVector(8);
if (!converter.IsAvailable) if (!converter.IsAvailable)
{ {
@ -201,7 +204,8 @@ public class JpegColorConverterTests
ValidateConversion( ValidateConversion(
new JpegColorConverterBase.RgbVector(8), new JpegColorConverterBase.RgbVector(8),
3, 3,
FeatureTestRunner.Deserialize<int>(arg)); FeatureTestRunner.Deserialize<int>(arg),
new JpegColorConverterBase.RgbScalar(8));
} }
[Theory] [Theory]
@ -213,7 +217,7 @@ public class JpegColorConverterTests
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromYccKVector(int seed) public void FromYccKVector(int seed)
{ {
var converter = new JpegColorConverterBase.YccKVector(8); JpegColorConverterBase.YccKVector converter = new JpegColorConverterBase.YccKVector(8);
if (!converter.IsAvailable) if (!converter.IsAvailable)
{ {
@ -231,48 +235,50 @@ public class JpegColorConverterTests
ValidateConversion( ValidateConversion(
new JpegColorConverterBase.YccKVector(8), new JpegColorConverterBase.YccKVector(8),
4, 4,
FeatureTestRunner.Deserialize<int>(arg)); FeatureTestRunner.Deserialize<int>(arg),
new JpegColorConverterBase.YccKScalar(8));
} }
[Theory] [Theory]
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromYCbCrAvx2(int seed) => public void FromYCbCrAvx2(int seed) =>
this.TestConverter(new JpegColorConverterBase.YCbCrAvx(8), 3, seed); this.TestConverter(new JpegColorConverterBase.YCbCrAvx(8), 3, seed, new JpegColorConverterBase.YCbCrScalar(8));
[Theory] [Theory]
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromCmykAvx2(int seed) => public void FromCmykAvx2(int seed) =>
this.TestConverter(new JpegColorConverterBase.CmykAvx(8), 4, seed); this.TestConverter(new JpegColorConverterBase.CmykAvx(8), 4, seed, new JpegColorConverterBase.CmykScalar(8));
[Theory] [Theory]
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromCmykArm(int seed) => public void FromCmykArm(int seed) =>
this.TestConverter(new JpegColorConverterBase.CmykArm64(8), 4, seed); this.TestConverter( new JpegColorConverterBase.CmykArm64(8), 4, seed, new JpegColorConverterBase.CmykScalar(8));
[Theory] [Theory]
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromGrayscaleAvx2(int seed) => public void FromGrayscaleAvx2(int seed) =>
this.TestConverter(new JpegColorConverterBase.GrayscaleAvx(8), 1, seed); this.TestConverter(new JpegColorConverterBase.GrayscaleAvx(8), 1, seed, new JpegColorConverterBase.GrayscaleScalar(8));
[Theory] [Theory]
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromRgbAvx2(int seed) => public void FromRgbAvx2(int seed) =>
this.TestConverter(new JpegColorConverterBase.RgbAvx(8), 3, seed); this.TestConverter(new JpegColorConverterBase.RgbAvx(8), 3, seed, new JpegColorConverterBase.RgbScalar(8));
[Theory] [Theory]
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromRgbArm(int seed) => public void FromRgbArm(int seed) =>
this.TestConverter(new JpegColorConverterBase.RgbArm(8), 3, seed); this.TestConverter(new JpegColorConverterBase.RgbArm(8), 3, seed, new JpegColorConverterBase.RgbScalar(8));
[Theory] [Theory]
[MemberData(nameof(Seeds))] [MemberData(nameof(Seeds))]
public void FromYccKAvx2(int seed) => public void FromYccKAvx2(int seed) =>
this.TestConverter(new JpegColorConverterBase.YccKAvx(8), 4, seed); this.TestConverter( new JpegColorConverterBase.YccKAvx(8), 4, seed, new JpegColorConverterBase.YccKScalar(8));
private void TestConverter( private void TestConverter(
JpegColorConverterBase converter, JpegColorConverterBase converter,
int componentCount, int componentCount,
int seed) int seed,
JpegColorConverterBase baseLineConverter = null)
{ {
if (!converter.IsAvailable) if (!converter.IsAvailable)
{ {
@ -284,7 +290,8 @@ public class JpegColorConverterTests
ValidateConversion( ValidateConversion(
converter, converter,
componentCount, componentCount,
seed); seed,
baseLineConverter);
} }
private static JpegColorConverterBase.ComponentValues CreateRandomValues( private static JpegColorConverterBase.ComponentValues CreateRandomValues(
@ -316,21 +323,52 @@ public class JpegColorConverterTests
private static void ValidateConversion( private static void ValidateConversion(
JpegColorConverterBase converter, JpegColorConverterBase converter,
int componentCount, int componentCount,
int seed) int seed,
JpegColorConverterBase baseLineConverter = null)
{ {
JpegColorConverterBase.ComponentValues original = CreateRandomValues(TestBufferLength, componentCount, seed); JpegColorConverterBase.ComponentValues original = CreateRandomValues(TestBufferLength, componentCount, seed);
JpegColorConverterBase.ComponentValues values = new( JpegColorConverterBase.ComponentValues actual = new(
original.ComponentCount, original.ComponentCount,
original.Component0.ToArray(), original.Component0.ToArray(),
original.Component1.ToArray(), original.Component1.ToArray(),
original.Component2.ToArray(), original.Component2.ToArray(),
original.Component3.ToArray()); original.Component3.ToArray());
converter.ConvertToRgbInplace(values); converter.ConvertToRgbInplace(actual);
for (int i = 0; i < TestBufferLength; i++) for (int i = 0; i < TestBufferLength; i++)
{ {
Validate(converter.ColorSpace, original, values, i); Validate(converter.ColorSpace, original, actual, i);
}
if (baseLineConverter != null)
{
JpegColorConverterBase.ComponentValues expected = new(
original.ComponentCount,
original.Component0.ToArray(),
original.Component1.ToArray(),
original.Component2.ToArray(),
original.Component3.ToArray());
baseLineConverter.ConvertToRgbInplace(expected);
if (componentCount == 1)
{
Assert.True(expected.Component0.SequenceEqual(actual.Component0));
}
if (componentCount == 2)
{
Assert.True(expected.Component1.SequenceEqual(actual.Component1));
}
if (componentCount == 3)
{
Assert.True(expected.Component2.SequenceEqual(actual.Component2));
}
if (componentCount == 4)
{
Assert.True(expected.Component3.SequenceEqual(actual.Component3));
}
} }
} }
@ -368,9 +406,9 @@ public class JpegColorConverterTests
float y = values.Component0[i]; float y = values.Component0[i];
float cb = values.Component1[i]; float cb = values.Component1[i];
float cr = values.Component2[i]; float cr = values.Component2[i];
var expected = ColorSpaceConverter.ToRgb(new YCbCr(y, cb, cr)); Rgb expected = ColorSpaceConverter.ToRgb(new YCbCr(y, cb, cr));
var actual = new Rgb(result.Component0[i], result.Component1[i], result.Component2[i]); Rgb actual = new(result.Component0[i], result.Component1[i], result.Component2[i]);
bool equal = ColorSpaceComparer.Equals(expected, actual); bool equal = ColorSpaceComparer.Equals(expected, actual);
Assert.True(equal, $"Colors {expected} and {actual} are not equal at index {i}"); Assert.True(equal, $"Colors {expected} and {actual} are not equal at index {i}");

Loading…
Cancel
Save