|
|
|
@ -11,8 +11,74 @@ namespace SixLabors.ImageSharp.Tests.Formats.Webp |
|
|
|
[Trait("Format", "Webp")] |
|
|
|
public class LossyUtilsTests |
|
|
|
{ |
|
|
|
private static void RunTransformTwoTest() |
|
|
|
{ |
|
|
|
// arrange
|
|
|
|
short[] src = { 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 23, 0, 0, -23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
|
|
|
byte[] dst = |
|
|
|
{ |
|
|
|
103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, 169, 169, 169, 169, 171, 171, 171, 171, |
|
|
|
171, 171, 171, 171, 0, 0, 0, 0, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, |
|
|
|
0, 0, 0, 0, 169, 169, 169, 169, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, |
|
|
|
103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, 0, 0, 0, 169, 169, 169, 169, |
|
|
|
171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 103, 103, 103, 103, 103, 103, 103, 103, |
|
|
|
103, 103, 103, 103, 0, 0, 0, 0, 169, 169, 169, 169, 171, 171, 171, 171, 171, 171, 171, 171, |
|
|
|
0, 0, 0, 0, 0, 0, 0, 0 |
|
|
|
}; |
|
|
|
byte[] expected = |
|
|
|
{ |
|
|
|
105, 105, 105, 105, 105, 103, 100, 98, 0, 0, 0, 0, 169, 169, 169, 169, 171, 171, 171, 171, 171, 171, |
|
|
|
171, 171, 0, 0, 0, 0, 103, 103, 103, 103, 105, 105, 105, 105, 108, 105, 102, 100, 0, 0, 0, 0, 169, |
|
|
|
169, 169, 169, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 103, 103, 103, 103, 105, 105, |
|
|
|
105, 105, 111, 109, 106, 103, 0, 0, 0, 0, 169, 169, 169, 169, 171, 171, 171, 171, 171, 171, 171, |
|
|
|
171, 0, 0, 0, 0, 103, 103, 103, 103, 105, 105, 105, 105, 113, 111, 108, 106, 0, 0, 0, 0, 169, 169, |
|
|
|
169, 169, 171, 171, 171, 171, 171, 171, 171, 171, 0, 0, 0, 0, 0, 0, 0, 0 |
|
|
|
}; |
|
|
|
int[] scratch = new int[16]; |
|
|
|
|
|
|
|
// act
|
|
|
|
LossyUtils.TransformTwo(src, dst, scratch); |
|
|
|
|
|
|
|
// assert
|
|
|
|
Assert.True(expected.SequenceEqual(dst)); |
|
|
|
} |
|
|
|
|
|
|
|
private static void RunTransformOneTest() |
|
|
|
{ |
|
|
|
// arrange
|
|
|
|
short[] src = { -176, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; |
|
|
|
byte[] dst = |
|
|
|
{ |
|
|
|
128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, 128, 128, 128, 128, |
|
|
|
128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, 128, 128, 128, 128, 128, 128, 128, 128, |
|
|
|
0, 0, 0, 0, 0, 0, 0, 129, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, |
|
|
|
0, 0, 0, 129, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, |
|
|
|
128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, 128, 128, 128, 128, |
|
|
|
128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, 128, 128, 128, 128, 128, 128, 128, 128, |
|
|
|
0, 0, 0, 0, 0, 0, 0, 129 |
|
|
|
}; |
|
|
|
byte[] expected = |
|
|
|
{ |
|
|
|
111, 111, 111, 111, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, 128, 128, 128, 128, |
|
|
|
128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, 108, 108, 108, 108, 128, 128, 128, 128, |
|
|
|
0, 0, 0, 0, 0, 0, 0, 129, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, |
|
|
|
0, 0, 0, 129, 104, 104, 104, 104, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, |
|
|
|
128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, 101, 101, 101, 101, |
|
|
|
128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 129, 128, 128, 128, 128, 128, 128, 128, 128, |
|
|
|
0, 0, 0, 0, 0, 0, 0, 129 |
|
|
|
}; |
|
|
|
int[] scratch = new int[16]; |
|
|
|
|
|
|
|
// act
|
|
|
|
LossyUtils.TransformOne(src, dst, scratch); |
|
|
|
|
|
|
|
// assert
|
|
|
|
Assert.True(expected.SequenceEqual(dst)); |
|
|
|
} |
|
|
|
|
|
|
|
private static void RunVp8Sse4X4Test() |
|
|
|
{ |
|
|
|
// arrange
|
|
|
|
byte[] a = |
|
|
|
{ |
|
|
|
27, 27, 28, 29, 29, 28, 27, 27, 27, 28, 28, 29, 29, 28, 28, 27, 129, 129, 129, 129, 129, 129, 129, |
|
|
|
@ -35,8 +101,10 @@ namespace SixLabors.ImageSharp.Tests.Formats.Webp |
|
|
|
|
|
|
|
int expected = 27; |
|
|
|
|
|
|
|
// act
|
|
|
|
int actual = LossyUtils.Vp8_Sse4X4(a, b); |
|
|
|
|
|
|
|
// assert
|
|
|
|
Assert.Equal(expected, actual); |
|
|
|
} |
|
|
|
|
|
|
|
@ -65,6 +133,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Webp |
|
|
|
|
|
|
|
private static void RunHadamardTransformTest() |
|
|
|
{ |
|
|
|
// arrange
|
|
|
|
byte[] a = |
|
|
|
{ |
|
|
|
27, 27, 28, 29, 29, 28, 27, 27, 27, 28, 28, 29, 29, 28, 28, 27, 129, 129, 129, 129, 129, 129, 129, |
|
|
|
@ -86,10 +155,19 @@ namespace SixLabors.ImageSharp.Tests.Formats.Webp |
|
|
|
ushort[] w = { 38, 32, 20, 9, 32, 28, 17, 7, 20, 17, 10, 4, 9, 7, 4, 2 }; |
|
|
|
int expected = 2; |
|
|
|
|
|
|
|
// act
|
|
|
|
int actual = LossyUtils.Vp8Disto4X4(a, b, w, new int[16]); |
|
|
|
|
|
|
|
// assert
|
|
|
|
Assert.Equal(expected, actual); |
|
|
|
} |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void RunTransformTwo_Works() => RunTransformTwoTest(); |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void RunTransformOne_Works() => RunTransformOneTest(); |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Vp8Sse4X4_Works() => RunVp8Sse4X4Test(); |
|
|
|
|
|
|
|
@ -100,6 +178,18 @@ namespace SixLabors.ImageSharp.Tests.Formats.Webp |
|
|
|
public void HadamardTransform_Works() => RunHadamardTransformTest(); |
|
|
|
|
|
|
|
#if SUPPORTS_RUNTIME_INTRINSICS
|
|
|
|
[Fact] |
|
|
|
public void TransformTwo_WithHardwareIntrinsics_Works() => FeatureTestRunner.RunWithHwIntrinsicsFeature(RunTransformTwoTest, HwIntrinsics.AllowAll); |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void TransformTwo_WithoutHardwareIntrinsics_Works() => FeatureTestRunner.RunWithHwIntrinsicsFeature(RunTransformTwoTest, HwIntrinsics.DisableHWIntrinsic); |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void TransformOne_WithHardwareIntrinsics_Works() => FeatureTestRunner.RunWithHwIntrinsicsFeature(RunTransformOneTest, HwIntrinsics.AllowAll); |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void TransformOne_WithoutHardwareIntrinsics_Works() => FeatureTestRunner.RunWithHwIntrinsicsFeature(RunTransformOneTest, HwIntrinsics.DisableHWIntrinsic); |
|
|
|
|
|
|
|
[Fact] |
|
|
|
public void Vp8Sse4X4_WithHardwareIntrinsics_Works() => FeatureTestRunner.RunWithHwIntrinsicsFeature(RunVp8Sse4X4Test, HwIntrinsics.AllowAll); |
|
|
|
|
|
|
|
|