From 64a6c4b3c0e0b38f749caec51a5f2d778e4b7247 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Wed, 18 Apr 2018 17:17:47 -0700 Subject: [PATCH] Spanify huffman table --- .../PdfJsPort/Components/PdfJsHuffmanTable.cs | 22 +++++++++---------- .../Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs | 6 ++--- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsHuffmanTable.cs b/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsHuffmanTable.cs index 62ae34335e..875a862638 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsHuffmanTable.cs +++ b/src/ImageSharp/Formats/Jpeg/PdfJsPort/Components/PdfJsHuffmanTable.cs @@ -40,7 +40,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components /// The to use for buffer allocations. /// The code lengths /// The huffman values - public PdfJsHuffmanTable(MemoryManager memoryManager, byte[] lengths, byte[] values) + public PdfJsHuffmanTable(MemoryManager memoryManager, ReadOnlySpan lengths, ReadOnlySpan values) { const int length = 257; using (IBuffer huffsize = memoryManager.Allocate(length)) @@ -57,10 +57,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components fixed (byte* huffValRef = this.HuffVal.Data) { - for (int i = 0; i < values.Length; i++) - { - huffValRef[i] = values[i]; - } + var huffValSpan = new Span(huffValRef, 256); + + values.CopyTo(huffValSpan); } } @@ -69,7 +68,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components /// /// The code lengths /// The huffman size span ref - private static void GenerateSizeTable(byte[] lengths, ref short huffsizeRef) + private static void GenerateSizeTable(ReadOnlySpan lengths, ref short huffsizeRef) { short index = 0; for (short l = 1; l <= 16; l++) @@ -115,7 +114,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components /// /// The code lengths /// The huffman code span ref - private void GenerateDecoderTables(byte[] lengths, ref short huffcodeRef) + private void GenerateDecoderTables(ReadOnlySpan lengths, ref short huffcodeRef) { fixed (short* valOffsetRef = this.ValOffset.Data) fixed (long* maxcodeRef = this.MaxCode.Data) @@ -147,7 +146,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components /// The code lengths /// The huffman value array /// The huffman code span ref - private void GenerateLookaheadTables(byte[] lengths, byte[] huffval, ref short huffcodeRef) + private void GenerateLookaheadTables(ReadOnlySpan lengths, ReadOnlySpan huffval, ref short huffcodeRef) { // TODO: This generation code matches the libJpeg code but the lookahead table is not actually used yet. // To use it we need to implement fast lookup path in PdfJsScanDecoder.DecodeHuffman @@ -155,10 +154,9 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort.Components // will be 8 or fewer bits long and can be handled without looping. fixed (short* lookaheadRef = this.Lookahead.Data) { - for (int i = 0; i < 256; i++) - { - lookaheadRef[i] = 2034; // 9 << 8; - } + var lookaheadSpan = new Span(lookaheadRef, 256); + + lookaheadSpan.Fill(2034); // 9 << 8; int p = 0; for (int l = 1; l <= 8; l++) diff --git a/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs index 336c61699d..ae780ce626 100644 --- a/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/PdfJsPort/PdfJsJpegDecoderCore.cs @@ -700,8 +700,8 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort this.BuildHuffmanTable( huffmanTableSpec >> 4 == 0 ? this.dcHuffmanTables : this.acHuffmanTables, huffmanTableSpec & 15, - codeLengths.Array, - huffmanValues.Array); + codeLengths.Span, + huffmanValues.Span); } } } @@ -785,7 +785,7 @@ namespace SixLabors.ImageSharp.Formats.Jpeg.PdfJsPort /// The codelengths /// The values [MethodImpl(MethodImplOptions.AggressiveInlining)] - private void BuildHuffmanTable(PdfJsHuffmanTables tables, int index, byte[] codeLengths, byte[] values) + private void BuildHuffmanTable(PdfJsHuffmanTables tables, int index, ReadOnlySpan codeLengths, ReadOnlySpan values) { tables[index] = new PdfJsHuffmanTable(this.configuration.MemoryManager, codeLengths, values); }