Browse Source

Use nint

pull/2134/head
Brian Popow 4 years ago
parent
commit
98b96fe0a9
  1. 6
      src/ImageSharp/Common/Helpers/Numerics.cs
  2. 22
      src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs
  3. 10
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/ModifiedHuffmanTiffCompression.cs
  4. 10
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/T4TiffCompression.cs
  5. 12
      src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs

6
src/ImageSharp/Common/Helpers/Numerics.cs

@ -75,6 +75,12 @@ namespace SixLabors.ImageSharp
[MethodImpl(MethodImplOptions.AggressiveInlining)] [MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Modulo8(int x) => x & 7; public static int Modulo8(int x) => x & 7;
/// <summary>
/// Calculates <paramref name="x"/> % 8
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static nint Modulo8(nint x) => x & 7;
/// <summary> /// <summary>
/// Fast (x mod m) calculator, with the restriction that /// Fast (x mod m) calculator, with the restriction that
/// <paramref name="m"/> should be power of 2. /// <paramref name="m"/> should be power of 2.

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

@ -9,16 +9,16 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{ {
internal static class BitWriterUtils internal static class BitWriterUtils
{ {
public static void WriteBits(Span<byte> buffer, int pos, int count, byte value) public static void WriteBits(Span<byte> buffer, nint pos, nint count, byte value)
{ {
int bitPos = Numerics.Modulo8(pos); nint bitPos = Numerics.Modulo8(pos);
int bufferPos = pos / 8; nint bufferPos = pos / 8;
int startIdx = bufferPos + bitPos; nint startIdx = bufferPos + bitPos;
int endIdx = startIdx + count; nint endIdx = startIdx + count;
if (value == 1) if (value == 1)
{ {
for (int i = startIdx; i < endIdx; i++) for (nint i = startIdx; i < endIdx; i++)
{ {
WriteBit(buffer, bufferPos, bitPos); WriteBit(buffer, bufferPos, bitPos);
@ -32,7 +32,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
} }
else else
{ {
for (int i = startIdx; i < endIdx; i++) for (nint i = startIdx; i < endIdx; i++)
{ {
WriteZeroBit(buffer, bufferPos, bitPos); WriteZeroBit(buffer, bufferPos, bitPos);
@ -47,17 +47,17 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
} }
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public static void WriteBit(Span<byte> buffer, int bufferPos, int bitPos) public static void WriteBit(Span<byte> buffer, nint bufferPos, nint bitPos)
{ {
ref byte b = ref Unsafe.Add(ref MemoryMarshal.GetReference(buffer), bufferPos); ref byte b = ref Unsafe.Add(ref MemoryMarshal.GetReference(buffer), bufferPos);
b |= (byte)(1 << (7 - bitPos)); b |= (byte)(1 << (int)(7 - bitPos));
} }
[MethodImpl(InliningOptions.ShortMethod)] [MethodImpl(InliningOptions.ShortMethod)]
public static void WriteZeroBit(Span<byte> buffer, int bufferPos, int bitPos) public static void WriteZeroBit(Span<byte> buffer, nint bufferPos, nint bitPos)
{ {
ref byte b = ref Unsafe.Add(ref MemoryMarshal.GetReference(buffer), bufferPos); ref byte b = ref Unsafe.Add(ref MemoryMarshal.GetReference(buffer), bufferPos);
b = (byte)(b & ~(1 << (7 - bitPos))); b = (byte)(b & ~(1 << (int)(7 - bitPos)));
} }
} }
} }

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

@ -45,8 +45,8 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
var bitReader = new ModifiedHuffmanBitReader(stream, this.FillOrder, byteCount); var bitReader = new ModifiedHuffmanBitReader(stream, this.FillOrder, byteCount);
buffer.Clear(); buffer.Clear();
int bitsWritten = 0; nint bitsWritten = 0;
uint pixelsWritten = 0; nuint pixelsWritten = 0;
nint rowsWritten = 0; nint rowsWritten = 0;
while (bitReader.HasMoreData) while (bitReader.HasMoreData)
{ {
@ -67,13 +67,13 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
pixelsWritten += bitReader.RunLength; pixelsWritten += bitReader.RunLength;
} }
if (pixelsWritten == this.Width) if (pixelsWritten == (ulong)this.Width)
{ {
rowsWritten++; rowsWritten++;
pixelsWritten = 0; pixelsWritten = 0;
// Write padding bits, if necessary. // Write padding bits, if necessary.
int pad = 8 - Numerics.Modulo8(bitsWritten); nint pad = 8 - Numerics.Modulo8(bitsWritten);
if (pad != 8) if (pad != 8)
{ {
BitWriterUtils.WriteBits(buffer, bitsWritten, pad, 0); BitWriterUtils.WriteBits(buffer, bitsWritten, pad, 0);
@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
bitReader.StartNewRow(); bitReader.StartNewRow();
} }
if (pixelsWritten > this.Width) if (pixelsWritten > (ulong)this.Width)
{ {
TiffThrowHelper.ThrowImageFormatException("ccitt compression parsing error, decoded more pixels then image width"); TiffThrowHelper.ThrowImageFormatException("ccitt compression parsing error, decoded more pixels then image width");
} }

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

@ -64,8 +64,8 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
var bitReader = new T4BitReader(stream, this.FillOrder, byteCount, eolPadding); var bitReader = new T4BitReader(stream, this.FillOrder, byteCount, eolPadding);
buffer.Clear(); buffer.Clear();
int bitsWritten = 0; nint bitsWritten = 0;
uint pixelsWritten = 0; nuint pixelsWritten = 0;
nint rowsWritten = 0; nint rowsWritten = 0;
while (bitReader.HasMoreData) while (bitReader.HasMoreData)
{ {
@ -82,7 +82,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
if (bitReader.IsEndOfScanLine) if (bitReader.IsEndOfScanLine)
{ {
// Write padding bytes, if necessary. // Write padding bytes, if necessary.
int pad = 8 - Numerics.Modulo8(bitsWritten); nint pad = 8 - Numerics.Modulo8(bitsWritten);
if (pad != 8) if (pad != 8)
{ {
BitWriterUtils.WriteBits(buffer, bitsWritten, pad, 0); BitWriterUtils.WriteBits(buffer, bitsWritten, pad, 0);
@ -100,14 +100,14 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
} }
// Edge case for when we are at the last byte, but there are still some unwritten pixels left. // Edge case for when we are at the last byte, but there are still some unwritten pixels left.
if (pixelsWritten > 0 && pixelsWritten < this.width) if (pixelsWritten > 0 && pixelsWritten < (ulong)this.width)
{ {
bitReader.ReadNextRun(); bitReader.ReadNextRun();
this.WritePixelRun(buffer, bitReader, bitsWritten); this.WritePixelRun(buffer, bitReader, bitsWritten);
} }
} }
private void WritePixelRun(Span<byte> buffer, T4BitReader bitReader, int bitsWritten) private void WritePixelRun(Span<byte> buffer, T4BitReader bitReader, nint bitsWritten)
{ {
if (bitReader.IsWhiteRun) if (bitReader.IsWhiteRun)
{ {

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

@ -60,7 +60,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
var bitReader = new T6BitReader(stream, this.FillOrder, byteCount); var bitReader = new T6BitReader(stream, this.FillOrder, byteCount);
var referenceScanLine = new CcittReferenceScanline(this.isWhiteZero, this.width); var referenceScanLine = new CcittReferenceScanline(this.isWhiteZero, this.width);
int bitsWritten = 0; nint 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 int WriteScanLine(Span<byte> buffer, Span<byte> scanLine, int bitsWritten) private nint WriteScanLine(Span<byte> buffer, Span<byte> scanLine, nint bitsWritten)
{ {
int bitPos = Numerics.Modulo8(bitsWritten); nint bitPos = Numerics.Modulo8(bitsWritten);
int bufferPos = bitsWritten / 8; nint 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,10 +95,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
} }
// Write padding bytes, if necessary. // Write padding bytes, if necessary.
int remainder = bitsWritten % 8; nint remainder = Numerics.Modulo8(bitsWritten);
if (remainder != 0) if (remainder != 0)
{ {
int padding = 8 - remainder; nint padding = 8 - remainder;
BitWriterUtils.WriteBits(buffer, bitsWritten, padding, 0); BitWriterUtils.WriteBits(buffer, bitsWritten, padding, 0);
bitsWritten += padding; bitsWritten += padding;
} }

Loading…
Cancel
Save