From 3da0b5cdc95891b7a4101bebd5a9219570373e8d Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Thu, 5 Dec 2019 21:19:03 +0100 Subject: [PATCH] Fix issue with creating huffman tables --- src/ImageSharp/Formats/WebP/HuffmanUtils.cs | 5 +++-- src/ImageSharp/Formats/WebP/WebPLosslessDecoder.cs | 8 +++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/ImageSharp/Formats/WebP/HuffmanUtils.cs b/src/ImageSharp/Formats/WebP/HuffmanUtils.cs index 5ae3d4e67a..f079dcddd3 100644 --- a/src/ImageSharp/Formats/WebP/HuffmanUtils.cs +++ b/src/ImageSharp/Formats/WebP/HuffmanUtils.cs @@ -114,6 +114,8 @@ namespace SixLabors.ImageSharp.Formats.WebP } // Fill in 2nd level tables and add pointers to root table. + Span tableSpan = table; + int tablePos = 0; for (len = rootBits + 1, step = 2; len <= WebPConstants.MaxAllowedCodeLength; ++len, step <<= 1) { numOpen <<= 1; @@ -124,8 +126,6 @@ namespace SixLabors.ImageSharp.Formats.WebP return 0; } - Span tableSpan = table; - int tablePos = 0; for (; count[len] > 0; --count[len]) { if ((key & mask) != low) @@ -136,6 +136,7 @@ namespace SixLabors.ImageSharp.Formats.WebP tableSize = 1 << tableBits; totalSize += tableSize; low = key & mask; + uint v = (uint)(tablePos - low); table[low] = new HuffmanCode { BitsUsed = tableBits + rootBits, diff --git a/src/ImageSharp/Formats/WebP/WebPLosslessDecoder.cs b/src/ImageSharp/Formats/WebP/WebPLosslessDecoder.cs index 152efed1f1..b5cc4fb907 100644 --- a/src/ImageSharp/Formats/WebP/WebPLosslessDecoder.cs +++ b/src/ImageSharp/Formats/WebP/WebPLosslessDecoder.cs @@ -334,6 +334,8 @@ namespace SixLabors.ImageSharp.Formats.WebP numHTreeGroups = numHTreeGroupsMax; metadata.HuffmanImage = huffmanImage; + metadata.HuffmanXSize = this.SubSampleSize(huffmanXSize, metadata.HuffmanSubSampleBits); + metadata.HuffmanMask = (metadata.HuffmanSubSampleBits == 0) ? ~0 : (1 << metadata.HuffmanSubSampleBits) - 1; } // Find maximum alphabet size for the hTree group. @@ -625,13 +627,13 @@ namespace SixLabors.ImageSharp.Formats.WebP /// private uint ReadSymbol(Span table) { - ulong val = this.bitReader.PrefetchBits(); + uint val = (uint)this.bitReader.PrefetchBits(); Span tableSpan = table.Slice((int)(val & HuffmanUtils.HuffmanTableMask)); int nBits = tableSpan[0].BitsUsed - HuffmanUtils.HuffmanTableBits; if (nBits > 0) { this.bitReader.AdvanceBitPosition(HuffmanUtils.HuffmanTableBits); - val = this.bitReader.PrefetchBits(); + val = (uint)this.bitReader.PrefetchBits(); tableSpan = tableSpan.Slice((int)tableSpan[0].Value); tableSpan = tableSpan.Slice((int)val & ((1 << nBits) - 1)); } @@ -659,7 +661,7 @@ namespace SixLabors.ImageSharp.Formats.WebP private void CopyBlock(uint[] pixelData, int decodedPixels, int dist, int length) { - if (dist > length) + if (dist >= length) { Span src = pixelData.AsSpan(decodedPixels - dist, length); Span dest = pixelData.AsSpan(decodedPixels);