From 9c1ac8b7a43f565f27bac07a26180e154b06e242 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sat, 26 Aug 2017 23:26:19 +0200 Subject: [PATCH] better IDCT constants, but it did not help --- ...plementationsTests.FastFloatingPointDCT.cs | 46 +++---------------- ...nceImplementations.FastFloatingPointDCT.cs | 42 ++++++++++++++--- 2 files changed, 42 insertions(+), 46 deletions(-) diff --git a/tests/ImageSharp.Tests/Formats/Jpg/ReferenceImplementationsTests.FastFloatingPointDCT.cs b/tests/ImageSharp.Tests/Formats/Jpg/ReferenceImplementationsTests.FastFloatingPointDCT.cs index 96c2f1c9d9..034d5efd74 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/ReferenceImplementationsTests.FastFloatingPointDCT.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/ReferenceImplementationsTests.FastFloatingPointDCT.cs @@ -34,26 +34,13 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg this.CompareBlocks(data.ConvertAllToFloat(), src, 2f); } - - //[Theory(Skip = "Sandboxing only! (Incorrect reference implementation)")] - //[InlineData(42)] - //[InlineData(1)] - //[InlineData(2)] - //public void IDCT_IsEquivalentTo_StandardIntegerImplementation(int seed) - //{ - // int[] intData = JpegUtilityTestFixture.Create8x8RandomIntData(-1000, 1000, seed); - // Span floatSrc = intData.ConvertAllToFloat(); - - // ReferenceImplementations.StandardIntegerDCT.TransformIDCTInplace(intData); - - // float[] dest = new float[64]; - // float[] temp = new float[64]; - - // ReferenceImplementations.FastFloatingPointDCT.iDCT2D_llm(floatSrc, dest, temp); - - // this.CompareBlocks(intData.ConvertAllToFloat(), dest, 1f); - //} - + + // [Fact] + public void CalcConstants() + { + ReferenceImplementations.FastFloatingPointDCT.PrintConstants(this.Output); + } + [Theory] [InlineData(42, 1000)] [InlineData(1, 1000)] @@ -76,25 +63,6 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg this.CompareBlocks(intData.ConvertAllToFloat(), dest, 1f); } - //[Theory] - //[InlineData(42)] - //[InlineData(1)] - //[InlineData(2)] - //public void FDCT_IsEquivalentTo_StandardIntegerImplementation(int seed) - //{ - // int[] intData = JpegUtilityTestFixture.Create8x8RandomIntData(-1000, 1000, seed); - // float[] floatSrc = intData.ConvertAllToFloat(); - - // ReferenceImplementations.StandardIntegerDCT.Subtract128_TransformFDCT_Upscale8_Inplace(intData); - - // float[] dest = new float[64]; - // float[] temp = new float[64]; - - // ReferenceImplementations.FastFloatingPointDCT.fDCT2D_llm(floatSrc, dest, temp, subtract128FromSource: true); - - // this.CompareBlocks(intData.ConvertAllToFloat(), dest, 2f); - //} - [Theory] [InlineData(42)] [InlineData(1)] diff --git a/tests/ImageSharp.Tests/Formats/Jpg/Utils/ReferenceImplementations.FastFloatingPointDCT.cs b/tests/ImageSharp.Tests/Formats/Jpg/Utils/ReferenceImplementations.FastFloatingPointDCT.cs index 61297e1945..ddfb75517f 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/Utils/ReferenceImplementations.FastFloatingPointDCT.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/Utils/ReferenceImplementations.FastFloatingPointDCT.cs @@ -8,8 +8,18 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg.Utils using SixLabors.ImageSharp.Formats.Jpeg.Common; using SixLabors.ImageSharp.Formats.Jpeg.GolangPort.Utils; + using Xunit.Abstractions; + internal static partial class ReferenceImplementations { + /// + /// Contains a non-optimized port of: + /// https://github.com/norishigefukushima/dct_simd/blob/master/dct/dct8x8_simd.cpp + /// + /// The main purpose of this code is testing and documentation, it is intented to be similar to it's original counterpart. + /// DO NOT clean it! + /// DO NOT StyleCop it! + /// internal static class FastFloatingPointDCT { public static Block8x8F TransformIDCT(ref Block8x8F source) @@ -38,6 +48,23 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg.Utils return result; } + private static double cos(double x) => Math.Cos(x); + + private const double M_PI = Math.PI; + + private static readonly double M_SQRT2 = Math.Sqrt(2); + + public static float[] PrintConstants(ITestOutputHelper output) + { + float[] r = new float[8]; + for (int i = 0; i < 8; i++) + { + r[i] = (float)(cos((double)i / 16.0 * M_PI) * M_SQRT2); + output?.WriteLine($"float r{i} = {r[i]:R}f;"); + } + return r; + } + /// /// https://github.com/norishigefukushima/dct_simd/blob/master/dct/dct8x8_simd.cpp#L200 /// @@ -48,14 +75,15 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg.Utils float a0, a1, a2, a3, b0, b1, b2, b3; float z0, z1, z2, z3, z4; - //float r0 = 1.414214f; - float r1 = 1.387040f; + // see: PrintConstants() + float r0 = 1.41421354f; + float r1 = 1.3870399f; float r2 = 1.306563f; - float r3 = 1.175876f; - //float r4 = 1.000000f; - float r5 = 0.785695f; - float r6 = 0.541196f; - float r7 = 0.275899f; + float r3 = 1.17587554f; + float r4 = 1f; + float r5 = 0.785694957f; + float r6 = 0.5411961f; + float r7 = 0.27589938f; z0 = y[1] + y[7]; z1 = y[3] + y[5];