diff --git a/src/ImageSharp/Advanced/ImageExtensions.cs b/src/ImageSharp/Advanced/ImageExtensions.cs index fa299f8111..63a66de832 100644 --- a/src/ImageSharp/Advanced/ImageExtensions.cs +++ b/src/ImageSharp/Advanced/ImageExtensions.cs @@ -13,26 +13,24 @@ namespace SixLabors.ImageSharp.Advanced internal static class ImageExtensions { /// - /// Gets a reference to the pixel at the specified position. + /// Returns a reference to the 0th element of the Pixel buffer. + /// Such a reference can be used for pinning but must never be dereferenced. /// /// The source image frame - /// The x coordinate (row) - /// The y coordinate (position at row) - /// A reference to the element. - public static ref TPixel GetPixelReference(this ImageFrame source, int x, int y) + /// A pinnable reference the first root of the pixel buffer. + public static ref TPixel DangerousGetPinnableReferenceToPixelBuffer(this ImageFrame source) where TPixel : struct, IPixel - => ref GetPixelReference((IPixelSource)source, x, y); + => ref DangerousGetPinnableReferenceToPixelBuffer((IPixelSource)source); /// - /// Gets a reference to the pixel at the specified position. + /// Returns a reference to the 0th element of the Pixel buffer. + /// Such a reference can be used for pinning but must never be dereferenced. /// - /// The source image frame - /// The x coordinate (row) - /// The y coordinate (position at row) - /// A reference to the element. - public static ref TPixel GetPixelReference(this Image source, int x, int y) + /// The source image + /// A pinnable reference the first root of the pixel buffer. + public static ref TPixel DangerousGetPinnableReferenceToPixelBuffer(this Image source) where TPixel : struct, IPixel - => ref source.Frames.RootFrame.GetPixelReference(x, y); + => ref source.Frames.RootFrame.DangerousGetPinnableReferenceToPixelBuffer(); /// /// Gets the representation of the pixels as an area of contiguous memory in the given pixel format. @@ -131,14 +129,13 @@ namespace SixLabors.ImageSharp.Advanced => source?.Configuration ?? Configuration.Default; /// - /// Gets a reference to the pixel at the specified position. + /// Returns a reference to the 0th element of the Pixel buffer. + /// Such a reference can be used for pinning but must never be dereferenced. /// /// The source image frame - /// The x coordinate (row) - /// The y coordinate (position at row) /// A reference to the element. - private static ref TPixel GetPixelReference(IPixelSource source, int x, int y) + private static ref TPixel DangerousGetPinnableReferenceToPixelBuffer(IPixelSource source) where TPixel : struct, IPixel - => ref source.PixelBuffer[x, y]; + => ref source.PixelBuffer.Span.DangerousGetPinnableReference(); } }