|
|
@ -39,10 +39,15 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
public void ConvertFromYCbCrBasic(int inputBufferLength, int resultBufferLength, int seed) |
|
|
public void ConvertFromYCbCrBasic(int inputBufferLength, int resultBufferLength, int seed) |
|
|
{ |
|
|
{ |
|
|
ValidateConversion(new JpegColorConverter.FromYCbCrBasic(), 3, inputBufferLength, resultBufferLength, seed, ValidateYCbCr); |
|
|
ValidateRgbToYCbCrConversion( |
|
|
|
|
|
new JpegColorConverter.FromYCbCrBasic(), |
|
|
|
|
|
3, |
|
|
|
|
|
inputBufferLength, |
|
|
|
|
|
resultBufferLength, |
|
|
|
|
|
seed); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private static void ValidateYCbCr(JpegColorConverter.ComponentValues values, Span<Vector4> result, int i) |
|
|
private static void ValidateYCbCr(JpegColorConverter.ComponentValues values, Vector4[] result, int i) |
|
|
{ |
|
|
{ |
|
|
float y = values.Component0[i]; |
|
|
float y = values.Component0[i]; |
|
|
float cb = values.Component1[i]; |
|
|
float cb = values.Component1[i]; |
|
|
@ -63,20 +68,27 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
[InlineData(8, 3)] |
|
|
[InlineData(8, 3)] |
|
|
public void FromYCbCrSimd_ConvertCore(int size, int seed) |
|
|
public void FromYCbCrSimd_ConvertCore(int size, int seed) |
|
|
{ |
|
|
{ |
|
|
ValidateConversion(JpegColorConverter.FromYCbCrSimd.ConvertCore, 3, size, size, seed, ValidateYCbCr); |
|
|
JpegColorConverter.ComponentValues values = CreateRandomValues(3, size, seed); |
|
|
|
|
|
Vector4[] result = new Vector4[size]; |
|
|
|
|
|
|
|
|
|
|
|
JpegColorConverter.FromYCbCrSimd.ConvertCore(values, result); |
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < size; i++) |
|
|
|
|
|
{ |
|
|
|
|
|
ValidateYCbCr(values, result, i); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
[Theory] |
|
|
[Theory] |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
public void FromYCbCrSimd(int inputBufferLength, int resultBufferLength, int seed) |
|
|
public void FromYCbCrSimd(int inputBufferLength, int resultBufferLength, int seed) |
|
|
{ |
|
|
{ |
|
|
ValidateConversion( |
|
|
ValidateRgbToYCbCrConversion( |
|
|
new JpegColorConverter.FromYCbCrSimd(), |
|
|
new JpegColorConverter.FromYCbCrSimd(), |
|
|
3, |
|
|
3, |
|
|
inputBufferLength, |
|
|
inputBufferLength, |
|
|
resultBufferLength, |
|
|
resultBufferLength, |
|
|
seed, |
|
|
seed); |
|
|
ValidateYCbCr); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
[Theory] |
|
|
[Theory] |
|
|
@ -91,13 +103,12 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
|
|
|
|
|
//JpegColorConverter.FromYCbCrSimdAvx2.LogPlz = s => this.Output.WriteLine(s);
|
|
|
//JpegColorConverter.FromYCbCrSimdAvx2.LogPlz = s => this.Output.WriteLine(s);
|
|
|
|
|
|
|
|
|
ValidateConversion( |
|
|
ValidateRgbToYCbCrConversion( |
|
|
new JpegColorConverter.FromYCbCrSimdAvx2(), |
|
|
new JpegColorConverter.FromYCbCrSimdAvx2(), |
|
|
3, |
|
|
3, |
|
|
inputBufferLength, |
|
|
inputBufferLength, |
|
|
resultBufferLength, |
|
|
resultBufferLength, |
|
|
seed, |
|
|
seed); |
|
|
ValidateYCbCr); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -105,10 +116,15 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
public void ConvertFromYCbCr_WithDefaultConverter(int inputBufferLength, int resultBufferLength, int seed) |
|
|
public void ConvertFromYCbCr_WithDefaultConverter(int inputBufferLength, int resultBufferLength, int seed) |
|
|
{ |
|
|
{ |
|
|
ValidateConversion(JpegColorSpace.YCbCr, 3, inputBufferLength, resultBufferLength, seed, ValidateYCbCr); |
|
|
ValidateConversion( |
|
|
|
|
|
JpegColorSpace.YCbCr, |
|
|
|
|
|
3, |
|
|
|
|
|
inputBufferLength, |
|
|
|
|
|
resultBufferLength, |
|
|
|
|
|
seed); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Becnhmark, for local execution only
|
|
|
// Benchmark, for local execution only
|
|
|
//[Theory]
|
|
|
//[Theory]
|
|
|
//[InlineData(false)]
|
|
|
//[InlineData(false)]
|
|
|
//[InlineData(true)]
|
|
|
//[InlineData(true)]
|
|
|
@ -141,13 +157,13 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
var v = new Vector4(0, 0, 0, 1F); |
|
|
var v = new Vector4(0, 0, 0, 1F); |
|
|
var scale = new Vector4(1 / 255F, 1 / 255F, 1 / 255F, 1F); |
|
|
var scale = new Vector4(1 / 255F, 1 / 255F, 1 / 255F, 1F); |
|
|
|
|
|
|
|
|
ValidateConversion( |
|
|
var converter = JpegColorConverter.GetConverter(JpegColorSpace.Cmyk); |
|
|
JpegColorSpace.Cmyk, |
|
|
JpegColorConverter.ComponentValues values = CreateRandomValues(4, inputBufferLength, seed); |
|
|
4, |
|
|
Vector4[] result = new Vector4[resultBufferLength]; |
|
|
inputBufferLength, |
|
|
|
|
|
resultBufferLength, |
|
|
converter.ConvertToRGBA(values, result); |
|
|
seed, |
|
|
|
|
|
(values, result, i) => |
|
|
for (int i = 0; i < resultBufferLength; i++) |
|
|
{ |
|
|
{ |
|
|
float c = values.Component0[i]; |
|
|
float c = values.Component0[i]; |
|
|
float m = values.Component1[i]; |
|
|
float m = values.Component1[i]; |
|
|
@ -167,20 +183,20 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
|
|
|
|
|
Assert.True(actual.AlmostEquals(expected, Precision)); |
|
|
Assert.True(actual.AlmostEquals(expected, Precision)); |
|
|
Assert.Equal(1, rgba.W); |
|
|
Assert.Equal(1, rgba.W); |
|
|
}); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
[Theory] |
|
|
[Theory] |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
public void ConvertFromGrayScale(int inputBufferLength, int resultBufferLength, int seed) |
|
|
public void ConvertFromGrayScale(int inputBufferLength, int resultBufferLength, int seed) |
|
|
{ |
|
|
{ |
|
|
ValidateConversion( |
|
|
var converter = JpegColorConverter.GetConverter(JpegColorSpace.GrayScale); |
|
|
JpegColorSpace.GrayScale, |
|
|
JpegColorConverter.ComponentValues values = CreateRandomValues(1, inputBufferLength, seed); |
|
|
1, |
|
|
Vector4[] result = new Vector4[resultBufferLength]; |
|
|
inputBufferLength, |
|
|
|
|
|
resultBufferLength, |
|
|
converter.ConvertToRGBA(values, result); |
|
|
seed, |
|
|
|
|
|
(values, result, i) => |
|
|
for (int i = 0; i < resultBufferLength; i++) |
|
|
{ |
|
|
{ |
|
|
float y = values.Component0[i]; |
|
|
float y = values.Component0[i]; |
|
|
Vector4 rgba = result[i]; |
|
|
Vector4 rgba = result[i]; |
|
|
@ -189,20 +205,20 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
|
|
|
|
|
Assert.True(actual.AlmostEquals(expected, Precision)); |
|
|
Assert.True(actual.AlmostEquals(expected, Precision)); |
|
|
Assert.Equal(1, rgba.W); |
|
|
Assert.Equal(1, rgba.W); |
|
|
}); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
[Theory] |
|
|
[Theory] |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
[MemberData(nameof(CommonConversionData))] |
|
|
public void ConvertFromRgb(int inputBufferLength, int resultBufferLength, int seed) |
|
|
public void ConvertFromRgb(int inputBufferLength, int resultBufferLength, int seed) |
|
|
{ |
|
|
{ |
|
|
ValidateConversion( |
|
|
var converter = JpegColorConverter.GetConverter(JpegColorSpace.RGB); |
|
|
JpegColorSpace.RGB, |
|
|
JpegColorConverter.ComponentValues values = CreateRandomValues(3, inputBufferLength, seed); |
|
|
3, |
|
|
Vector4[] result = new Vector4[resultBufferLength]; |
|
|
inputBufferLength, |
|
|
|
|
|
resultBufferLength, |
|
|
converter.ConvertToRGBA(values, result); |
|
|
seed, |
|
|
|
|
|
(values, result, i) => |
|
|
for (int i = 0; i < resultBufferLength; i++) |
|
|
{ |
|
|
{ |
|
|
float r = values.Component0[i]; |
|
|
float r = values.Component0[i]; |
|
|
float g = values.Component1[i]; |
|
|
float g = values.Component1[i]; |
|
|
@ -213,7 +229,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
|
|
|
|
|
Assert.True(actual.AlmostEquals(expected, Precision)); |
|
|
Assert.True(actual.AlmostEquals(expected, Precision)); |
|
|
Assert.Equal(1, rgba.W); |
|
|
Assert.Equal(1, rgba.W); |
|
|
}); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
[Theory] |
|
|
[Theory] |
|
|
@ -223,13 +239,13 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
var v = new Vector4(0, 0, 0, 1F); |
|
|
var v = new Vector4(0, 0, 0, 1F); |
|
|
var scale = new Vector4(1 / 255F, 1 / 255F, 1 / 255F, 1F); |
|
|
var scale = new Vector4(1 / 255F, 1 / 255F, 1 / 255F, 1F); |
|
|
|
|
|
|
|
|
ValidateConversion( |
|
|
var converter = JpegColorConverter.GetConverter(JpegColorSpace.Ycck); |
|
|
JpegColorSpace.Ycck, |
|
|
JpegColorConverter.ComponentValues values = CreateRandomValues(4, inputBufferLength, seed); |
|
|
4, |
|
|
Vector4[] result = new Vector4[resultBufferLength]; |
|
|
inputBufferLength, |
|
|
|
|
|
resultBufferLength, |
|
|
converter.ConvertToRGBA(values, result); |
|
|
seed, |
|
|
|
|
|
(values, result, i) => |
|
|
for (int i = 0; i < resultBufferLength; i++) |
|
|
{ |
|
|
{ |
|
|
float y = values.Component0[i]; |
|
|
float y = values.Component0[i]; |
|
|
float cb = values.Component1[i] - 128F; |
|
|
float cb = values.Component1[i] - 128F; |
|
|
@ -251,7 +267,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
|
|
|
|
|
Assert.True(actual.AlmostEquals(expected, Precision)); |
|
|
Assert.True(actual.AlmostEquals(expected, Precision)); |
|
|
Assert.Equal(1, rgba.W); |
|
|
Assert.Equal(1, rgba.W); |
|
|
}); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private static JpegColorConverter.ComponentValues CreateRandomValues( |
|
|
private static JpegColorConverter.ComponentValues CreateRandomValues( |
|
|
@ -283,51 +299,31 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
int componentCount, |
|
|
int componentCount, |
|
|
int inputBufferLength, |
|
|
int inputBufferLength, |
|
|
int resultBufferLength, |
|
|
int resultBufferLength, |
|
|
int seed, |
|
|
int seed) |
|
|
Action<JpegColorConverter.ComponentValues, Span<Vector4>, int> validatePixelValue) |
|
|
|
|
|
{ |
|
|
{ |
|
|
ValidateConversion( |
|
|
ValidateRgbToYCbCrConversion( |
|
|
JpegColorConverter.GetConverter(colorSpace), |
|
|
JpegColorConverter.GetConverter(colorSpace), |
|
|
componentCount, |
|
|
componentCount, |
|
|
inputBufferLength, |
|
|
inputBufferLength, |
|
|
resultBufferLength, |
|
|
resultBufferLength, |
|
|
seed, |
|
|
seed); |
|
|
validatePixelValue); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private static void ValidateConversion( |
|
|
private static void ValidateRgbToYCbCrConversion( |
|
|
JpegColorConverter converter, |
|
|
JpegColorConverter converter, |
|
|
int componentCount, |
|
|
int componentCount, |
|
|
int inputBufferLength, |
|
|
int inputBufferLength, |
|
|
int resultBufferLength, |
|
|
int resultBufferLength, |
|
|
int seed, |
|
|
int seed) |
|
|
Action<JpegColorConverter.ComponentValues, Span<Vector4>, int> validatePixelValue) |
|
|
|
|
|
{ |
|
|
|
|
|
ValidateConversion( |
|
|
|
|
|
converter.ConvertToRGBA, |
|
|
|
|
|
componentCount, |
|
|
|
|
|
inputBufferLength, |
|
|
|
|
|
resultBufferLength, |
|
|
|
|
|
seed, |
|
|
|
|
|
validatePixelValue); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static void ValidateConversion( |
|
|
|
|
|
Action<JpegColorConverter.ComponentValues, Span<Vector4>> doConvert, |
|
|
|
|
|
int componentCount, |
|
|
|
|
|
int inputBufferLength, |
|
|
|
|
|
int resultBufferLength, |
|
|
|
|
|
int seed, |
|
|
|
|
|
Action<JpegColorConverter.ComponentValues, Span<Vector4>, int> validatePixelValue) |
|
|
|
|
|
{ |
|
|
{ |
|
|
JpegColorConverter.ComponentValues values = CreateRandomValues(componentCount, inputBufferLength, seed); |
|
|
JpegColorConverter.ComponentValues values = CreateRandomValues(componentCount, inputBufferLength, seed); |
|
|
Vector4[] result = new Vector4[resultBufferLength]; |
|
|
Vector4[] result = new Vector4[resultBufferLength]; |
|
|
|
|
|
|
|
|
doConvert(values, result); |
|
|
converter.ConvertToRGBA(values, result); |
|
|
|
|
|
|
|
|
for (int i = 0; i < resultBufferLength; i++) |
|
|
for (int i = 0; i < resultBufferLength; i++) |
|
|
{ |
|
|
{ |
|
|
validatePixelValue(values, result, i); |
|
|
ValidateYCbCr(values, result, i); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|