diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.cs index a350ebc617..08e4fdb535 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1Inverse2dTransformer.cs @@ -542,6 +542,8 @@ internal static class Av1Inverse2dTransformer int shift0 = config.Shift0; int shift1 = config.Shift1; bool normalizeRectangle = Math.Abs(config.TransformSize.GetRectangleLogRatio()) == 1; + byte rowClampBits = (byte)(bitDepth + 8); + byte columnClampBits = (byte)Math.Max(bitDepth + 6, 16); Span tempIn = workspace[..vectorLength]; Span tempOut = workspace.Slice(vectorLength, vectorLength); Span step = workspace.Slice(2 * vectorLength, vectorLength); @@ -554,12 +556,12 @@ internal static class Av1Inverse2dTransformer for (int column = 0; column < width; column++) { int value = input[rowOffset + column]; - tempIn[column] = normalizeRectangle + value = normalizeRectangle ? Av1Math.RoundShift((long)value * Av1InverseTransformMath.NewInverseSqrt2, Av1InverseTransformMath.NewSqrt2BitCount) : value; + tempIn[column] = Av1Transform1dMath.Clamp(value, rowClampBits); } - Av1InverseTransformMath.ClampBuffer(tempIn, width, (byte)(bitDepth + 8)); TRowOperator.Transform(tempIn, tempOut, step, config.CosBitRow, config.StageRangeRow); Av1InverseTransformMath.RoundShiftArray(tempOut, width, -shift0); tempOut[..width].CopyTo(buffer.Slice(rowOffset, width)); @@ -571,10 +573,9 @@ internal static class Av1Inverse2dTransformer for (int row = 0; row < height; row++) { - tempIn[row] = buffer[(row * width) + sourceColumn]; + tempIn[row] = Av1Transform1dMath.Clamp(buffer[(row * width) + sourceColumn], columnClampBits); } - Av1InverseTransformMath.ClampBuffer(tempIn, height, (byte)Math.Max(bitDepth + 6, 16)); TColumnOperator.Transform(tempIn, tempOut, step, config.CosBitColumn, config.StageRangeColumn); Av1InverseTransformMath.RoundShiftArray(tempOut, height, -shift1); diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformMath.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformMath.cs index fcd050850e..40a9f92655 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformMath.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1InverseTransformMath.cs @@ -261,38 +261,6 @@ internal static class Av1InverseTransformMath } } - /// - /// Clamps a transform-stage buffer to a signed range of the specified bit width. - /// - /// The transform-stage values. - /// The number of values to clamp. - /// The signed range width in bits. - internal static void ClampBuffer(Span buffer, int size, byte bit) - { - for (int i = 0; i < size; i++) - { - buffer[i] = ClampValue(buffer[i], bit); - } - } - - /// - /// Clamps one transform-stage value to a signed range of the specified bit width. - /// - /// The value to clamp. - /// The signed range width in bits. - /// The clamped value. - private static int ClampValue(int value, byte bit) - { - if (bit <= 0) - { - return value; // Do nothing for invalid clamp bit. - } - - long maximum = (1L << (bit - 1)) - 1; - long minimum = -(1L << (bit - 1)); - return (int)Av1Math.Clamp(value, minimum, maximum); - } - /// /// Restricts an inverse-transform residual to the intermediate range permitted for the sample bit depth. ///