From 4c14c57d09aa9d115cf881cafef5f70ba99c035c Mon Sep 17 00:00:00 2001 From: Dmitry Pentin Date: Wed, 18 Aug 2021 15:11:15 +0300 Subject: [PATCH] Greatly reduced operations per emit call --- .../Jpeg/Components/Encoder/HuffmanLut.cs | 3 ++- .../Components/Encoder/HuffmanScanEncoder.cs | 23 ++++++++----------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanLut.cs b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanLut.cs index ec77bf87db..f563e74e09 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanLut.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanLut.cs @@ -4,6 +4,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder { /// + /// TODO: THIS IS NO LONGER TRUE, INTERNAL REPRESENTATION WAS CHANGED AND THIS DOC SHOULD BE CHANGED TOO!!! /// A compiled look-up table representation of a huffmanSpec. /// Each value maps to a int32 of which the 24 most significant bits hold the /// codeword in bits and the 8 least significant bits hold the codeword size. @@ -54,7 +55,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder int len = i + 1; for (int j = 0; j < spec.Count[i]; j++) { - this.Values[spec.Values[k]] = len | (code << 8); + this.Values[spec.Values[k]] = len | (code << (32 - len)); code++; k++; } diff --git a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs index 42a683539d..fba814882b 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Encoder/HuffmanScanEncoder.cs @@ -349,16 +349,14 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder [MethodImpl(InliningOptions.ShortMethod)] private void Emit(uint bits, int count) { - uint correctedBits = bits << (32 - count); - - this.accumulatedBits |= correctedBits >> this.bitCount; + this.accumulatedBits |= bits >> this.bitCount; count += this.bitCount; if (count >= 32) { this.emitBuffer[--this.emitWriteIndex] = this.accumulatedBits; - this.accumulatedBits = correctedBits << (32 - this.bitCount); + this.accumulatedBits = bits << (32 - this.bitCount); count -= 32; } @@ -375,7 +373,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder private void EmitHuff(int[] table, int value) { int x = table[value]; - this.Emit((uint)x >> 8, x & 0xff); + this.Emit((uint)x & 0xffff_ff00u, x & 0xff); } [MethodImpl(InliningOptions.ShortMethod)] @@ -389,13 +387,10 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder b = value - 1; } - int bt = GetHuffmanEncodingLength((uint)a); + int valueLen = GetHuffmanEncodingLength((uint)a); - this.EmitHuff(table, bt); - if (bt > 0) - { - this.Emit((uint)(b & ((1 << bt) - 1)), bt); - } + this.EmitHuff(table, valueLen); + this.Emit((uint)b << (32 - valueLen), valueLen); } /// @@ -415,10 +410,10 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Encoder b = value - 1; } - int bt = GetHuffmanEncodingLength((uint)a); + int valueLen = GetHuffmanEncodingLength((uint)a); - this.EmitHuff(table, (runLength << 4) | bt); - this.Emit((uint)(b & ((1 << bt) - 1)), bt); + this.EmitHuff(table, (runLength << 4) | valueLen); + this.Emit((uint)b << (32 - valueLen), valueLen); } ///