|
|
|
@ -416,39 +416,77 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
int resultBufferLength, |
|
|
|
int seed) |
|
|
|
{ |
|
|
|
JpegColorConverter.ComponentValues values = CreateRandomValues(componentCount, inputBufferLength, seed); |
|
|
|
var result = new Vector4[resultBufferLength]; |
|
|
|
JpegColorConverter.ComponentValues original = CreateRandomValues(componentCount, inputBufferLength, seed); |
|
|
|
JpegColorConverter.ComponentValues values = Copy(original); |
|
|
|
|
|
|
|
converter.ConvertToRgba(values, result); |
|
|
|
converter.ConvertToRgbInplace(values); |
|
|
|
|
|
|
|
for (int i = 0; i < resultBufferLength; i++) |
|
|
|
{ |
|
|
|
Validate(converter.ColorSpace, values, result, i); |
|
|
|
Validate(converter.ColorSpace, original, values, i); |
|
|
|
} |
|
|
|
|
|
|
|
static JpegColorConverter.ComponentValues Copy(JpegColorConverter.ComponentValues values) |
|
|
|
{ |
|
|
|
Span<float> c0 = values.Component0.ToArray(); |
|
|
|
Span<float> c1 = values.ComponentCount > 1 ? values.Component1.ToArray().AsSpan() : default; |
|
|
|
Span<float> c2 = values.ComponentCount > 2 ? values.Component2.ToArray().AsSpan() : default; |
|
|
|
Span<float> c3 = values.ComponentCount > 3 ? values.Component3.ToArray().AsSpan() : default; |
|
|
|
return new JpegColorConverter.ComponentValues(values.ComponentCount, c0, c1, c2, c3); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static void Validate( |
|
|
|
JpegColorSpace colorSpace, |
|
|
|
in JpegColorConverter.ComponentValues values, |
|
|
|
in JpegColorConverter.ComponentValues original, |
|
|
|
Vector4[] result, |
|
|
|
int i) |
|
|
|
{ |
|
|
|
switch (colorSpace) |
|
|
|
{ |
|
|
|
case JpegColorSpace.Grayscale: |
|
|
|
ValidateGrayScale(values, result, i); |
|
|
|
ValidateGrayScale(original, result, i); |
|
|
|
break; |
|
|
|
case JpegColorSpace.Ycck: |
|
|
|
ValidateCyyK(values, result, i); |
|
|
|
ValidateCyyK(original, result, i); |
|
|
|
break; |
|
|
|
case JpegColorSpace.Cmyk: |
|
|
|
ValidateCmyk(values, result, i); |
|
|
|
ValidateCmyk(original, result, i); |
|
|
|
break; |
|
|
|
case JpegColorSpace.RGB: |
|
|
|
ValidateRgb(values, result, i); |
|
|
|
ValidateRgb(original, result, i); |
|
|
|
break; |
|
|
|
case JpegColorSpace.YCbCr: |
|
|
|
ValidateYCbCr(values, result, i); |
|
|
|
ValidateYCbCr(original, result, i); |
|
|
|
break; |
|
|
|
default: |
|
|
|
Assert.True(false, $"Colorspace {colorSpace} not supported!"); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private static void Validate( |
|
|
|
JpegColorSpace colorSpace, |
|
|
|
in JpegColorConverter.ComponentValues original, |
|
|
|
in JpegColorConverter.ComponentValues result, |
|
|
|
int i) |
|
|
|
{ |
|
|
|
switch (colorSpace) |
|
|
|
{ |
|
|
|
case JpegColorSpace.Grayscale: |
|
|
|
ValidateGrayScale(original, result, i); |
|
|
|
break; |
|
|
|
case JpegColorSpace.Ycck: |
|
|
|
ValidateCyyK(original, result, i); |
|
|
|
break; |
|
|
|
case JpegColorSpace.Cmyk: |
|
|
|
ValidateCmyk(original, result, i); |
|
|
|
break; |
|
|
|
case JpegColorSpace.RGB: |
|
|
|
ValidateRgb(original, result, i); |
|
|
|
break; |
|
|
|
case JpegColorSpace.YCbCr: |
|
|
|
ValidateYCbCr(original, result, i); |
|
|
|
break; |
|
|
|
default: |
|
|
|
Assert.True(false, $"Colorspace {colorSpace} not supported!"); |
|
|
|
@ -471,6 +509,19 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
Assert.Equal(1, rgba.W); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateYCbCr(in JpegColorConverter.ComponentValues values, in JpegColorConverter.ComponentValues result, int i) |
|
|
|
{ |
|
|
|
float y = values.Component0[i]; |
|
|
|
float cb = values.Component1[i]; |
|
|
|
float cr = values.Component2[i]; |
|
|
|
var ycbcr = new YCbCr(y, cb, cr); |
|
|
|
|
|
|
|
var actual = new Rgb(result.Component0[i], result.Component1[i], result.Component2[i]); |
|
|
|
var expected = ColorSpaceConverter.ToRgb(ycbcr); |
|
|
|
|
|
|
|
Assert.Equal(expected, actual, ColorSpaceComparer); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateCyyK(in JpegColorConverter.ComponentValues values, Vector4[] result, int i) |
|
|
|
{ |
|
|
|
var v = new Vector4(0, 0, 0, 1F); |
|
|
|
@ -498,6 +549,31 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
Assert.Equal(1, rgba.W); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateCyyK(in JpegColorConverter.ComponentValues values, in JpegColorConverter.ComponentValues result, int i) |
|
|
|
{ |
|
|
|
var v = new Vector4(0, 0, 0, 1F); |
|
|
|
var scale = new Vector4(1 / 255F, 1 / 255F, 1 / 255F, 1F); |
|
|
|
|
|
|
|
float y = values.Component0[i]; |
|
|
|
float cb = values.Component1[i] - 128F; |
|
|
|
float cr = values.Component2[i] - 128F; |
|
|
|
float k = values.Component3[i] / 255F; |
|
|
|
|
|
|
|
v.X = (255F - (float)Math.Round(y + (1.402F * cr), MidpointRounding.AwayFromZero)) * k; |
|
|
|
v.Y = (255F - (float)Math.Round( |
|
|
|
y - (0.344136F * cb) - (0.714136F * cr), |
|
|
|
MidpointRounding.AwayFromZero)) * k; |
|
|
|
v.Z = (255F - (float)Math.Round(y + (1.772F * cb), MidpointRounding.AwayFromZero)) * k; |
|
|
|
v.W = 1F; |
|
|
|
|
|
|
|
v *= scale; |
|
|
|
|
|
|
|
var actual = new Rgb(result.Component0[i], result.Component1[i], result.Component2[i]); |
|
|
|
var expected = new Rgb(v.X, v.Y, v.Z); |
|
|
|
|
|
|
|
Assert.Equal(expected, actual, ColorSpaceComparer); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateRgb(in JpegColorConverter.ComponentValues values, Vector4[] result, int i) |
|
|
|
{ |
|
|
|
float r = values.Component0[i]; |
|
|
|
@ -511,6 +587,18 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
Assert.Equal(1, rgba.W); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateRgb(in JpegColorConverter.ComponentValues values, in JpegColorConverter.ComponentValues result, int i) |
|
|
|
{ |
|
|
|
float r = values.Component0[i]; |
|
|
|
float g = values.Component1[i]; |
|
|
|
float b = values.Component2[i]; |
|
|
|
|
|
|
|
var actual = new Rgb(result.Component0[i], result.Component1[i], result.Component2[i]); |
|
|
|
var expected = new Rgb(r / 255F, g / 255F, b / 255F); |
|
|
|
|
|
|
|
Assert.Equal(expected, actual, ColorSpaceComparer); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateGrayScale(in JpegColorConverter.ComponentValues values, Vector4[] result, int i) |
|
|
|
{ |
|
|
|
float y = values.Component0[i]; |
|
|
|
@ -522,6 +610,15 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
Assert.Equal(1, rgba.W); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateGrayScale(in JpegColorConverter.ComponentValues values, in JpegColorConverter.ComponentValues result, int i) |
|
|
|
{ |
|
|
|
float y = values.Component0[i]; |
|
|
|
var actual = new Rgb(result.Component0[i], result.Component0[i], result.Component0[i]); |
|
|
|
var expected = new Rgb(y / 255F, y / 255F, y / 255F); |
|
|
|
|
|
|
|
Assert.Equal(expected, actual, ColorSpaceComparer); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateCmyk(in JpegColorConverter.ComponentValues values, Vector4[] result, int i) |
|
|
|
{ |
|
|
|
var v = new Vector4(0, 0, 0, 1F); |
|
|
|
@ -546,5 +643,28 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg |
|
|
|
Assert.Equal(expected, actual, ColorSpaceComparer); |
|
|
|
Assert.Equal(1, rgba.W); |
|
|
|
} |
|
|
|
|
|
|
|
private static void ValidateCmyk(in JpegColorConverter.ComponentValues values, in JpegColorConverter.ComponentValues result, int i) |
|
|
|
{ |
|
|
|
var v = new Vector4(0, 0, 0, 1F); |
|
|
|
var scale = new Vector4(1 / 255F, 1 / 255F, 1 / 255F, 1F); |
|
|
|
|
|
|
|
float c = values.Component0[i]; |
|
|
|
float m = values.Component1[i]; |
|
|
|
float y = values.Component2[i]; |
|
|
|
float k = values.Component3[i] / 255F; |
|
|
|
|
|
|
|
v.X = c * k; |
|
|
|
v.Y = m * k; |
|
|
|
v.Z = y * k; |
|
|
|
v.W = 1F; |
|
|
|
|
|
|
|
v *= scale; |
|
|
|
|
|
|
|
var actual = new Rgb(result.Component0[i], result.Component1[i], result.Component2[i]); |
|
|
|
var expected = new Rgb(v.X, v.Y, v.Z); |
|
|
|
|
|
|
|
Assert.Equal(expected, actual, ColorSpaceComparer); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|