diff --git a/src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs b/src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs index c78862d86..7394577a5 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/BitWriterUtils.cs @@ -3,6 +3,7 @@ using System; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; namespace SixLabors.ImageSharp.Formats.Tiff.Compression { @@ -46,9 +47,17 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression } [MethodImpl(InliningOptions.ShortMethod)] - public static void WriteBit(Span buffer, int bufferPos, int bitPos) => buffer[bufferPos] |= (byte)(1 << (7 - bitPos)); + public static void WriteBit(Span buffer, int bufferPos, int bitPos) + { + ref byte b = ref Unsafe.Add(ref MemoryMarshal.GetReference(buffer), bufferPos); + b |= (byte)(1 << (7 - bitPos)); + } [MethodImpl(InliningOptions.ShortMethod)] - public static void WriteZeroBit(Span buffer, int bufferPos, int bitPos) => buffer[bufferPos] = (byte)(buffer[bufferPos] & ~(1 << (7 - bitPos))); + public static void WriteZeroBit(Span buffer, int bufferPos, int bitPos) + { + ref byte b = ref Unsafe.Add(ref MemoryMarshal.GetReference(buffer), bufferPos); + b = (byte)(b & ~(1 << (7 - bitPos))); + } } } diff --git a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs index c769d4d68..1ce7f02d1 100644 --- a/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs +++ b/src/ImageSharp/Formats/Tiff/Compression/Decompressors/T6TiffCompression.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using SixLabors.ImageSharp.Formats.Tiff.Constants; using SixLabors.ImageSharp.IO; using SixLabors.ImageSharp.Memory; @@ -75,7 +77,7 @@ namespace SixLabors.ImageSharp.Formats.Tiff.Compression.Decompressors int bufferPos = (int)(bitsWritten / 8); for (int i = 0; i < scanLine.Length; i++) { - if (scanLine[i] == white) + if (Unsafe.Add(ref MemoryMarshal.GetReference(scanLine), i) == white) { BitWriterUtils.WriteZeroBit(buffer, bufferPos, bitPos); }