Browse Source

Handle edge case when we are at the last byte position, but not all pixels have been written

pull/1725/head
Brian Popow 5 years ago
parent
commit
eb63882d4e
  1. 40
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/T4TiffCompression.cs

40
src/ImageSharp/Formats/Tiff/Compression/Decompressors/T4TiffCompression.cs

@ -20,6 +20,8 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
private readonly byte blackValue; private readonly byte blackValue;
private readonly int width;
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="T4TiffCompression" /> class. /// Initializes a new instance of the <see cref="T4TiffCompression" /> class.
/// </summary> /// </summary>
@ -34,7 +36,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
{ {
this.faxCompressionOptions = faxOptions; this.faxCompressionOptions = faxOptions;
this.FillOrder = fillOrder; this.FillOrder = fillOrder;
this.width = width;
bool isWhiteZero = photometricInterpretation == TiffPhotometricInterpretation.WhiteIsZero; bool isWhiteZero = photometricInterpretation == TiffPhotometricInterpretation.WhiteIsZero;
this.whiteValue = (byte)(isWhiteZero ? 0 : 1); this.whiteValue = (byte)(isWhiteZero ? 0 : 1);
this.blackValue = (byte)(isWhiteZero ? 1 : 0); this.blackValue = (byte)(isWhiteZero ? 1 : 0);
@ -58,22 +60,17 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
buffer.Clear(); buffer.Clear();
uint bitsWritten = 0; uint bitsWritten = 0;
uint pixelWritten = 0;
while (bitReader.HasMoreData) while (bitReader.HasMoreData)
{ {
bitReader.ReadNextRun(); bitReader.ReadNextRun();
if (bitReader.RunLength > 0) if (bitReader.RunLength > 0)
{ {
if (bitReader.IsWhiteRun) this.WritePixelRun(buffer, bitReader, bitsWritten);
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.whiteValue); bitsWritten += bitReader.RunLength;
bitsWritten += bitReader.RunLength; pixelWritten += bitReader.RunLength;
}
else
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.blackValue);
bitsWritten += bitReader.RunLength;
}
} }
if (bitReader.IsEndOfScanLine) if (bitReader.IsEndOfScanLine)
@ -85,8 +82,29 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, pad, 0); BitWriterUtils.WriteBits(buffer, (int)bitsWritten, pad, 0);
bitsWritten += pad; bitsWritten += pad;
} }
pixelWritten = 0;
} }
} }
// Edge case for when we are at the last byte, but there are still some unwritten pixels left.
if (pixelWritten > 0 && pixelWritten < this.width)
{
bitReader.ReadNextRun();
this.WritePixelRun(buffer, bitReader, bitsWritten);
}
}
private void WritePixelRun(Span<byte> buffer, T4BitReader bitReader, uint bitsWritten)
{
if (bitReader.IsWhiteRun)
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.whiteValue);
}
else
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.blackValue);
}
} }
/// <inheritdoc/> /// <inheritdoc/>

Loading…
Cancel
Save