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. // 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) for (len = rootBits + 1, step = 2; len <= WebPConstants.MaxAllowedCodeLength; ++len, step <<= 1)
{ {
numOpen <<= 1; numOpen <<= 1;
@ -124,8 +126,6 @@ namespace SixLabors.ImageSharp.Formats.WebP
return 0; return 0;
} }
Span<HuffmanCode> tableSpan = table;
int tablePos = 0;
for (; count[len] > 0; --count[len]) for (; count[len] > 0; --count[len])
{ {
if ((key & mask) != low) if ((key & mask) != low)
@ -136,6 +136,7 @@ namespace SixLabors.ImageSharp.Formats.WebP
tableSize = 1 << tableBits; tableSize = 1 << tableBits;
totalSize += tableSize; totalSize += tableSize;
low = key & mask; low = key & mask;
uint v = (uint)(tablePos - low);
table[low] = new HuffmanCode table[low] = new HuffmanCode
{ {
BitsUsed = tableBits + rootBits, BitsUsed = tableBits + rootBits,

8
src/ImageSharp/Formats/WebP/WebPLosslessDecoder.cs

@ -334,6 +334,8 @@ namespace SixLabors.ImageSharp.Formats.WebP
numHTreeGroups = numHTreeGroupsMax; numHTreeGroups = numHTreeGroupsMax;
metadata.HuffmanImage = huffmanImage; 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. // Find maximum alphabet size for the hTree group.
@ -625,13 +627,13 @@ namespace SixLabors.ImageSharp.Formats.WebP
/// </summary> /// </summary>
private uint ReadSymbol(Span<HuffmanCode> table) 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)); Span<HuffmanCode> tableSpan = table.Slice((int)(val & HuffmanUtils.HuffmanTableMask));
int nBits = tableSpan[0].BitsUsed - HuffmanUtils.HuffmanTableBits; int nBits = tableSpan[0].BitsUsed - HuffmanUtils.HuffmanTableBits;
if (nBits > 0) if (nBits > 0)
{ {
this.bitReader.AdvanceBitPosition(HuffmanUtils.HuffmanTableBits); 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)tableSpan[0].Value);
tableSpan = tableSpan.Slice((int)val & ((1 << nBits) - 1)); 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) 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> src = pixelData.AsSpan(decodedPixels - dist, length);
Span<uint> dest = pixelData.AsSpan(decodedPixels); Span<uint> dest = pixelData.AsSpan(decodedPixels);

Loading…
Cancel
Save