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 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 bufferPos = pos / 8;
int startIdx = bufferPos + bitPos; int startIdx = bufferPos + bitPos;
int endIdx = (int)(startIdx + count); int endIdx = startIdx + count;
if (value == 1) 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); using var bitReader = new ModifiedHuffmanBitReader(stream, this.FillOrder, byteCount, this.Allocator);
buffer.Clear(); buffer.Clear();
uint bitsWritten = 0; int bitsWritten = 0;
uint pixelsWritten = 0; uint pixelsWritten = 0;
while (bitReader.HasMoreData) while (bitReader.HasMoreData)
{ {
@ -55,14 +55,14 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
{ {
if (bitReader.IsWhiteRun) if (bitReader.IsWhiteRun)
{ {
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.whiteValue); BitWriterUtils.WriteBits(buffer, bitsWritten, (int)bitReader.RunLength, this.whiteValue);
} }
else 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; pixelsWritten += bitReader.RunLength;
} }
@ -72,10 +72,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
pixelsWritten = 0; pixelsWritten = 0;
// Write padding bits, if necessary. // Write padding bits, if necessary.
uint pad = 8 - (bitsWritten % 8); int pad = 8 - Numerics.Modulo8(bitsWritten);
if (pad != 8) if (pad != 8)
{ {
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, pad, 0); BitWriterUtils.WriteBits(buffer, bitsWritten, pad, 0);
bitsWritten += pad; 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); uint pad = 8 - (bitsWritten % 8);
if (pad != 8) if (pad != 8)
{ {
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, pad, 0); BitWriterUtils.WriteBits(buffer, (int)bitsWritten, (int)pad, 0);
bitsWritten += pad; bitsWritten += pad;
} }
@ -104,11 +104,11 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
{ {
if (bitReader.IsWhiteRun) if (bitReader.IsWhiteRun)
{ {
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, bitReader.RunLength, this.whiteValue); BitWriterUtils.WriteBits(buffer, (int)bitsWritten, (int)bitReader.RunLength, this.whiteValue);
} }
else 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); using var bitReader = new T6BitReader(stream, this.FillOrder, byteCount, this.Allocator);
var referenceScanLine = new CcittReferenceScanline(this.isWhiteZero, this.width); var referenceScanLine = new CcittReferenceScanline(this.isWhiteZero, this.width);
uint bitsWritten = 0; int bitsWritten = 0;
for (int y = 0; y < height; y++) for (int y = 0; y < height; y++)
{ {
scanLine.Clear(); 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 bitPos = Numerics.Modulo8(bitsWritten);
int bufferPos = (int)(bitsWritten / 8); int bufferPos = bitsWritten / 8;
for (nint i = 0; i < scanLine.Length; i++) for (nint i = 0; i < scanLine.Length; i++)
{ {
if (Unsafe.Add(ref MemoryMarshal.GetReference(scanLine), i) != this.white) 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. // Write padding bytes, if necessary.
uint remainder = bitsWritten % 8; int remainder = bitsWritten % 8;
if (remainder != 0) if (remainder != 0)
{ {
uint padding = 8 - remainder; int padding = 8 - remainder;
BitWriterUtils.WriteBits(buffer, (int)bitsWritten, padding, 0); BitWriterUtils.WriteBits(buffer, bitsWritten, padding, 0);
bitsWritten += padding; bitsWritten += padding;
} }

Loading…
Cancel
Save