Browse Source

Fix issue with creating huffman tables

pull/1552/head
Brian Popow 7 years ago
parent
commit
3da0b5cdc9
  1. 5
      src/ImageSharp/Formats/WebP/HuffmanUtils.cs
  2. 8
      src/ImageSharp/Formats/WebP/WebPLosslessDecoder.cs

5
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<HuffmanCode> 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<HuffmanCode> 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,

8
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
/// </summary>
private uint ReadSymbol(Span<HuffmanCode> table)
{
ulong val = this.bitReader.PrefetchBits();
uint val = (uint)this.bitReader.PrefetchBits();
Span<HuffmanCode> 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<uint> src = pixelData.AsSpan(decodedPixels - dist, length);
Span<uint> dest = pixelData.AsSpan(decodedPixels);

Loading…
Cancel
Save