From 07d2e79c384a45eb9dc26b658a6e1e80ea264713 Mon Sep 17 00:00:00 2001 From: Brian Popow Date: Sun, 29 May 2022 17:15:28 +0200 Subject: [PATCH] Avoid more bounds checks --- .../Formats/Tiff/Compression/BitWriterUtils.cs | 13 +++++++++++-- .../Compression/Decompressors/T6TiffCompression.cs | 4 +++- 2 files changed, 14 insertions(+), 3 deletions(-) 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); }