diff --git a/src/ImageSharp/Common/Helpers/Numerics.cs b/src/ImageSharp/Common/Helpers/Numerics.cs
index bfbaa1b31c..301bef297f 100644
--- a/src/ImageSharp/Common/Helpers/Numerics.cs
+++ b/src/ImageSharp/Common/Helpers/Numerics.cs
@@ -75,6 +75,12 @@ namespace SixLabors.ImageSharp
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Modulo8(int x) => x & 7;
+ ///
+ /// Calculates % 8
+ ///
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static nint Modulo8(nint x) => x & 7;
+
///
/// Fast (x mod m) calculator, with the restriction that
/// should be power of 2.
diff --git a/src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs b/src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs
index 2a9efa59bb..37e2a6efcb 100644
--- a/src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs
+++ b/src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs
@@ -9,16 +9,16 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
{
internal static class BitWriterUtils
{
- public static void WriteBits(Span buffer, int pos, int count, byte value)
+ public static void WriteBits(Span buffer, nint pos, nint count, byte value)
{
- int bitPos = Numerics.Modulo8(pos);
- int bufferPos = pos / 8;
- int startIdx = bufferPos + bitPos;
- int endIdx = startIdx + count;
+ nint bitPos = Numerics.Modulo8(pos);
+ nint bufferPos = pos / 8;
+ nint startIdx = bufferPos + bitPos;
+ nint endIdx = startIdx + count;
if (value == 1)
{
- for (int i = startIdx; i < endIdx; i++)
+ for (nint i = startIdx; i < endIdx; i++)
{
WriteBit(buffer, bufferPos, bitPos);
@@ -32,7 +32,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
}
else
{
- for (int i = startIdx; i < endIdx; i++)
+ for (nint i = startIdx; i < endIdx; i++)
{
WriteZeroBit(buffer, bufferPos, bitPos);
@@ -47,17 +47,17 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression
}
[MethodImpl(InliningOptions.ShortMethod)]
- public static void WriteBit(Span buffer, int bufferPos, int bitPos)
+ public static void WriteBit(Span buffer, nint bufferPos, nint bitPos)
{
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)]
- public static void WriteZeroBit(Span buffer, int bufferPos, int bitPos)
+ public static void WriteZeroBit(Span buffer, nint bufferPos, nint bitPos)
{
ref byte b = ref Unsafe.Add(ref MemoryMarshal.GetReference(buffer), bufferPos);
- b = (byte)(b & ~(1 << (7 - bitPos)));
+ b = (byte)(b & ~(1 << (int)(7 - bitPos)));
}
}
}
diff --git a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/ModifiedHuffmanTiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/ModifiedHuffmanTiffCompression.cs
index 4ec989742c..54c94525c5 100644
--- a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/ModifiedHuffmanTiffCompression.cs
+++ b/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);
buffer.Clear();
- int bitsWritten = 0;
- uint pixelsWritten = 0;
+ nint bitsWritten = 0;
+ nuint pixelsWritten = 0;
nint rowsWritten = 0;
while (bitReader.HasMoreData)
{
@@ -67,13 +67,13 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
pixelsWritten += bitReader.RunLength;
}
- if (pixelsWritten == this.Width)
+ if (pixelsWritten == (ulong)this.Width)
{
rowsWritten++;
pixelsWritten = 0;
// Write padding bits, if necessary.
- int pad = 8 - Numerics.Modulo8(bitsWritten);
+ nint pad = 8 - Numerics.Modulo8(bitsWritten);
if (pad != 8)
{
BitWriterUtils.WriteBits(buffer, bitsWritten, pad, 0);
@@ -88,7 +88,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
bitReader.StartNewRow();
}
- if (pixelsWritten > this.Width)
+ if (pixelsWritten > (ulong)this.Width)
{
TiffThrowHelper.ThrowImageFormatException("ccitt compression parsing error, decoded more pixels then image width");
}
diff --git a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T4TiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T4TiffCompression.cs
index 254cb2ab02..7b59e71173 100644
--- a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T4TiffCompression.cs
+++ b/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);
buffer.Clear();
- int bitsWritten = 0;
- uint pixelsWritten = 0;
+ nint bitsWritten = 0;
+ nuint pixelsWritten = 0;
nint rowsWritten = 0;
while (bitReader.HasMoreData)
{
@@ -82,7 +82,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
if (bitReader.IsEndOfScanLine)
{
// Write padding bytes, if necessary.
- int pad = 8 - Numerics.Modulo8(bitsWritten);
+ nint pad = 8 - Numerics.Modulo8(bitsWritten);
if (pad != 8)
{
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.
- if (pixelsWritten > 0 && pixelsWritten < this.width)
+ if (pixelsWritten > 0 && pixelsWritten < (ulong)this.width)
{
bitReader.ReadNextRun();
this.WritePixelRun(buffer, bitReader, bitsWritten);
}
}
- private void WritePixelRun(Span buffer, T4BitReader bitReader, int bitsWritten)
+ private void WritePixelRun(Span buffer, T4BitReader bitReader, nint bitsWritten)
{
if (bitReader.IsWhiteRun)
{
diff --git a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs
index 495fba0370..890eecbffd 100644
--- a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs
+++ b/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 referenceScanLine = new CcittReferenceScanline(this.isWhiteZero, this.width);
- int bitsWritten = 0;
+ nint bitsWritten = 0;
for (int y = 0; y < height; y++)
{
scanLine.Clear();
@@ -73,10 +73,10 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors
}
}
- private int WriteScanLine(Span buffer, Span scanLine, int bitsWritten)
+ private nint WriteScanLine(Span buffer, Span scanLine, nint bitsWritten)
{
- int bitPos = Numerics.Modulo8(bitsWritten);
- int bufferPos = bitsWritten / 8;
+ nint bitPos = Numerics.Modulo8(bitsWritten);
+ nint bufferPos = bitsWritten / 8;
for (nint i = 0; i < scanLine.Length; i++)
{
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.
- int remainder = bitsWritten % 8;
+ nint remainder = Numerics.Modulo8(bitsWritten);
if (remainder != 0)
{
- int padding = 8 - remainder;
+ nint padding = 8 - remainder;
BitWriterUtils.WriteBits(buffer, bitsWritten, padding, 0);
bitsWritten += padding;
}