Browse Source

Use Numerics.Modulo8

pull/2134/head
Brian Popow 4 years ago
parent
commit
f0f08e83b4
  1. 6
      src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs
  2. 12
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/ModifiedHuffmanTiffCompression.cs
  3. 6
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/T4TiffCompression.cs
  4. 14
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs

6
src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs

@ -9,12 +9,12 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{
internal static class BitWriterUtils
{
public static void WriteBits(Span<byte> buffer, int pos, uint count, byte value)
public static void WriteBits(Span<byte> buffer, int pos, int count, byte value)
{
int bitPos = pos % 8;
int bitPos = Numerics.Modulo8(pos);
int bufferPos = pos / 8;
int startIdx = bufferPos + bitPos;
int endIdx = (int)(startIdx + count);
int endIdx = startIdx + count;
if (value == 1)
{

12
src/ImageSharp/Formats/Tiff/Compression/Decompressors/ModifiedHuffmanTiffCompression.cs

@ -45,7 +45,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
using var bitReader = new ModifiedHuffmanBitReader(stream, this.FillOrder, byteCount, this.Allocator);
buffer.Clear();
uint bitsWritten = 0;
int bitsWritten = 0;
uint pixelsWritten = 0;
while (bitReader.HasMoreData)
{
@ -55,14 +55,14 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
{
if (bitReader.IsWhiteRun)
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.whiteValue);
BitWriterUtils.WriteBits(buffer, bitsWritten, (int)bitReader.RunLength, this.whiteValue);
}
else
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.blackValue);
BitWriterUtils.WriteBits(buffer, bitsWritten, (int)bitReader.RunLength, this.blackValue);
}
bitsWritten += bitReader.RunLength;
bitsWritten += (int)bitReader.RunLength;
pixelsWritten += bitReader.RunLength;
}
@ -72,10 +72,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
pixelsWritten = 0;
// Write padding bits, if necessary.
uint pad = 8 - (bitsWritten % 8);
int pad = 8 - Numerics.Modulo8(bitsWritten);
if (pad != 8)
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, pad, 0);
BitWriterUtils.WriteBits(buffer, bitsWritten, pad, 0);
bitsWritten += pad;
}
}

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

@ -84,7 +84,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
uint pad = 8 - (bitsWritten % 8);
if (pad != 8)
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, pad, 0);
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, (int)pad, 0);
bitsWritten += pad;
}
@ -104,11 +104,11 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
{
if (bitReader.IsWhiteRun)
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.whiteValue);
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, (int)bitReader.RunLength, this.whiteValue);
}
else
{
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.blackValue);
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, (int)bitReader.RunLength, this.blackValue);
}
}

14
src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs

@ -60,7 +60,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
using var bitReader = new T6BitReader(stream, this.FillOrder, byteCount, this.Allocator);
var referenceScanLine = new CcittReferenceScanline(this.isWhiteZero, this.width);
uint bitsWritten = 0;
int bitsWritten = 0;
for (int y = 0; y < height; y++)
{
scanLine.Clear();
@ -73,10 +73,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
}
}
private uint WriteScanLine(Span<byte> buffer, Span<byte> scanLine, uint bitsWritten)
private int WriteScanLine(Span<byte> buffer, Span<byte> scanLine, int bitsWritten)
{
int bitPos = (int)(bitsWritten % 8);
int bufferPos = (int)(bitsWritten / 8);
int bitPos = Numerics.Modulo8(bitsWritten);
int bufferPos = bitsWritten / 8;
for (nint i = 0; i < scanLine.Length; i++)
{
if (Unsafe.Add(ref MemoryMarshal.GetReference(scanLine), i) != this.white)
@ -95,11 +95,11 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
}
// Write padding bytes, if necessary.
uint remainder = bitsWritten % 8;
int remainder = bitsWritten % 8;
if (remainder != 0)
{
uint padding = 8 - remainder;
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, padding, 0);
int padding = 8 - remainder;
BitWriterUtils.WriteBits(buffer, bitsWritten, padding, 0);
bitsWritten += padding;
}

Loading…
Cancel
Save